SQL, 데이터 분석!

SQL, 데이터 분석!

바로 보고 실습하는 SQL, 입문부터 활용까지!

18 서브쿼리 개요

# 서브쿼리 개요 ## 미션 --- 다음 카페 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 ) ; ```