WHERE 절에 서브쿼리는 단일값 또는 단일 컬럼만 가능하다!
서브쿼리 결과를 단순 비교할 때는 단일값이어야 하지만!
IN | ALL | ANY 등의 필터링 연산 시에는 서브쿼리가 단일 컬럼(Nx1)에 형태를 가져야 한다.
포함된 것
만약 서브쿼리가 단일 컬럼 A, B, C를 가져왔다면 메인쿼리는 여기에 포함된 것
즉 성적이 A, B, C인 학생만 필터링한다.
모두를 만족하는 것
가령 서브쿼리가 단일 컬럼 80, 72, 68을 가져왔다면 이것들을 가지고 비교 연산을 하는데 이들 모두보다 큰 값을 필터링한다.
하나라도 만족하는 것
예를 들어 서브쿼리가 단일 컬럼 80, 72, 68일 때, 메인쿼리는 비교 연산을 통해서 적어도 하나만이라도 만족한 값을 필터링한다.
📑 판매량 상위 3개 음료를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오.
-- 판매량 상위 3개 음료를 다음과 같이 조회
SELECT
id AS "ID",
name AS "음료명"
FROM
beverages
WHERE
id IN (
-- 음료 ID별 판매량
SELECT
beverage_id
FROM
order_details
GROUP BY
beverage_id
ORDER BY
SUM(count) DESC
LIMIT
3
);
📑 아메리카노와 라떼보다 가격이 싼 음료는 다음과 같다. 주어진 쿼리를 조합하여 이를 조회하시오.
-- 아메리카노와 라떼보다 가격이 싼 음료
SELECT
id AS "ID",
name AS "음료명"
FROM
beverages
WHERE
price < ALL (
-- 아메리카노 라떼 가격
SELECT
price
FROM
beverages
WHERE
name IN ('아메리카노','라떼')
);
📑 커피가 아닌 음료들 중, 적어도 한 커피 보다 가격이 비싼 것은 다음과 같다. 주어진 두 쿼리를 조합하여 이를 조회하시오.
-- 커피가 아닌 음료들 중, 적어도 한 커피 보다 가격이 비싼 것
SELECT
name AS "음료명",
price AS "가격"
FROM
beverages
WHERE
btype != 'COFFEE'
AND
price > ANY (
-- 모든 커피의 가격
SELECT
price
FROM
beverages
WHERE
btype = 'COFFEE'
)
;
📑 다음 쿼리 A, B가 동작하지 않는 이유를 설명하시오
A ) WHERE절에서는 WHERE 절에 서브쿼리는 단일값 또는 단일 컬럼이 되어야 하고,
IN | ALL | ANY 등의 필터링 연산 시에는 서브쿼리가 단일 컬럼(Nx1)에 형태를 가져야 하는 데 아래의 쿼리는 그렇지 않다. beverage_id,수정함
-- 메인 쿼리(판매량 상위 3개의 음료 정보)
SELECT
id AS "ID",
name AS "음료명"
FROM
beverages
WHERE
id IN (
-- 음료 id 별, 판매량
SELECT
~~beverage_id,~~
SUM(count)
FROM
order_details
GROUP BY
beverage_id
ORDER BY -- 내림차순 정렬(판매량 기준)
SUM(count) DESC
LIMIT -- 개수 제한(상위 3개만)
3
)
;
B ) 서브쿼리 결과가 하나 이상의 행을 리턴했다. => [수정한 부분]
-- 메인 쿼리(적어도 한 커피 보다 비싼 음료)
SELECT
name AS "음료명",
price AS "가격"
FROM
beverages
WHERE
btype != 'COFFEE'
AND
price > [ANY](
-- 모든 커피의 가격
SELECT
price
FROM
beverages
WHERE
btype = 'COFFEE'
)
;