본문 바로가기
SQL

[SQL] 데이터분석가 입문 필수 SQL 부트캠프 (14) WITH 구문

by 모닥불🔥 2024. 4. 20.

이미지 클릭 시 구매 링크로 이동

 

강의는 메타코드 사이트(https://mcode.co.kr/)에서 구매할 수 있다. 이번 글이 이 강의 마지막 정리 글이다! 호우 끝까지 정리하다니 제법인걸? 0v0 (셀프 칭찬)


🔥 WITH 구문

이번 글에서는 WITH 구문을 설명할 것이다.

WITH 구문은 서브쿼리와 비슷하다. 서브쿼리는 메인쿼리 안에서 괄호를 사용해서 쿼리를 하나 더 쓰는 방식이지만, WITH 구문은 메인쿼리 위쪽에 완전히 별도로 적는다는 점이 다르다. 서브쿼리는 메인쿼리 내에서 한 번만 사용되지만, WITH 구문은 변수를 정의하듯이 한 번 정의하면 아래쪽에서 계속 사용할 수 있다.

 

WITH문의 기본 구조는 이렇다. WITH 구문으로 정의한 구문을 메인쿼리에서 테이블처럼 참조해서 사용할 수 있다.

WITH 이름1 AS (
	내용
)

SELECT *
FROM 이름1; 	#WITH 구문 참조

 

예를 들면 WITH 구문으로 LatestOrders(최근주문)라는 가상의 테이블을 생성한다.

그런 다음 메인쿼리를 보면 orders 테이블과 WITH문으로 만든 LatestOrders를 JOIN한 것을 볼 수 있다.

문제. products 테이블에서 각 제품 라인별로 평균 제품 가격을 계산하세요. 그리고 이 평균 가격보다 높은 가격을 가진 제품들만을 해당 제품 라인별로 조회하세요.

일단 products 테이블이 어떻게 생겼는지 살펴보자.

제품코드(productCode), 제품명(productName), 제품라인(productLine), 제품공급업체(productVendor), 제품설명(productDescription), 재고수량(quantityInStock), 가격(buyPrice), MSRP로 이루어져 있다.

* MSRP란? 찾아보니 권장 소매 가격이라고 한다. Manufacturer's Suggested Retail Price

SELECT *
FROM prodcuts;

 

products 테이블에서 제품 라인(productline)별 평균(avg) 가격(buyPrice)을 계산해 보자.

제품라인 '별' 평균 가격을 구하라고 했으니 집계를 위해 GROUP BY와 AVG를 사용한다.

# products 테이블에서 제품 라인별 평균 가격

SELECT productline, AVG(buyPrice) AS averagePrice
FROM products
GROUP BY productline;

 

이렇게 구한 평균 가격보다 높은 가격을 가진 제품만 라인별로 조회해야 한다. 원래 테이블에다가 계산한 평균을 붙여서 그것보다 큰 값을 가진 경우만 선택하면 될 것 같다. 위에서 만든 구문을 WITH문 안에 넣어서 averagePriceTable로 정의한 다음, 원래 products 테이블과 JOIN 하여 평균보다 큰 값을 구하면 아래와 같은 코드가 된다.

# 제품 평균 가격에 대한 위드문
WITH averagePriceTable AS (SELECT productline, AVG(buyPrice) AS averagePrice
FROM products
GROUP BY productline)

# 평균가격보다 높은 가격인 제품만 라인별로 조회
SELECT p.productLine, p.productName, p.buyPrice, ap.averagePrice
FROM products p
JOIN averagePriceTable ap
ON p.productLine = ap.productLine
WHERE buyPrice > averagePrice;

 

그러면 이렇게, 제품 라인별로 가격과 평균 가격이 함께 나오며, 가격이 평균보다 더 큰 경우만 불러올 수 있다.

이로써 SQL 부트캠프 정리는 끝났다. 그 이후로도 강의를 꽤 많이 들었는데, 흐지부지 이것저것 정리하기 보다는 하나씩 끝까지 하고 싶어서 계속 붙들고 있었다. :) 쫌 뿌듯!!

 

종종 프로그래머스 문제풀이도 올릴까 생각 중이다. 데이터분석가가 되기 위해 SQL 능력이 가장 필요하다고 하는데...! 파이팅🔥🔥🔥