서브 쿼리
SELECT 문 안에 다시 SELECT 문이 기술된 쿼리
단일 SELECT 문 사용만으로는 안되는 복잡한 조건식을 만들 때 사용
다른 테이블에서 데이터 값을 조회한 후 조건으로 사용할 때 사용
서브쿼리 규칙
서브 쿼리는 괄호를 묶어서 사용
단일행 연산자 또는 다중행 연산자로 서브쿼리 연결
서브 쿼리 실행 후 메인 쿼리 실행
여러 서브 쿼리를 중첩해서 사용 가능
단일 행 서브 쿼리
서브쿼리 SELECT 문에서 단일 행 결과를 메인 쿼리에 전달
WHERE에 사용되는 열의 개수와 데이터 타입 일치 필요
단일 행 연산자 사용
SELECT first_name, last_name
FROM customer
WHERE email = (SELECT email
FROM customer
WHERE customer_id = 1)
다중 행 서브 쿼리
서브쿼리 SELECT 문에서 다중 행 결과를 메인 쿼리에 전달
단일 행 연산자는 사용할 수 없고, 다중행 연산자만 사용 가능
# IN / NOT IN 연산자
SELECT first_name, last_name, email
FROM customer
WHERE customer_id IN (SELECT customer_id
FROM cutomer
WHERE active = 0)
SELECT first_name, last_name, email
FROM customer
WHERE customer_id NOT IN (SELECT customer_id
FROM cutomer
WHERE active = 0)
# EXISTS 연산자
# 서브 쿼리의 결과가 존재하면 메인 쿼리를 실행한다
SELECT first_name, last_name, email
FROM customer
WHERE customer_id EXISTS (SELECT customer_id
FROM cutomer
WHERE active = 0)
# ANY
SELECT customer_id, first_name, last_name
FROM customer
WHERE email = ANY(
SELECT email
FROM customer
WHERE customer_id < 10)
SELECT customer_id, first_name, last_name
FROM customer
WHERE email < ANY( # 이 경우에는 문자열 크기 비교로 결과 출력
SELECT email
FROM customer
WHERE customer_id < 10)
# ALL
SELECT film_id, title, description, length
FROM film
WHERE film_id < ALL ( SELECT film_id
FROM film
WHERE length < 180)
SELECT film_id, title, description, length
FROM film
WHERE film_id > ALL ( SELECT film_id
FROM film
WHERE length < 180)
인라인 뷰
FROM 절에 있는 서브 쿼리가 인라인 뷰를 생성
FROM 절에 직접 기술하여 효율적인 검색 가능
FROM 절에 있는 서브 쿼리에는 자주 별칭을 사용
SELECT c.first_name, c.last_name, a.address
FROM customer c,
( SELECT address_id, address FROM address WHERE district = 'Texas') a
WHERE c.address_id = a.address_id
스칼라 서브쿼리
SELECT 문에 나타나는 서브 쿼리
※ 결과가 하나만 나와야 함
SELECT first_name, last_name, (SELECT COUNT(*) FROM actor)
FROM customer
출처
- 이수안 컴퓨터 연구소