# 필터링과 서브쿼리(IN, ALL, ANY)
## 미션
---
다음 카페 DB를 가지고, 서브쿼리 관련 필터링 문제를 푸시오.
#### 카페 DB 구조도
![홍팍-SQL-별다방-카페-매출-DB-스키마](http://drive.google.com/thumbnail?export=view&sz=w960&id=1WXMyTBt6IhmRobRrP4cKlhWiMjM7sRD8)
#### 카페 DB 데이터
![홍팍-SQL-별다방-카페-매출-DB-데이터](http://drive.google.com/thumbnail?export=view&sz=w960&id=1WWz36oUQsnLO13RWzNLua-uO5RSxaRQE)
## 개념
---
#### 필터링 서브쿼리의 제약
우리는 앞서 WHERE 절에 서브쿼리가 사용될 수 있음을 배웠다. 이때 서브쿼리의 결과는 단일값(1x1) 또는 단일 컬럼(Nx1)만 가능하다. 어느 경우에 단일값, 어느 경우에 단일 컬럼이어야 할까?
![홍팍-SQL-필터링-서브쿼리-WHERE절-제약](http://drive.google.com/thumbnail?export=view&sz=w960&id=1aiI4yYKvCZPEH3VuneynsOS27bn64b2U)
서브쿼리를 단순 비교할 경우 단일값인 반면, 조금 더 복잡한 연산(IN, ANY, ALL, ..)을 수행할 경우엔 단일 컬럼까지 가능하다.
![홍팍-SQL-필터링-서브쿼리-WHERE절-단일값-단일컬럼-구분](http://drive.google.com/thumbnail?export=view&sz=w960&id=1aikLSJhllHJTop_2grF5qM6Mcugb2NGT)
#### IN, ALL, ANY 연산
근데 IN, ALL, ANY 연산은 뭘까? IN은 포함된 것, ALL은 모두를 만족하는 것, ANY는 하나라도 만족하는 것을 찾는 연산이다.
![홍팍-SQL-서브쿼리-IN-ALL-ANY-연산](http://drive.google.com/thumbnail?export=view&sz=w960&id=1ajMP1UpnnYWWOFrnDd03tUaa5kV_7bQv)
다음은 IN 연산의 예로, 서브쿼리에서 반환된 A, B, C를 가지고 학생을 필터링한다.
![홍팍-SQL-서브쿼리-IN-연산](http://drive.google.com/thumbnail?export=view&sz=w960&id=1aoaD_GWpXfbSKsiB5-fkalMzXFXWprVZ)
ALL 연산도 보자. 다음은 서브쿼리 반환값을 수학점수와 비교 하여, 이들 모두 보다 큰 값이면 가져온다.
![홍팍-SQL-서브쿼리-ALL-연산](http://drive.google.com/thumbnail?export=view&sz=w960&id=1aoTMGX0bGisVu6u-7vLp-TMeOkAuvjVa)
끝으로 ANY 연산이다. 서브쿼리 값을 수학점수와 비교하여, 적어도 하나가 이들보다 작으면 가져온다.
![홍팍-SQL-서브쿼리-ANY-연산](http://drive.google.com/thumbnail?export=view&sz=w960&id=1aoIKofY8LCYvjCBCIWqQNfnZZEtyPadz)
## 실습
---
#### 1. 판매량 상위 3개 음료를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오.
![홍팍-SQL-서브쿼리-IN-연산-실습](http://drive.google.com/thumbnail?export=view&sz=w960&id=1auI7VN-yQ99A7fgkLG0CuP_yo2kRlq01)
#### 2. 아메리카노와 라떼보다 가격이 싼 음료는 다음과 같다. 주어진 쿼리를 조합하여 이를 조회하시오.
![홍팍-SQL-서브쿼리-ALL-연산-실습](http://drive.google.com/thumbnail?export=view&sz=w960&id=1atq0moEtNyuASQc6Aez6lz3uLoX5Q55-)
#### 3. 커피가 아닌 음료들 중, 적어도 한 커피 보다 가격이 비싼 것은 다음과 같다. 주어진 두 쿼리를 조합하여 이를 조회하시오.
![홍팍-SQL-서브쿼리-ANY-연산-실습](http://drive.google.com/thumbnail?export=view&sz=w960&id=1asoiSgWtuRTX2Rb7ADS1O6YNoa9PonnJ)
## 훈련
---
#### 다음 쿼리 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'
)
;
```