
이 글에서는 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 실행 순서는 다음과 같습니다.
FROMWHEREGROUP BYHAVINGSELECTORDER BYLIMIT이번 장에서 배운 내용:
ORDER BY를 이용한 정렬 (ASC/DESC, 여러 컬럼)GROUP BY를 이용한 데이터 집계HAVING을 사용한 그룹화된 결과 필터링추천 실습:
- 예제 테이블(
films,best_movies)을 직접 만들어보고 쿼리 실행해보기ORDER BY와GROUP BY,HAVING을 조합하여 다양한 데이터 요약하기