본문 바로가기
SQL

[SQL] 데이터분석가 입문 필수 SQL 부트캠프 (4) ORDER BY, GROUP BY

by 모닥불🔥 2024. 3. 10.

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

 

오늘 2024년 3월 9일, 제 52회 SQLD 시험을 치고 왔다. 결론부터 말하면 메타코드 부트캠프 들은 게 중심을 딴딴하게 잡아줘서 그런지 도움이 많이 되었다. 굿! 나중에 여유 생기면 시험 준비 꿀팁 썰도 풀어볼 예정...


🔥 ORDER BY

ORDER BY는 SQL 쿼리 결과를 특정 컬럼 또는 여러 컬럼 기준으로 정렬하는 기능을 한다.

디폴트 값은 오름차순(ASC), DESC를 적어주면 내림차순으로 정렬한다.

SELECT *
FROM A
WHERE 조건
ORDER BY 컬럼명1 DESC, 컬럼명2 ASC;

 

기본형은 위와 같다. ORDER BY는 가장 마지막에 실행된다고 했다. SQLD 시험에도 자주 나오는 문제인데, 쿼리는 FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 순서로 실행된다. 즉, 정렬은 쿼리 맨 마지막에 수행된다.

ORDER BY는 마지막에 수행되기 때문에, 정렬을 먼저 하고 데이터를 뽑고 싶다면 서브쿼리를 활용해야 한다.

 

문제 1. products 테이블에서 제품 이름(productName)을 조회하되, 가격(buyPrice)을 기준으로 내림차순으로 정렬하세요.

일단, 앞에서랑 똑같이, products 테이블에서 제품이름 조회하는 쿼리를 쓰자. 그리고 마지막에 order by 기준컬럼 정렬순서 를 넣어주면 됨

SELECT productName
FROM products
ORDER BY buyPrice;

 

위 예시를 보면 알겠지만 SELECT로 조회하지 않은 컬럼이더라도 ORDER BY에 쓸 수 있다. 그리고 데이터를 가져와서 순서대로 정렬해야 하니까 시간이 오래 걸리고, 성능이 느려질 가능성이 있음!


🔥 GROUP BY

GROUP BY 절은 결과를 그룹 형태로 보여준다.

위 그림에서도 왼쪽 표는 섹터가 중복되더라도 주식 종목명을 모두 보여주고 있다.

SELECT 섹터 AS 지수, SUM(상장주식수) AS 섹터별상장주식수
GROUP BY 섹터;

요런 식으로 쿼리를 적어 주면 섹터별로 GROUP이 지어지고, 우측처럼 상장주식수 합계를 산출할 수 있다.

GROUP BY를 하면 이렇게 주로 SELECT문에서 GROUP으로 묶은 컬럼과 함께 SUM(), AVG(), COUNT(), MAX(), MIN() 등 집계함수와 결합되어 사용된다.

만약 여기서 상장주식수를 SUM 하지 않고 출력하려고 하면 오류가 난다. 반도체, 바이오, IT 그룹별로 주식이 여러개 있고, 상장주식수를 어디서 가져와야 할지 모르기 때문이다.

 

문제 2. orders 테이블에서 각 상태(status)별로 주문 개수를 구하세요.

일단 orders 테이블에서 뭔가를 불러오는 거니까 기본적인 형태를 작성하면,...

SELECT *
FROM orders;

 

이렇게 전체 컬럼을 조회하는 것이 아니라 '상태별'로 구하라고 했다. 한글에서 '~~별로' 라는 말이 나오면 일단 group by를 떠올리자.  그룹바이, 설렉트 절에서는 그룹한 기준 컬럼, 집계함수 컬럼

SELECT status, COUNT(orderNumber) AS OrderCount
FROM orders
GROUP BY status;

 

여기서 COUNT() 안에 뭘 넣어야 할지 고민될 수 있다. orderNumber는 주문(orders) 테이블의 PK이다. PK는 유일하고 null이 아닌 값을 의미하므로, 겹치지 않고 count를 할 수 있는 컬럼이 된다. 만약 이름 컬럼이 있다면 동명이인 등 중복값이 생기기 쉬울 테니까, PK의 개수를 세는 게 편하다.

 

문제 3. customers 테이블에서 각 국가(country)별로 고객 수가 많은 상위 5개를 조회하세요.

SELECT country, COUNT(customerNumbr) AS numberOfCustomers
FROM customers
GROUP BY country
ORDER BY COUNT(customerNumber) DESC
LIMIT 5;

 

여기서는 LIMIT을 함께 쓰고 있다. ORDER BY는 맨 마지막에 실행된다고 했지만 사실상 LIMIT이 가장 마지막에 실행되어, 뽑힌 5개 행의 정렬이 아닌, 정렬 후 5개 뽑기가 된다.

 

실제 강의에서는 챕터마다 10~20개 정도씩 해설도 해주고 하니, 이 글로 부족한 사람들은 원래 강의를 추천한다. 그럼 이만! 화르륵🔥