SELECT 칼럼1, 칼럼2, ...
FROM 테이블1
집합연산자
SELECT 칼럼1, 칼럼2, ...
FROM 테이블2
[ORDER BY 정렬]
SELECT 1, 2
FROM DUAL
UNION
SELECT 3, 4
FROM DUAL;
SELECT 1, 2
FROM DUAL
UNION -- 중복을 제거한 합집합
SELECT 1, 2
FROM DUAL;
SELECT 1, 2
FROM DUAL
UNION ALL -- 중복을 그대로 조회하는 합집합
SELECT 1, 2
FROM DUAL;
--사원 테이블과 부서 테이블에 존재하는 모든 부서번호를 조회하기
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
UNION
SELECT DEPARTMENT_ID
FROM EMPLOYEES;
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
UNION ALL
SELECT DEPARTMENT_ID
FROM EMPLOYEES;
-- 사원 테이블과 부서 테이블에 모두 존재하는 부서번호 조회하기
-- (사원들이 근무 중인 부서번호만 조회하기)
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
INTERSECT
SELECT DEPARTMENT_ID
FROM EMPLOYEES;
-- 부서 테이블에 존재하지만 사원 테이블에 존재하지 않는 부서번호 조회하기
-- (유령부서 조회하기)
SELECT DEPARTMENT _ID
FROM DEPARTMENTS
MINUS
SELECT DEPARTMENT_ID
FROM EMPLOYEES;
WITH MY_SUBQUERY(N, TOTAL) AS ( -- N, TOTAL은 MY_SUBQUERY의 칼럼을 의미한다.
SELECT 1, 1 -- N=1, TOTAL=1을 의미하는 초기화 서브쿼리
FROM DUAL
UNION ALL
SELECT N + 1, TOTAL + (N + 1) -- N = N + 1, TOTAL = TOTAL + (N + 1) 방식으로 반복해서 처리되는 부분
FROM MY_SUBQUERY
WHERE N < 10
)
SELECT N, TOTAL FROM MY_SUBQUERY;
-- MANAGER가 몇 명인가에 따른 LVL 표시하기
-- MANAGER가 0명이다 : LVL = 1
-- MANAGER가 1명이다 : LVL = 2
WITH MY_SUBQUERY(LVL, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID) AS (
-- 초기값(LVL = 1)을 지정하는 서브쿼리
SELECT 1, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID
FROM EMPLOYEES
WHERE MANAGER_ID IS NULL
UNION ALL
-- 반복해서 호출되는 서브쿼리
SELECT M.LVL + 1 AS LVL, E.EMPLOYEE_ID, E.FIRST_NAME, E.LAST_NAME, E.MANAGER_ID
FROM EMPLOYEES E INNER JOIN MY_SUBQUERY M
ON E.MANAGER_ID = M.EMPLOYEE_ID
)
SELECT LVL, EMPLOYEE_ID, FIRST_NAME, LAST_NAME, MANAGER_ID
FROM MY_SUBQUERY;