SQL, 데이터 분석!

SQL, 데이터 분석!

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

19 필터링과 서브쿼리(IN, ALL, ANY)

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