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

    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 으로 표현할 수 있다.

     

    'SQL' 카테고리의 다른 글

    (SQL 문법) DML (INSERT, UPDATE, DELETE)  (0) 2022.01.05
    (SQL 문법) 집합 연산  (0) 2022.01.05
    (SQL 문법) JOIN  (0) 2022.01.05
    (SQL 문법) SQL 함수 (그룹 함수)  (0) 2022.01.05
    (SQL 문법) SQL 함수 (단일행 함수)  (0) 2022.01.05

    댓글