본문 바로가기
SQL

[SQL] 데이터분석가 입문 필수 SQL 부트캠프 (5) HAVING 절, IF, CASE

by 모닥불🔥 2024. 3. 11.

강의는 메타코드에서 구매 가능: https://mcode.co.kr/kor/ 

 

이번 주말에 sqld 시험도 치고, 오늘은 결혼식을 다녀왔는데 어제 춥게 자서 그런가 감기기운이 심하다. 오늘은 짧게 글 쓰고 마무리 해야할 듯.. 내일 출근도 해야 하니까... 오늘도 역시 메타코드의 SQL 입문 6시간 완성 강의를 정리하려 한다.


🔥 HAVING 절

자료를 보면, HAVING은 WHERE와 비슷하게 뒤에 조건이 오는데 '그룹화된 결과의 집계'에 대한 조건을 적용한다고 되어 있다. 항상 GROUP BY까지 하고 결과 표를 한 번 뽑은 다음에 HAVING을 써서 조건을 적용한다고 생각하면 편하다. 아래 예를 보자.

SELECT productline, count(productline) AS productlineSum
FROM products
GROUP BY productline;

 

일단 이까지만 실행을 시켜 보면 아래와 같이 그룹별로 productline의 개수(count)를 세서 출력한다.

이런 다음 having 조건을 쓰면 위쪽 결과 중, count(productline)이 20보다 큰 것이므로 Classic Cars와 Vintage Cars가 뽑힌다.

SELECT productline, count(productline) AS productlineSum
FROM products
GROUP BY productline
HAVING count(productline) > 20;

 

 

자료에서처럼 HAVING을 LIKE로 제한하거나, 특정 값과 동일한지 여부에 따라 제한할 수도 있다.

 

문제 1. orders 테이블에서 연도별 주문 건수가 100건을 초과하는 연도를 조회하세요(orderDate, orderNumber 컬럼 사용).

연도별? orderDate 컬럼은 YYYY-MM-DD 형태로 되어 있다. 여기서 '연도(YEAR)만' 어떻게 뽑아낼 수 있을까? 답은 YEAR(orderDate) 라고 쓰는 것이다.

그러면 연도별 주문 건수라고 했으니, 연도별 = group by 해주고 연도와 주문 건수(count) 조회하면 되겠다.

SELECT YEAR(orderDate), COUNT(orderNumber)
FROM orders
GROUP BY YEAR(orderDate);

 

이렇게 입력했을 때 연도별로 주문 건수를 세서 표로 나타내기까진 성공했다. 여기에서 '100건을 초과'한다는 조건을 덧붙이면 SQL 코드 완성! having 절에서 다시 count문을 쓸 필요 없이 select 절에서 지정한 별칭을 불러와도 괜찮다.👍🏻

SELECT YEAR(orderDate), COUNT(orderNumber)
FROM orders
GROUP BY YEAR(orderDate)
HAVING COUNT(orderNumber) > 100;

# 동일한 쿼리: having 뒤에 SELECT에서 선언한 별칭 사용

SELECT YEAR(orderDate) AS YEAR, COUNT(orderNumber) AS orderCount
FROM orders
GROUP BY YEAR(orderDate)
HAVING orderCount > 100;

🔥 IF

나왔다. (내가 아는 한) 모든 컴퓨터 언어에서 등장하는 IF문! 

#IF문의 기본 형태

IF(조건, 조건이 참일 때의 출력값, 거짓일 때의 출력값)

요런 식으로 입력하면 된다. 5만보다 크면 Large, 아니면 Small.. IF문은 TRUE일 때, FALSE일 때 한가지씩만 조건을 넣을 수 있다.

 

문제 2. products 테이블을 사용하여, 상품별로 가격이 $100를 초과하면 Expensive로, 그렇지 않으면 Cheap로 표시하는 쿼리를 작성하세요. (products.productName, products.buyPrice 컬럼 사용)

일단 products 테이블을 사용해서 상품별 구매 가격(buyPrice)을 구하는 것부터 해보자. 상품'별'이라 GROUP BY를 쓸 것 같지만 상품명이 겹치는 게 없고, 그룹이랄 것도 없어서 그냥 정렬만 해주면 된다.

SELECT productName, buyPrice
FROM products
ORDER BY productName DESC;

 

이제 buyPrice 옆에다가 IF문을 써서 비싸다, 싸다를 표시해보자.

SELECT productName, buyprice, IF(buyPrice > 100, 'Expensive', 'Cheap') AS PriceCategory
FROM products
ORDER BY buyprice DESC;


🔥  CASE

CASE문은 여러개의 조건을 테스트 할 수 있다. 다른 컴퓨터 언어로 치면 IF ~ ELSE 구문인데 SQL에서는 CASE WHEN THEN~ 구문으로 쓴다. 기본형은 아래와 같다.

# CASE 기본형

CASE 컬럼명
WHEN 값1 THEN 결과1
WHEN 값2 THEN 결과2
ELSE 결과
END AS 별칭

위 예시를 보면 CASE WHEN '구매가격이 20달러보다 작다' 면 THEN 'Cheap' 이라고 출력하고, WHEN '구매가격이 20 이상 50 이하인 경우'에는 THEN 'Morderate'라고 출력하고, ELSE 나머지는 'Expensive' 라고 출력하라는 구문이다. END로 꼭 끝을 지어주어야 한다. 그리고 AS 뒤에 별칭을 넣는 이유는... 별칭을 넣지 않으면 앞에 쓴 명령문이 전부 컬럼명에 들어가기 때문이다...하하

조건이 굉장히 많은 걸 보니 CASE문을 쓸 것을 추측할 수 있다. 그러면 CASE jobTitle WHEN을 쓰고 앞쪽 조건, 뒤쪽 분류를 짝지어 넣어주고 마지막에 그 외에 해당하는 부분은 ELSE로 지정한 후 END, 별칭까지 넣어주면 되겠다.

SELECT firstName, lastName, jobTitle,
       CASE jobTitle
           WHEN 'Sales Rep' THEN 'Sales Team'
           WHEN 'VP Sales' THEN 'Management'
           WHEN 'VP Marketing' THEN 'Management'
           ELSE 'Other Positions'
       END AS PositionCategory
FROM employees;

 

결과는 이렇게 나온다.

 

여기까지 HAVING, IF, CASE문을 정리해보았다. 이제 다음주엔 대망의... JOIN을 정리해야 하니까 얼른 감기 기운에서 회복해야지...화륵화륵🔥🔥🔥 그럼 20000.