SELECT
문을 하나, 평균 이상의 레코드를 가져오는 SELECT
를 하나, 총 두개의 SELECT
문을 실행SELECT
문에 적은 다른 SELECT
문을 서브 쿼리라 부름SELECT
문은 메인 쿼리라 부름SELECT
order_id, price
FROM
productorder
WHERE
price >= (
SELECT
AVG(price)
FROM
productorder
);
WHERE
문에 적는 경우가 많지만 SELECT
문에 적을 때도 있음SELECT
order_id, price
(
SELECT
count(*)
FROM
productorder
) AS order_count
FROM
productorder
ORDER BY
price
LIMIT
3;
연산자 | 사용법 | 의미 |
---|---|---|
IN | a IN (서브 쿼리) | a가 서브 쿼리 결과 중 어느 것과 일치하면 1을 반환 |
NOT IN | a NOT IN (서브 쿼리) | a가 서브 쿼리의 결과 중 어느 것에도 일치하지 않으면 1을 반환 |
ANY | a 연산자 ANY (서브 쿼리) | 서브 쿼리의 결과 중 어느 것과 a의 연산 결과가 1이라면 1을 반환 |
ALL | a 연산자 ALL (서브 쿼리) | 서브 쿼리의 결과 전체와 a의 연산 결과가 1이라면 1을 반환 |
DISTINCT
로 제거IN
연산자를 사용해서 customer 테이블에서 고객 정보 가져오기SELECT
customer_id, customer_name
FROM
customer
WHERE
customer_id IN
(
SELECT
DISTINCT customer_id
FROM
productorder
WHERE
price >= 700
);
ALL
의 경우라면 서브 쿼리의 모든 값보다 stock이 작아야 그 레코드를 가져오게 됨SELECT
*
FROM
product
WHERE stock < ANY
(
SELECT
SUM(quantity)
FROM
productorder
GROUP BY
product_id
);
5 IN (1, 2, 3) # 0
5 IN (1, 2, NULL) # NULL
2 IN (1, 2, NULL) # 1
SELECT
*
FROM
테이블명
WHERE
컬럼명 IN
(
SELECT
컬럼명
FROM
테이블명
WHERE
컬럼명 IS NOT NULL
);
productorder 테이블 안에서 price의 내림차순으로 상위 3개의 레코드의 customer_id를 서브쿼리로 가져와서, customer 테이블에서 해당하는 cunstomer_id와 customer_name을 가져오기
LIMIT
를 하고 IN
을 하면 오류가 발생SELECT
customer_id, customer_name
FROM
customer
WHERE
customer_id IN
(
SELECT
customer_id
FROM
productorder
ORDER BY
price DECS
LIMIT 3
);
LIMIT
을 쓰려면 서브쿼리를 중첩해야함
서브 쿼리가 테이블이 되는 예시
SELECT
customer_id, customer_name
FROM
customer
WHERE
customer_id IN
(
SELECT
customer_id
FROM
(
SELECT
customer_id
FROM
productorder
ORDER BY
price DECS
LIMIT 3
) AS tmp
);
SELECT
문에서는 서브 쿼리가 먼저 실행되고 그 결과를 메인 쿼리에 넣고 메인 쿼리를 실행SELECT
product.product_id
product.product_name
FROM
product
WHERE
3 < (
SELECT
SUM(quantity)
FROM
productorder
WHERE
product.product_id = productorder.product_id
);
SELECT
a.customer_id
a.customer_name
(
SELECT
SUM(b.price)
FROM
productorder AS b
WHERE
a.customer_id = b.customer_id
)
FROM
customer AS a;
EXISTS
연산자는 상관 서브 쿼리의 결과에 사용하는 연산자연산자 | 사용법 | 의미 |
---|---|---|
EXISTS | EXISTS(서브쿼리) | 서브 쿼리의 결과가 존재하면 1을 반환 |
SELECT
a.product_id
a.product_name
FROM
product AS a
WHERE
EXISTS (
SELECT
*
FROM
productorder AS b
WHERE
a.product_id = b.product_id
);