WHERE 컬럼 IN (SELECT 컬럼 FROM 테이블 WHERE ...);
WHERE 컬럼 NOT IN (SELECT 컬럼 FROM 테이블 WHERE ...);
| 연산자 | 동작 |
|---|---|
| IN | 서브쿼리 결과 중 하나라도 일치하면 true |
| NOT IN | 서브 쿼리 결과 모두와 달라야 true. NULL 포함 시 0건 함정 |
true> ANY는 최솟값보다 크며 true -> >MIN(서브쿼리)와 등가< ANY는 최댓값보다 작으며 ture -> <MAX(서브쿼리)와 등가true> ALL은 최댓값보다 커야 true -> > MAX(서브쿼리)와 등가< ALL은 최솟값보다 작아야 true -> < MIN(서브쿼리)와 등가<> ALL은 모든 값과 달라야 하므로 NOT IN과 등가WHERE 컬럼 비교 연산자 ALL(SELECT 컬럼 FROM 테이블 WHERE...);
WHERE EXISTS(SELECT 1 FROM 테이블 WHERE 메인.컬럼 = 서브.컬럼 ...);
WHERE NOT EXISTS(SELECT 1 FROM 테이블 WHERE 메인.컬럼 = 서브.컬럼 ...);
WHERE(컬럼1, 컬럼2) IN (SELECT 컬럼1, 컬럼2 FROM 테이블 WHERE ...);
스칼라 서브쿼리는 SELECT절에 위치하여 행마다 단일 값을 함께 조회
반드시 1행 1열만 반환해야 하며, 2행 이상이면 오류가 발생
결과가 0행이면 NULL이 반환
JOIN의 대안으로 사용할 수 있으며, 한 컬럼만 가져올 때 가독성이 좋음
메인쿼리 행마다 한 번씩 실행되므로 행 수가 많을수록 비용이 증가
SELECT 컬럼,
(SELECT 단일값 FROM 테이블 WHERE 조건) AS 별칭
FROM 테이블;
인라인 뷰는 FROM 절의 서브쿼리이며, 결과를 임시 테이블처럼 사용
별칭(Alias) 부여가 사실상 필수이며, 메인쿼리에서 별칭으로 컬럼을 참조
GROUP BY 집계 결과에 조건을 경우 HAVING의 대안으로 쓸 수 있음
TOP-N 쿼리(상위 N건 조회)는 인라인 뷰와 ROWNUM을 결합
일회성 가상 테이블이며, 별도 객체로 저장되면 일반 뷰가 됨
SELECT 컬럼
FROM (SELECT...FROM 테이블 WHERE...) 별칭
WHERE 조건;
UNION,UNION ALL,INTERSECT,MINUS(Oracle),EXCEPT(ANSI)| 연산자 | 의미 | 중복처리 | 정렬 |
|---|---|---|---|
| UNION | 합집합 | 중복제거 | 자동 정렬 발생 |
| UNION ALL | 합집합 | 중복유지 | 정렬 없음 |
| INTERSECT | 교집합 | 중복제거 | 자동 정렬 발생 |
| MINUS/EXCEPT | 차집합 | 중복제거 | 자동 정렬 발생 |