-- 서브 쿼리 예제 쿼리 1개씩
-- 단일행 서브쿼리 : 수행결과가 오직 하나의 행만을 반환하는것
--서브쿼리를 수행한 결과가 1건만 나오고, 이 결과를 메인 쿼리로 전달해서 메인쿼리를 수행하게된다.
--메인쿼리의 WHERE절에서는 단일행 비교 연산자를 사용해야 한다.
SELECT DNAME
FROM DEPT
WHERE DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'Shelli');
-- 다중행 서브쿼리 : 서브쿼리가 2건 이상 반환 (IN 연산자는 하나의 컬럼이 여러개의 '='조건을 가지는 경우)
SELECT ENAME,SAL,DEPTNO
FROM EMP
WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);
-- 다중컬럼 서브쿼리 : 서브쿼리의 결과가 여러 컬럼인 경우 다중컬럼 서브쿼리라고 한다.
--메인쿼리 WHERE절과 서브쿼리에서 반환하는 컬럼의 수가 반드시 같아야한다.
SELECT DEPTNO,ENAME,SAL
FROM EMP
WHERE (DEPTNO,SAL) IN (SELECT DEPTNO,MIN(SAL) FROM EMP GROUP BY DEPTNO )
ORDER BY DEPTNO;
-- 인라인뷰 : FROM절에 있는 서브쿼리
SELECT A.DEPTNO,A.SAL
FROM EMP A,(SELECT DEPTNO, MAX(SAL) AS MAX
FROM EMP
GROUP BY DEPTNO) B
WHERE A.DEPTNO = B.DEPTNO
AND A.SAL = B.MAX;
-- 스칼라 서브쿼리 : SELECT문에 있는 서브쿼리
SELECT A.ENAME
,(SELECT B.DNAME
FROM DEPT B
WHERE B.DEPTNO = A.DEPTNO)AS DNAME
,A.JOB
FROM EMP A
WHERE A.JOB = 'MANAGER';
-- 집합쿼리(UNION, UNION ALL, INTERSECT, MINUS)
--UNION : 두개의 SELECT 결과를 합칠수 있다. 합친결과에서 중복되는 행은 하나만 표시
--단 컬럼의 개수가 같아야하고 각 컬럼의 데이터 타입이 같아야한다. 중복은 허용하지 않는다.
SELECT DEPTNO
FROM EMP
UNION
SELECT DEPTNO
FROM DEPT ;
--UNION ALL : UNION에서 중복이 제거 되지 않은것
SELECT DEPTNO
FROM EMP
UNION ALL
SELECT DEPTNO
FROM DEPT ;
--INTERSECT : 교집합, 양쪽 모두에서 포함된 행을 검색
SELECT DEPTNO
FROM EMP
INTERSECT
SELECT DEPTNO
FROM DEPT ;
--MINUS : 차집합, 첫번째 검색 결과에서 두번째 검색 결과를 제외한 나머지를 검색
SELECT DEPTNO
FROM EMP
MINUS
SELECT DEPTNO
FROM DEPT ;
-------------------------------------------------------------------
SELECT DEPTNO
FROM DEPT
MINUS
SELECT DEPTNO
FROM EMP ;