ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ SQL ] 집합연산자, 상호연관 서브쿼리
    PROGRAMMING/SQL 2022. 5. 10. 23:13

    하루입니다.

     

     


     

     

    오늘 공부할 건 집합연산자와 상호연관 서브쿼리.

     

     

    집합연산자

    • 한 번의 SQL문으로 결과가 나올 수 없을 때 사용한다.

     

    합집합

         SQL1 UNION SQL2         

          :  SQL1과 SQL2의 조회결과를 합한다. SQL1과 SQL2의 조회결과 중에서 중복된 행은 한번만 조회된다. (중복행 하나만 나옴)
          SQL1 UNION ALL SQL2   

          :  SQL1과 SQL2의 조회결과를 합한다. SQL1과 SQL2의 조회결과를 중복을 포함해서 조회한다. (중복행 모두 나옴)

     

    교집합

          SQL1 INTERSECT SQL2  

          :  SQL1과 SQL2의 조회결과에 모두 포함된 행만 조회한다.

     

    차집합

          SQL1 MINUS SQL2         

          :  SQL1의 조회결과에는 포함되어 있고, SQL2의 조회결과에는 포함되지 않는 행만 조회한다.

     

    주의사항

          SELECT문의 컬럼갯수, 컬럼별 데이터타입이 동일해야 한다.

    합집합 교집합 차집합

     

     

    예시

     

    1. 합집합

    • 급여를 3000 이하, 15000 이상으로 받는 사원을 조회하기 (중복 제거돼서 나온다)
    SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
    FROM EMPLOYEES
    WHERE SALARY <= 3000
    UNION
    SELECT EMPLOYEE_ID, FIRST_NAME, SALARY
    FROM EMPLOYEES
    WHERE SALARY >= 15000;

     

    2. 교집합

    • 직종이 변경된 적이 있는 사원의 아이디를 조회하기
    • JOB_HOSTORY와 EMPLOYEES에서 겹치는 EMPLOYEE_ID를 X로 놓고, X.EMPLOYEE_ID = Y.EMPLOYEE_ID로 ID와 이름을 구한다.
    SELECT Y.EMPLOYEE_ID, Y.FIRST_NAME
    FROM (SELECT EMPLOYEE_ID
            FROM JOB_HISTORY
            INTERSECT
            SELECT EMPLOYEE_ID
            FROM EMPLOYEES) X, EMPLOYEES Y
    WHERE X.EMPLOYEE_ID = Y.EMPLOYEE_ID;

     

    3. 차집합

    • 직종이 변경된 적이 없는 사원의 아이디를 조회하기
    • JOB_HOSTORY와 EMPLOYEES에서 겹치지 않는 EMPLOYEE_ID를 구한다.
    SELECT EMPLOYEE_ID
    FROM EMPLOYEES
    MINUS
    SELECT EMPLOYEE_ID
    FROM JOB_HISTORY;

     


     

     

    상호연관 서브쿼리

    • 서브쿼리 내부에서 메인쿼리의 컬럼을 사용할 때 상호연관 서브쿼리가 된다.
    • 상호연관 서브쿼리는 메인쿼리에서 처리되는 각 행에 대해서 한번씩 실행된다.
    • 메인쿼리의 결과로 나온 행이 10개면, 서브쿼리도 10번 실행된다. 
    SELECT MAIN.COLUMN, MAIN.COLUMN, ...
    FROM TABLE1 MAIN
    WHERE MAIN.COLUMN 연산자 (SELECT INNER.COLUMN
                             FROM TABLE2 INNER
                             WHERE INNER.COLUMN1 = MAIN.COLUMN1);

     

     

    서브쿼리와의 차이점

    • 서브쿼리
    • 서브쿼리 내부에서 메인쿼리의 컬럼을 사용하지 않으면 일반 서브쿼리다.
    • 서브쿼리가 메인쿼리보다 먼저 실행되고, 서브쿼리는 단 한번만 실행된다.
    SELECT OUTER.COLUMN, OUTER.COLUMN, ...
    FROM TABLE1 OUTER
    WHERE OUTER.COLUMN 연산자 (SELECT INNER.COLUMN
                              FROM TABLE2 INNER
                              WHERE INNER.COLUMN1 = 값);

     

     

    예시

    • 자신이 소속된 부서의 평균급여보다 급여를 적게 받은 직원의 아이디, 이름, 급여를 조회하기
    • 사실 이런 건 JOIN이나 서브쿼리 사용하는 게 훨 편하다(성능이 좋다). 지금은 데이터가 얼마 없어 이런 예시를 사용하는 것. 
    SELECT MAIN.EMPLOYEE_ID, MAIN.FIRST_NAME, MAIN.SALARY
    FROM EMPLOYEES MAIN -- 107개의 행
    WHERE MAIN.SALARY < (SELECT AVG(SUB.SALARY)
                         FROM EMPLOYEES SUB
                         WHERE SUB.DEPARTMENT_ID = MAIN.DEPARTMENT_ID);
                         			    -- 107번 실행된다.

     

     

     


     

     

     

    잘못된 정보에 대한 지적은 언제나 환영입니다. 

     

    복습 끝!

     

     

     

Designed by Tistory.