INTERMEDIATE SQL 핵심 개념 요약 4

0


Intermediate SQL

ORDER BY, GROUP BY, HAVING 완벽 정리

이 글에서는 SQL에서 정렬(Sorting)그룹화(Grouping)를 수행하는 주요 구문인 ORDER BY, GROUP BY, 그리고 HAVING에 대해 자세히 다룹니다. 각 문법은 데이터 분석 및 보고서 작성에서 매우 빈번하게 사용됩니다.


1. ORDER BY – 결과 정렬하기

ORDER BY는 결과를 특정 열(column) 기준으로 정렬할 때 사용합니다.

SELECT title, budget 
FROM films 
ORDER BY budget;
titlebudget
Tarnation218
My Date with Drew1100
A Plague So Pleasant1400
The Mongol King3250
......

🔹 기본 정렬 방향

  • ASC (Ascending): 오름차순 (기본값)
  • DESC (Descending): 내림차순
-- 오름차순 정렬
SELECT title, budget 
FROM films 
ORDER BY budget ASC;

-- 내림차순 정렬
SELECT title, budget 
FROM films 
ORDER BY budget DESC;

Tip: NULL 값은 정렬 시 최상단 또는 최하단에 위치할 수 있습니다.


2. 여러 필드를 기준으로 정렬하기

여러 열을 기준으로 순차적으로 정렬할 수 있습니다. 두 번째 열은 동점(tie-breaker)을 처리하는 역할을 합니다.

SELECT title, wins, imdb_score 
FROM best_movies 
ORDER BY wins DESC, imdb_score DESC;
titlewinsimdb_score
Lord of the Rings: Return…119
Ben-Hur118.1
Titanic117.9

3. 다른 순서 조합

각 열마다 다른 정렬 방향을 지정할 수도 있습니다.

SELECT birthdate, name 
FROM people 
ORDER BY birthdate ASC, name DESC;
birthdatename
1990-01-01Robert Brown
1990-02-02Anne Smith
1991-05-14Amy Miller
1991-11-22Adam Waters

4. ORDER BY의 실행 순서

SQL은 작성된 순서가 아니라 다음과 같은 논리적 실행 순서를 따릅니다.

-- 작성한 코드
SELECT item
FROM coats
WHERE color = 'yellow'
ORDER BY length
LIMIT 3;

-- 실제 실행 순서
1. FROM
2. WHERE
3. SELECT
4. ORDER BY
5. LIMIT

5. GROUP BY – 데이터 그룹화하기

GROUP BY는 동일한 값을 가진 행들을 하나의 그룹으로 묶어 요약(집계)할 때 사용합니다.

SELECT certification, COUNT(title) AS title_count
FROM films
GROUP BY certification;
certificationtitle_count
Unrated62
G112
R2118
PG-131462

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

6. GROUP BY 여러 필드

두 개 이상의 열을 기준으로 그룹화할 수 있습니다.

SELECT certification, language, COUNT(title) AS title_count
FROM films
GROUP BY certification, language;
certificationlanguagetitle_count
UnratedJapanese2
RNorwegian2
.........

7. GROUP BY + ORDER BY 조합

그룹화한 결과를 집계 값 기준으로 정렬할 수도 있습니다.

SELECT certification, COUNT(title) AS title_count
FROM films
GROUP BY certification
ORDER BY title_count DESC;

8. HAVING – 그룹화된 결과 필터링

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;

9. HAVING vs WHERE 차이

  • 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;

10. ORDER OF EXECUTION (정리)

SQL 실행 순서는 다음과 같습니다.

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
  7. LIMIT

✅ 마무리

이번 장에서 배운 내용:

  • ORDER BY를 이용한 정렬 (ASC/DESC, 여러 컬럼)
  • GROUP BY를 이용한 데이터 집계
  • HAVING을 사용한 그룹화된 결과 필터링
  • SQL 실행 순서의 이해

추천 실습:

  • 예제 테이블(films, best_movies)을 직접 만들어보고 쿼리 실행해보기
  • ORDER BYGROUP BY, HAVING을 조합하여 다양한 데이터 요약하기

0개의 댓글