# 필터링과 서브쿼리(IN, ALL, ANY)
## 미션
---
다음 카페 DB를 가지고, 서브쿼리 관련 필터링 문제를 푸시오.
#### 카페 DB 구조도

#### 카페 DB 데이터

## 개념
---
#### 필터링 서브쿼리의 제약
우리는 앞서 WHERE 절에 서브쿼리가 사용될 수 있음을 배웠다. 이때 서브쿼리의 결과는 단일값(1x1) 또는 단일 컬럼(Nx1)만 가능하다. 어느 경우에 단일값, 어느 경우에 단일 컬럼이어야 할까?

서브쿼리를 단순 비교할 경우 단일값인 반면, 조금 더 복잡한 연산(IN, ANY, ALL, ..)을 수행할 경우엔 단일 컬럼까지 가능하다.

#### IN, ALL, ANY 연산
근데 IN, ALL, ANY 연산은 뭘까? IN은 포함된 것, ALL은 모두를 만족하는 것, ANY는 하나라도 만족하는 것을 찾는 연산이다.

다음은 IN 연산의 예로, 서브쿼리에서 반환된 A, B, C를 가지고 학생을 필터링한다.

ALL 연산도 보자. 다음은 서브쿼리 반환값을 수학점수와 비교 하여, 이들 모두 보다 큰 값이면 가져온다.

끝으로 ANY 연산이다. 서브쿼리 값을 수학점수와 비교하여, 적어도 하나가 이들보다 작으면 가져온다.

## 실습
---
#### 1. 판매량 상위 3개 음료를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오.

#### 2. 아메리카노와 라떼보다 가격이 싼 음료는 다음과 같다. 주어진 쿼리를 조합하여 이를 조회하시오.

#### 3. 커피가 아닌 음료들 중, 적어도 한 커피 보다 가격이 비싼 것은 다음과 같다. 주어진 두 쿼리를 조합하여 이를 조회하시오.

## 훈련
---
#### 다음 쿼리 A, B가 동작하지 않는 이유를 설명하시오.
A)
```
-- 메인 쿼리(판매량 상위 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 > (
-- 모든 커피의 가격
SELECT
price
FROM
beverages
WHERE
btype = 'COFFEE'
)
;
```