이 글에서는 SQL에서 정렬(Sorting)과 그룹화(Grouping)를 수행하는 주요 구문인 ORDER BY
, GROUP BY
, 그리고 HAVING
에 대해 자세히 다룹니다. 각 문법은 데이터 분석 및 보고서 작성에서 매우 빈번하게 사용됩니다.
ORDER BY
는 결과를 특정 열(column) 기준으로 정렬할 때 사용합니다.
SELECT title, budget
FROM films
ORDER BY budget;
title | budget |
---|---|
Tarnation | 218 |
My Date with Drew | 1100 |
A Plague So Pleasant | 1400 |
The Mongol King | 3250 |
... | ... |
ASC
(Ascending): 오름차순 (기본값)DESC
(Descending): 내림차순-- 오름차순 정렬
SELECT title, budget
FROM films
ORDER BY budget ASC;
-- 내림차순 정렬
SELECT title, budget
FROM films
ORDER BY budget DESC;
Tip:
NULL
값은 정렬 시 최상단 또는 최하단에 위치할 수 있습니다.
여러 열을 기준으로 순차적으로 정렬할 수 있습니다. 두 번째 열은 동점(tie-breaker)을 처리하는 역할을 합니다.
SELECT title, wins, imdb_score
FROM best_movies
ORDER BY wins DESC, imdb_score DESC;
title | wins | imdb_score |
---|---|---|
Lord of the Rings: Return… | 11 | 9 |
Ben-Hur | 11 | 8.1 |
Titanic | 11 | 7.9 |
각 열마다 다른 정렬 방향을 지정할 수도 있습니다.
SELECT birthdate, name
FROM people
ORDER BY birthdate ASC, name DESC;
birthdate | name |
---|---|
1990-01-01 | Robert Brown |
1990-02-02 | Anne Smith |
1991-05-14 | Amy Miller |
1991-11-22 | Adam Waters |
SQL은 작성된 순서가 아니라 다음과 같은 논리적 실행 순서를 따릅니다.
-- 작성한 코드
SELECT item
FROM coats
WHERE color = 'yellow'
ORDER BY length
LIMIT 3;
-- 실제 실행 순서
1. FROM
2. WHERE
3. SELECT
4. ORDER BY
5. LIMIT
GROUP BY
는 동일한 값을 가진 행들을 하나의 그룹으로 묶어 요약(집계)할 때 사용합니다.
SELECT certification, COUNT(title) AS title_count
FROM films
GROUP BY certification;
certification | title_count |
---|---|
Unrated | 62 |
G | 112 |
R | 2118 |
PG-13 | 1462 |
Error 주의:
GROUP BY
를 사용할 때 SELECT 절에는 그룹화된 컬럼 또는 집계 함수만 사용할 수 있습니다.
-- ❌ 오류 발생 예시
SELECT certification, title
FROM films
GROUP BY certification;
ERROR: column "films.title" must appear in the GROUP BY clause or be used in an aggregate function
두 개 이상의 열을 기준으로 그룹화할 수 있습니다.
SELECT certification, language, COUNT(title) AS title_count
FROM films
GROUP BY certification, language;
certification | language | title_count |
---|---|---|
Unrated | Japanese | 2 |
R | Norwegian | 2 |
... | ... | ... |
그룹화한 결과를 집계 값 기준으로 정렬할 수도 있습니다.
SELECT certification, COUNT(title) AS title_count
FROM films
GROUP BY certification
ORDER BY title_count DESC;
WHERE
는 그룹화 이전의 개별 행을 필터링하지만, HAVING
은 그룹화 이후의 집계 결과를 필터링합니다.
-- ❌ WHERE로는 집계 결과 필터링 불가
SELECT release_year, COUNT(title) AS title_count
FROM films
GROUP BY release_year
WHERE COUNT(title) > 10;
-- ✅ HAVING 사용
SELECT release_year, COUNT(title) AS title_count
FROM films
GROUP BY release_year
HAVING COUNT(title) > 10;
WHERE
→ 개별 행 필터링HAVING
→ 집계된 그룹 필터링예시:
-- WHERE: 개별 영화 중 2000년에 개봉한 것
SELECT title
FROM films
WHERE release_year = 2000;
-- HAVING: 평균 영화 길이가 2시간 넘는 해
SELECT release_year
FROM films
GROUP BY release_year
HAVING AVG(duration) > 120;
SQL 실행 순서는 다음과 같습니다.
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMIT
이번 장에서 배운 내용:
ORDER BY
를 이용한 정렬 (ASC/DESC, 여러 컬럼)GROUP BY
를 이용한 데이터 집계HAVING
을 사용한 그룹화된 결과 필터링추천 실습:
- 예제 테이블(
films
,best_movies
)을 직접 만들어보고 쿼리 실행해보기ORDER BY
와GROUP BY
,HAVING
을 조합하여 다양한 데이터 요약하기