WHERE 절 서브쿼리
(1) 단일행 서브쿼리 (✨중요)
-- 비교연산자와 함께 사용 (=, >, < 등)
-- 비교연산자를 사용하기 때문에 서브쿼리로 출력한 결과값은 반드시 단 1개만 나와야 한다.
-- 평균 영수 금액보다 더 많이 지불한 경우를 모두 출력해주세요.
-- 1. 평균 영수 금액 출력 2. 1의 쿼리로 출력한 평균 영수 금액을 WHERE 절의 조건으로 사용하는 쿼리 작성
SELECT *
FROM tips
WHERE total_bill > (SELECT AVG(total_bill) FROM tips)
(2) 다중행 서브쿼리 (✨중요)
-- IN, NOT IN과 함께 사용
-- 서브쿼리의 결과값이 컬럼은 1개, 로우가 N개
-- 요일 별 판매 금액이 1500불 이상인 날의 결제 내역을 모두 출력해주세요.
-- 1. 요일 별 판매 금액 출력 => 토요일, 일요일이 '판매 금액 1500불 이상' 조건을 만족함
-- 2. 즉, 요일 별 판매 금액이 1500불 이상인 날 = 토요일, 일요일이므로 문제가 원하는 것은 '토요일/일요일의 결제 내역을 모두 출력해주세요'
SELECT *
FROM tips
WHERE day IN (
SELECT day
FROM tips
GROUP BY day
HAVING SUM(sales) >= 1500)
-- 서브쿼리의 결과값 : SUM(sales)가 1500불 이상인 day를 출력 = 토요일, 일요일
-- 아우터 쿼리 : 서브쿼리에 따라 필터링 된 토요일, 일요일의 전체 결제 내역을 모두 출력
(3) 다중컬럼 서브쿼리
-- 서브쿼리의 결과값이 컬럼 N개, 로우도 N개
-- 요일 별로 가장 높은 금액의 결제 내역들을 출력해주세요.
SELECT *
FROM tips
WHERE (day, total_bill) IN (
SELECT day, MAX(total_bill)
FROM tips
GROUP BY day)
FROM 절 서브쿼리 (✨중요)
-- 서브쿼리에 꼭 별칭을 주어야 한다.
-- 서브쿼리의 경우 > 임시의 테이블처럼 활용이 가능하다. (조인도 가능)
-- 이 레스토랑의 요일별 매출액의 평균을 구해주세요.
SELECT AVG(sales)
FROM (
SELECT day, SUM(total_bill) AS sales
FROM tips
GROUP BY day) AS daily
-- WITH문 활용 (조인도 가능)
WITH daily AS (
SELECT day, SUM(total_bill) AS sales
FROM tips
GROUP BY day)
SELECT AVG(sales)
FROM daily
-- 예제
-- 각 영수 금액이, 요일 별 매출액에서 차지하는 비율을 계산해주세요.
-- 비율은 반올림하여 소수점 둘째자리까지만 출력해주세요. 영수 금액이 높은 것부터 출력해주세요.
WITH daily AS (
SELECT day, SUM(total_bill) AS sales
FROM tips
GROUP BY day)
SELECT tips.day, tips.total_bill, ROUND(tips.total_bill / daily.sales * 100, 2) AS pct
FROM tips INNER JOIN daily ON tips.day = daily.day
ORDER BY tips.total_bill DESC
SELECT 절 서브쿼리
-- 단일행 서브쿼리만 사용 가능함
-- 행 바이 행으로 계산되는 개념
-- 각 영수 금액이, 요일 별 매출액에서 차지하는 비율을 계산해주세요.
-- 비율은 반올림하여 소수점 둘째자리까지만 출력해주세요. 영수 금액이 높은 것부터 출력해주세요.
SELECT t1.day, t1.total_bill,
(SELECT SUM(total_bill) FROM tips AS t2 WHERE t2.day = t1.day) AS sales,
ROUND(t1.total_bill / (SELECT SUM(total_bill) FROM tips AS t2 WHERE t2.day = t1.day) * 100, 2) AS pct
FROM tips AS t1
ORDER BY t1.total_bill DESC
-- 각 영수 금액이, 이 레스토랑의 전체 매출액에서 차지하는 비율을 계산해주세요.
-- 비율은 반올림하여 소수점 둘째자리까지만 출력해주세요. 영수금액이 높은 것부터 출력해주세요.
SELECT t1.day, t1.total_bill,
(SELECT SUM(total_bill) FROM tips AS t2) AS sales,
ROUND(t1.total_bill / (SELECT SUM(total_bill) FROM tips AS t2) * 100, 2) AS daily
FROM tips AS t1
ORDER BY t1.total_bill DESC