소품집

[SQL 활용] Subquery(서브쿼리) 본문

자격증/SQL

[SQL 활용] Subquery(서브쿼리)

sodayeong 2021. 3. 10. 02:13
728x90

Main Query와 Subquery

  • Subquery는 select 문 내에 다시 select문을 사용하는 이중 SQL 문이다.
  • Subquery의 형태는 **FROM 구에 SELECT문을 사용하는 인라인 뷰(VIEW)**와 **select 문에 subquery를 사용하는 스칼라 서브쿼리(Scala subquery)**등이 있다.
    • select * from (select rownum num, name from student) a where num<5;
    • from 구에 select 문을 사용하여 가상의 테이블을 만드는 효과를 얻을 수 있다.
  • where 구에 select 문을 사용하면 서브쿼리라고 한다.
    • select * from student where majorno = (select majorno from major where majorno = 10) ;
    • 서브쿼리 밖에 있는 select 문은메인쿼리(Main Query)이다.

단일 행 서브쿼리와 다중 행 서브쿼리

  • 서브쿼리는 반환하는 행 수 가 한 개인 것과 여러 개인 것에 따라서단일 행 서브쿼리다중 행 서브쿼리로 분류된다.
  • 단일 행 서브쿼리는 단 하나의 행만 반환하는 서브쿼리로비교 연산자(=, <, ≤, ≥, <>)를 사용해야 한다.
  • 다중 행 서브쿼리는 여러 개의 행을 반환하는 서브쿼리로IN, ANY, ALL, EXISTS를 사용해야 한다.

단일 행 Subquery

다중 행 Subquery

IN

  • IN은 반환되는 여러 개의 행 중에서 하나만 참이 되어도 참인 연산이다.
select ename, dname, sal
from emp, dept
where emp,deptno = dept.deptno
		and emp.empno
		IN (select empno from emp where sal > 20000);

ALL

  • 메인쿼리와 서브쿼리의 결과과 모두 동일하면 참이 된다.
  • DEPTNO가 20, 30 보다 작거나 같은 것을 조회한다.
select *
from emp
where deptno <= ALL(20,30); 

 

EXISTS

  • EXISTS는 서브쿼리로 어떤 데이터의 존재 여부를 확인하는 것이다.
  • 즉, EXISTS의 결과는 참과 거짓으로 반환된다.
  • 급여가 2000 이상 있으면 참이 반환되고, 없으면 거짓이 반환하는 쿼리를 작성해보자.
select ename, dname, sal
from emp, dept 
where emp.deptno = dept.deptno
and exists (select 1 from emp where sal>2000); 

 

스칼라 서브쿼리

  • 스칼라 서브쿼리는 반드시 한 행과 한 컬럼만 반환하는 서브쿼리이다.
  • 만약 여러 행이 반환되면 오류가 발생한다.
```sql
select ename as 'name', sal as 'salary', 
	(select avg(sal) from mp) as 'average'
from emp
where empno = 1000;
```

select empno, ename, job, sal,
		(select grade from salgrade where e.sal 
					between losal and hisal) as salgrade,deptno,
		(select dname from dept where e.deptno = dept.deptno) as dname
from emp e; 

 

연관(Correlated) Subquery

  • 연관 Subquery는 Subquery 내에서 Main Query 내의 칼럼을 사용하는 것을 말한다.
select *
from emp e1
where sal > (select min(sal) from emp e2 where e2.deptno = e1.deptno)
order by deptno, sal

select * from emp e1 where sal > (select min(sal) from emp e2 where e2.deptno = e1.deptno) order by deptno, sal

메인쿼리에 사용한 데이터를 서브쿼리에서 사용하고 서브쿼리의 결과 값을 다시 메인쿼리로 돌려주는 방식을 상호연관 서브쿼리라고 한다. 성능을 떨어뜨리는 원인이 될 수 있고, 사용빈도가 높지 않음.

728x90

'자격증 > SQL' 카테고리의 다른 글

[SQL 기본] DECODE와 CASE문  (0) 2021.03.11
[SQL 활용] WINDOW FUNCTION (윈도우 함수)  (0) 2021.03.10
[SQL 활용] 계층형 조회 (Connect by)  (0) 2021.03.10
[SQL] JOIN(조인)  (0) 2021.03.09
[SQL] 연산자 쓰임 및 우선순위  (0) 2021.03.09
Comments