1. 서브 쿼리
1) 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다.
– 하나의 SQL문으로 풀 수 없는, 조금 더 복잡한 데이터를 추출할 때,
2) 서브 쿼리는 메인 쿼리의 칼럼을 모두 사용할 수 있지만, 메인 쿼리는 서브쿼리의 컬럼을 사용할 수 없다.
3) 서브 쿼리를 괄호로 감싸서 사용한다.
4) 서브 쿼리는 단일 행(SINGLE ROW)또는 복수 행(MULTIPLE ROW) 비교 연산자와 함께 사용 가능하다.
– 단일 행(SINGLE ROW) 비교 연산자는 반드시 1건 이하여야 한다.
– 복수 행(MULTIPLE ROW) 비교 연산자는 서브 쿼리의 결과 건수와 상관없다.
5) 서브 쿼리에서는 ORDER BY를 사용하지 못한다.
– ORDER BY 절은 메인 쿼리의 마지막 문제이 위치하여야 한다.
6) 서브 쿼리가 사용 가능한 위치
– SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT문의 VALUES, UPDATE문의 SET
2. 서브쿼리 구분
1) 중첩 서브쿼리
– WHERE절
2) 인라인 뷰
– FROM절
3) 스칼라 서브쿼리
– SELECT절
3. 서브 쿼리 구분 2
1) 단일행 서브 쿼리
– 하나의 값을 리턴하는 서브 쿼리이다.
– 일반적인 연산자 모두 사용 가능하다. (=, >,
2) 다중행 서브 쿼리
– 리턴 값이 여러 개의 레코드이다.
– 결과를 처리하는 전용 연산자가 있다. (IN, ALL, ANY, EXISTS)
4. 연산자
1) ANY 연산자
– 값을 서브 쿼리에 의해서 반환된 값과 비교한다.
– 서브 쿼리의 값이 어떠한 값이라도 만족을 하면 조건이 성립한다.
– 여러 개 레코드의 OR 효과
– 메인 쿼리에서 가장 작은 값보다 큰 것만 추출한다.
2) ALL 연산자
– 서브 쿼리에 의해 반환된 값과 비교한다.
– 서브 쿼리의 모든 값이 만족을 해야만 조건이 성립된다.
– 여러 개의 레코드의 AND효과
– 메인 쿼리에서 가장 큰 값보다 큰 것만 추출한다.
3) IN / EXISTS 연산자
– 서브쿼리 내에 집합이 존재하는지에 대한 존재 여부만 판단한다.
– 결과값 중에 있는 것 중에서의 존재 여부이다.
– IN은 전체 레코드를 스캔한다. EXISTS는 존재 여부만 확인하고 스캔하지 않는다.
– 존재하면 TRUE, 존재하지 않으면 FALSE
– 연산 시 부하가 줄어든다.