다른 쿼리 내부에 포함되어 있는 SELECT 쿼리를 의미, 보다 다양한 데이터를 출력하는 방법을 제공 → “ 실무에서 많이 사용되는 기술 ”
앞서 이미 서브쿼리를 사용해봤다.
FROM절 안에 들어있는게 서브쿼리이다.
SELECT 에서 사용되는 서브쿼리로 하나의 컬럼에 대해 하나의 행만 반환하는 특징을 가진다. 출력되는 하나의 값이 없다면 NULL 값 반환
↓이 서브쿼리가 하나의 COLUMN역할을 한다.
WHERE 에서 주로 사용되는 서브쿼리로 메인쿼리와 관계가 있는지에 따라 상관 서브쿼리와 비상관 서브쿼리로 나눔
비상관 서브쿼리 : 메인 쿼리의 컬럼을 사용하지 않는 서브쿼리
→ 서브쿼리가 먼저 실행되고 메인 쿼리 실행
SELECT *
FROM 직원
WHERE 연봉 >= (SELECT AVG(연봉)
FROM 직원 ) ;
→ (SELECT AVG(연봉)
FROM 직원)
// 독단적인 쿼리이므로 한 번의 실행으로 정답 도출됨.
상관 서브쿼리 : 메인 쿼리의 컬럼을 사용하는 서브쿼리
→ 메인쿼리가 먼저 실행되고 서브 쿼리 실행
SELECT *
FROM 직원 A
WHERE 연봉 = ( SELECT MIN(연봉)
FROM 직원
WHERE 부서ID = A.부서ID ) ;
-- 상관 서브쿼리는 메인 쿼리의 컬럼과 연관되어 있어 값이 정해지지 않음
WHERE 절에서 서브쿼리 결과를 받을 때
1. 단일행을 받을 수 있는 연산자 ( =, =< , !=, > 등등..)
2. 다중행을 받을 수 있는 연산자 ( IN, ANY, ALL, EXIST 등등..)
WHERE 절에서 서브쿼리 결과로 2개 이상의 행을 출력했을 때는 단일행 연산자를 사용할 수 없다.( 다중행 연산 필요!)
입력된 다중 행 중에서 일치하는 행의 존재 여부를 확인 → 존재하면 TRUE 반환(서브쿼리를 꼭 사용해야 하는 연산자)
- EXIST 와 IN의 차이점
IN은 일치하는 모든 것을 출력하기 위해 테이블의
모든 튜플에 접근한다.
→ 출력한 내용을 눈으로 확인해야 할 때 사용
EXISTS는 일치하는 튜플이 있는 순간 해당 작업 중지
→ 해당 내용이 존재 하는지 확인되기만 하면 테이블의 다른 정보를 보여주고 싶을 때 ( 속도 및 성능 우위 )
입력된 다중 행 중에서 일치하는 행의 존재 여부를 확인→ 존재하면 FALSE 반환(조건과 일치하지 않는 내용에 대해 TRUE 출력)7