[SQL] 데이터 분석, 활용 _ 서브쿼리

강지영·2023년 2월 22일
0

📚 서브쿼리(Subquery)

쿼리속에 존재하는 또 다른 쿼리로
먼저 수행된 쿼리의 결과를 가지고 다시 쿼리를 수행하는 문법

ex ) 수학점수가 평균보다 높은 학생을 조회
먼저 수학 점수를 평균을 서브 쿼리로 계산 → 그 결과를 기준으로 학생 정보를 필터링

먼저 실행되는 안쪽 쿼리가 서브 쿼리(Subquery) | 그 결과를 이용하는 바깥쪽 쿼리가 메인 쿼리(Main Query)

💡 서브 쿼리는 어느 위치에 쓰일까요?

SELECT절 | FROM절 | WHERE절 | JOIN절 등 다양한 위치에 쓰이나
각 위치에 따라 형태의 제약이 있음을 주위

  • SELECT절
    1행 1열의 단일값(1x1)만 사용할 수 있다.
  • FROM 절과 JOIN 절
    FROM 절과 JOIN 절의 서브쿼리는 인라인 뷰로 불리며, 결과 크기에 제약이 없다.
    하지만 반드시 별칭(alias)을 달아야 한다.
  • WHERE절
    서브쿼리 중 가장 많이 사용되는 위치는 WHERE 절
    사용되는 연산자에 따라 쿼브쿼리의 결과 크기가 제한되는 데 1행 1열의 단일값(1x1),
    또는 N행 1열(Nx1)이 될 수 있음

실습

📑 음료(beverages)의 이름 및 가격과 함께, 가장 비싼 음료와의 가격 차이를 조사하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (SELECT 절 서브쿼리를 사용할 것)

-- 음료명, 가격, 최대 가격과의 차이
SELECT
	name AS "음료명",
	price AS "가격",
	price -(
		-- 가장 비싼 음료의 가격(1x1)
		SELECT
			MAX(price)
		FROM 
			beverages
	) AS "최대 가격과의 차이"
FROM
	beverages
;

📑 주문내역(order_details)로부터 주문 별 음료 개수의 평균을 조회하려 한다. 주어진 쿼리를 조합하여 이를 구하시오. (FROM 절 서브쿼리를 사용할 것)

SELECT
		ROUND(AVG(SUM),2) AS "주문 별 음료 개수 평균"		
FROM
	(
	-- 주문 별 음료 개수	
	SELECT
		order_id,
		SUM(count)
	FROM 
		order_details
	GROUP BY
		order_id) AS "주문 별 음료 개수"
;

📑 주문내역(order_details)로부터 음료 별 주문 개수를 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (JOIN 절 서브쿼리를 활용할 것)
📌 COALESCE(컬럼명, NULL일 시 넣어줄 값)

SELECT
	name AS "음료명",
	COALESCE(total_count, 0) AS "주문 개수" -- NULL 이면 0 됨
FROM
	beverages
LEFT JOIN (SELECT 
		  beverage_id,
		  SUM(count) AS total_count
		  FROM 
		  	order_details
		  GROUP BY
		  	beverage_id
		  ) AS b_counts ON
		b_counts.beverage_id = beverages.id
;

📑 평균 가격보다 비싼 음료(beverages)를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (WHERE 절 서브쿼리를 사용할 것)

SELECT
	name AS "음료명",
	price AS "가격"
FROM
	beverages
WHERE
	price > (
	SELECT
		AVG(price)
	FROM 
		beverages
	)
;
profile
Hello World!

0개의 댓글