-
[ 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번 실행된다.
잘못된 정보에 대한 지적은 언제나 환영입니다.
복습 끝!
'PROGRAMMING > SQL' 카테고리의 다른 글
데이터 모델링(ER다이어그램 ) (0) 2022.05.03 [ SQL ] 무결성 제약조건 (기본키, 고유키, 외래키, NOT NULL, CHECK) (0) 2022.05.02 [ SQL ] 오라클 다중행함수(그룹함수) 와 GROUP_BY절 (0) 2022.04.29 [ SQL ] ORACLE의 데이터 타입 (0) 2022.04.28 [ SQL ] JOIN (문제풀이와 포괄조인) (0) 2022.04.28