SQL

(SQL 문법) 서브 쿼리 (단일행, 다중행)

choisanghyun 2022. 1. 5. 20:31
728x90

서브쿼리

단일행 서브쿼리

서브쿼리는 where이나 having 조건에서 테이블 내의 고유값을 비교하기 위해서 사용한다.

(ex. 'KING'보다 급여가 많은 사람을 출력하시오)

직접 테이블을 확인하여 KING의 급여를 본 다음 코딩을 해도 되지만,

select *
from emp
where sal > 5000

이런 식의 코드는 KING의 급여가 변동되는 경우에는 바람직하지 않다.

따라서 서브쿼리를 이용하여 유연한 코드를 작성해야한다.

select *
from emp
where sal>(select sal from emp where ename='KING');

괄호 안에 비교하고 싶은 값을 SELECT 형식으로 작성하면 된다.

select *
from emp
where sal>(select min(sal) from emp where deptno=20 group by deptno);

서브 쿼리는 이런 식으로 그룹함수를 SELECT 하여 사용할 수 도 있으며

select deptno, min(sal)
from emp
group by deptno
having min(sal)>(select min(sal) from emp where deptno=20 group by deptno);

HAVING 절을 활용해서 그룹함수끼리 비교도 가능하다.

 

다중행 서브쿼리

두 개 이상의 행을 반환하는 서브쿼리를 다중행 서브쿼리라고 한다.

SELECT MIN(sal)
FROM emp
GROUP BY deptno;

해당 쿼리는 두개이상의 행을 반환한다.

 

 

총 3개의 행을 반환하므로 이 다중 행 서브쿼리를 활용하여 연산을 하려면

IN, ANY, ALL과 같은 다중행 비교 연산자를 사용해야한다.

select *
from emp
where 
sal in (SELECT MIN(sal)
FROM emp
GROUP BY deptno);

 

IN은 반환된 세 개의 행 중 하나라도 일치하면 출력하는 연산자이다.

즉 SAL이 950 이거나 1100 이거나 1300인 사람들의 데이터가 출력될 것이다.

쉽게 이해하자면 where sal =950 or sal=1100 or sal=1300 으로 표현할 수 있다.

select *
from emp
where 
sal > ANY (SELECT MIN(sal)
FROM emp
GROUP BY deptno);

ANY는 부등호(=,!=,<,>,<=,>=)연산자가 앞에 존재해야 사용 가능하다.

ANY반환된 다중 행을 조건에 대입하여 하나라도 일치하면 출력하는 연산자이다.

(IN과 유사)(sal = any는 in과 같은 기능)

즉  sal >950 이거나 sal >1100 이거나 sal >1300인 사람들의 데이터가 출력될 것이다.

where sal >950 or sal >1100 or sal >1300 으로 표현할 수 있다.

select *
from emp
where 
sal > ALL (SELECT MIN(sal)
FROM emp
GROUP BY deptno);

ALL 또한 부등호(=,!=,<,>,<=,>=)연산자가 앞에 존재해야 사용 가능하다.

ALL반환된 다중 행을 조건에 대입했을때 모두 일치한 경우에만 출력하는 연산자이다.

즉 sal>950, sal>1100, sal>1300의 조건을 모두 만족시켜야한다 (결국 sal>최대값은 1300)

where sal >950 and sal>1100 and sal>1300 으로 표현할 수 있다.