# 서브쿼리 개요
## 미션
---
다음 카페 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)
## 개념
---
#### 서브쿼리란
쿼리 속 또 다른 쿼리다. 서브쿼리는 먼저 수행된 쿼리 결과를 가지고, 다시 쿼리를 수행할 때 사용한다.
![홍팍-SQL-서브-쿼리-개요](http://drive.google.com/thumbnail?export=view&sz=w960&id=1_nDjyPy9Z5GoLyqJLUozdtHiFmlZC5QZ)
다음은 서브쿼리의 사용 예로, 수학 점수가 평균 이상인 학생을 조회한다. 서브(내부) 쿼리에서 먼저 평균이 계산 되고, 그 결과를 가지고 메인(외부) 쿼리가 동작하게 된다.
![홍팍-SQL-서브-쿼리-예](http://drive.google.com/thumbnail?export=view&sz=w960&id=1_oQEFa_A3Ff2WmQnsij3cfocSKMGQP8F)
#### 다양한 서브쿼리
서브쿼리는 다양한 위치에 올 수 있는데, 각 위치에 따라 서브쿼리는 적절한 형태를 가져야 한다.
![홍팍-SQL-서브-쿼리-종류](http://drive.google.com/thumbnail?export=view&sz=w960&id=1_rHJY00FBhNR168kCoXaT_ZLp5nWvkAe)
SELECT 절 서브쿼리는 반드시, 그 결과가 단일값(1x1)이어야 한다. 때문에 스칼라 쿼리로 불린다.
![홍팍-SQL-SELECT-절-서브-쿼리-스칼라-쿼리](http://drive.google.com/thumbnail?export=view&sz=w960&id=1_z6WuViAIHfmdwNAU4G7fiUAriT6zwjT)
이와 달리 FROM 절과 JOIN 절의 서브쿼리는 인라인 뷰로 불리며, 결과 크기에 제약이 없다. 하지만 반드시 별칭(alias)을 달아야 한다.
![홍팍-SQL-인라인-뷰-FROM-JOIN-서브-쿼리](http://drive.google.com/thumbnail?export=view&sz=w960&id=1a-odmx45DckE_ofUviCOqPFECAfKXL7A)
서브쿼리 중 가장 많이 사용되는 위치는 WHERE 절이다. WHERE 절 서브쿼리의 경우, 연산자에 따라 그 결과가 단일값(1x1), 또는 N행 1열(Nx1)이어야 한다.
![홍팍-SQL-인라인-뷰-FROM-JOIN-서브-쿼리](http://drive.google.com/thumbnail?export=view&sz=w960&id=1a009BOqz6lC2eSAkbcrp37T68VMHmxk5)
## 실습
---
#### 1. 음료(beverages)의 이름 및 가격과 함께, 가장 비싼 음료와의 가격 차이를 조사하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (SELECT 절 서브쿼리를 사용할 것)
![홍팍-SQL-서브-쿼리-개요-문제1](http://drive.google.com/thumbnail?export=view&sz=w960&id=1a0gIxiB3Z_dy7qkSCBU2hK_oH4RoDBWG)
#### 2. 주문내역(order_details)로부터 주문 별 음료 개수의 평균을 조회하려 한다. 주어진 쿼리를 조합하여 이를 구하시오. (FROM 절 서브쿼리를 사용할 것)
![홍팍-SQL-서브-쿼리-개요-문제2](http://drive.google.com/thumbnail?export=view&sz=w960&id=1a1Q41r5ZnEQigJ6fWfB4CLexPnu-ROAs)
#### 3. 주문내역(order_details)로부터 음료 별 주문 개수를 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (JOIN 절 서브쿼리를 활용할 것)
![홍팍-SQL-서브-쿼리-개요-문제3](http://drive.google.com/thumbnail?export=view&sz=w960&id=1a2Pa2TH3lr6NbNMzNgqY58NiVAQnHgMZ)
#### 4. 평균 가격보다 비싼 음료(beverages)를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (WHERE 절 서브쿼리를 사용할 것)
![홍팍-SQL-서브-쿼리-개요-문제4](http://drive.google.com/thumbnail?export=view&sz=w960&id=1a50JINW1QxGiq3WsVjm7dd-YzLpzfCua)
## 훈련
---
#### 🔥 다음 쿼리 A, B, C 가 동작하지 않는 이유를 설명하시오.
A)
```
SELECT
name AS "음료명",
price AS "가격",
price - (
-- SELECT 절 서브쿼리
SELECT
MAX(price), 123
FROM
beverages
) AS "최대 가격과의 차이"
FROM
beverages
;
```
B)
```
SELECT
AVG(SUM(count))
FROM
order_details
GROUP BY
order_id
;
```
C)
```
SELECT
*
FROM
(
-- FROM 절 서브쿼리
SELECT
order_id, -- 주문번호
SUM(count) -- 주문 별 음료 개수
FROM
order_details
GROUP BY
order_id
)
;
```