SET OPERATOR를 중복해서 사용하면 위에서부터 아래로 내려가며 실행됌
UNION
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'A%' OR ENAME LIKE 'C%'
UNION
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'C%' OR ENAME LIKE 'F%';
UNION ALL
-- UNION ALL
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'A%' OR ENAME LIKE 'C%'
UNION ALL
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'C%' OR ENAME LIKE 'F%';
INTERSECT
-- INTERSECT
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'A%' OR ENAME LIKE 'C%'
INTERSECT
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'C%' OR ENAME LIKE 'F%';
MINUS(ORACLE) == EXCEPT(MYSQL)
-- MINUS
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'A%' OR ENAME LIKE 'C%'
MINUS
SELECT ENAME
FROM EMP
WHERE ENAME LIKE 'C%' OR ENAME LIKE 'F%';
계층형 질의의 조건
데이터를 전개하면서 이미 나타났던 동일한 데이터가 전개중에 다시 나타나면
이것을 가리켜 사이클(CYCLE))이 형성되었다고 함
사이클이 발생한 데이터는 런타임 오류가 발생
이 때 NOCYCLE를 추가하면 사이클이 발생한 이후의 데이터는 전개하지 않음으로서 오류가 발생하지 않게 함
계층형 질의에서 사용되는 가상 컬럼
WHERE 절에 비교값으로 사용된 서브 쿼리
단일행 서브쿼리 : 실행결과가 단 하나의 행으로 나오는 서브쿼리
-- 자료형이 DATE일 때도 서브쿼리 사용가능
SELECT *
FROM EMP
WHERE HIREDATE < (SELECT HIREDATE -- 자료형이 DATE(날짜)일 때도 서브쿼리를 사용할 수 있다.
FROM EMP
WHERE ENAME = 'SCOTT');
다중행 서브쿼리 : 실행 결과 행이 여러 개로 나오는 서브쿼리
-- IN을 기본연산자가 아닌 다중행 연산자로 사용할 수 있다.(효과는 같음)
SELECT *
FROM EMP
WHERE DEPTNO IN (20, 30);
-- 서브쿼리로 넣어서 사용가능
SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
다중열 서브쿼리 : 서브쿼리의 SELECT절에 비교할 데이터를 여러 개 지정하는 방식
SELECT *
FROM EMP
WHERE (DEPTNO, SAL) IN (SELECT DEPTNO, MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
인라인 뷰 + WITH 절 : FROM 절에 사용한 서브쿼리
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
-- 인라인 뷰는 특정 테이블 전체가 아닌 SELECT문을 통해
-- 일부 데이터를 추출해 온후 별칭을 지정하여 사용할 수 있다.
FROM (SELECT * FROM EMP WHERE DEPTNO = 10) E10,
(SELECT * FROM DEPT) D
WHERE E10.DEPTNO = D.DEPTNO;
WITH 사용 시
WITH
E10 AS (SELECT * FROM EMP WHERE DEPTNO = 10),
D AS (SELECT * FROM DEPT)
SELECT E10.EMPNO, E10.ENAME, E10.DEPTNO, D.DNAME, D.LOC
FROM E10, D
WHERE E10.DEPTNO = D.DEPTNO;
스칼라 서브 쿼리 : SELECT 절에 사용한 서브쿼리