8. 데이터 정렬, 필터링, GROUP BY와 HAVING
데이터를 원하는 순서대로 정렬하고, 복잡한 조건으로 필터링하며, 특정 기준으로 그룹화하여 통계를 내는 SQL 가공 방법을 배웁니다.
1. 데이터 필터링, 정렬, 그룹화의 정의
데이터 필터링, 정렬, 그룹화는 데이터베이스에 저장된 수많은 원본 데이터 중에서 내가 원하는 조건의 데이터만 골라내고(필터링), 특정 순서로 줄 세우고(정렬), 요약된 통계치로 묶어서(그룹화) 가공하는 작업입니다.
단순히 저장된 데이터를 그대로 읽는 단계를 넘어, 의미 있는 정보나 통계 자료로 가공하기 위한 SQL 핵심 기술입니다.
2. 데이터 가공 기술이 필요한 이유
실무에서는 데이터를 한 줄씩 읽는 일보다 대량의 데이터를 요약해서 보고해야 하는 일이 훨씬 많습니다. 수만 건의 판매 기록 데이터를 그대로 보면 아무 의미가 없기 때문입니다.
실제 개발에서 해결하는 문제
- 실시간 랭킹 및 정렬 기능: 쇼핑몰 서비스에서 "리뷰 많은 순", "가격 낮은 순", "최신 등록 순"으로 상품을 실시간 정렬하여 소비자에게 보여줍니다.
- 비즈니스 통계 데이터 추출: "지난달 우리 웹사이트의 일별 가입자 수" 또는 "카테고리별 매출 총합"처럼 경영 지표에 필요한 통계치를 단 한 줄의 명령어로 뽑아낼 수 있습니다.
3. 반드시 알아야 할 핵심 개념
- ORDER BY (정렬): 데이터를 특정 열을 기준으로 오름차순(ASC, 기본값) 또는 내림차순(DESC) 정렬하는 명령어입니다.
- GROUP BY (그룹화): 동일한 값을 가진 데이터들을 하나의 그룹으로 묶어 주는 명령어입니다. (예: 회원들을 '지역별'로 묶기)
- 집계 함수 (Aggregate Function): 여러 행의 데이터를 계산하여 하나의 요약된 숫자로 반환하는 함수입니다.
SUM(합계),AVG(평균),COUNT(개수),MAX(최대치),MIN(최소치) 등이 있습니다. - HAVING 절: GROUP BY로 묶인 그룹 결과 데이터에 조건을 걸어 필터링할 때 사용하는 명령어입니다.
4. 함께 알아야 하는 주변 기초 개념
WHERE 절에서 복잡한 필터링 조건을 걸 때 실무에서 자주 쓰는 연산자들입니다.
- LIKE: 문자열에서 특정 패턴을 검색합니다.
%기호와 함께 쓰며,LIKE '%노트북%'은 '노트북'이라는 단어가 포함된 모든 데이터를 찾습니다. - IN: 여러 조건 중 하나라도 일치하는 데이터를 찾습니다.
WHERE 지역 IN ('서울', '경기')는 서울 또는 경기 지역 데이터를 모두 가져옵니다. - BETWEEN: 특정 범위 사이에 있는 데이터를 찾습니다.
WHERE 가격 BETWEEN 10000 AND 20000은 1만 원 이상 2만 원 이하인 대상을 가려냅니다.
5. SQL 명령어의 실행 처리 흐름
SQL 쿼리문은 우리가 화면에 코드를 적는 순서와 데이터베이스 엔진이 실제로 처리하는 실행 순서가 완전히 다릅니다. 이 작동 흐름을 순서대로 이해해야 올바른 코드를 짤 수 있습니다.
- FROM: 데이터를 가져올 대상 테이블을 먼저 지정합니다.
- WHERE: 원본 데이터에서 조건에 맞지 않는 행을 1차로 필터링하여 탈락시킵니다.
- GROUP BY: 남은 데이터들을 지정한 열 기준에 따라 그룹으로 묶습니다.
- HAVING: 묶인 그룹 통계 결과 중에서 조건에 맞는 그룹만 2차로 필터링합니다.
- SELECT: 최종 화면에 노출할 열 이름과 집계 함수 결과를 계산하여 뽑아냅니다.
- ORDER BY: 완성된 최종 결과물 데이터를 정해진 순서대로 줄 세워 사용자 화면에 띄웁니다.
6. 데이터 가공 SQL 코드 예시
상품 테이블(products)에서 판매 중인 상품들을 대상으로, 카테고리별 평균 가격이 50만 원 이상인 카테고리를 찾아서 평균 가격이 높은 순서대로 정렬하는 종합 예제입니다.
SELECT category, AVG(price) FROM products WHERE status = 'sale' GROUP BY category HAVING AVG(price) >= 500000 ORDER BY AVG(price) DESC;
7. 예시 코드 상세 설명
- SELECT category, AVG(price): 화면에 카테고리 이름과 해당 카테고리의 상품 평균(AVG) 가격을 출력하라는 명령입니다.
- FROM products WHERE status = 'sale':
products테이블에서 현재 판매 중(status = 'sale')인 상품만 먼저 가려내어 가져옵니다. - GROUP BY category: 가려낸 상품들을 전자기기, 의류, 가구 등 '카테고리'별로 묶어 그룹을 만듭니다.
- HAVING AVG(price) >= 500000: 카테고리 그룹들의 평균 가격을 계산하여, 그 금액이 50만 원 이상인 그룹(예: 전자기기)만 남기고 나머지는 탈락시킵니다.
- ORDER BY AVG(price) DESC;: 살아남은 카테고리 그룹들을 평균 가격이 가장 높은 순서(내림차순, DESC)로 줄 세워 최종 출력합니다.
8. 초보자가 가장 많이 틀리는 WHERE와 HAVING의 차이점
데이터를 필터링한다는 목적은 같지만, 두 구문은 조건을 거는 대상과 실행 시점이 완전히 다릅니다. 초보자분들이 이를 섞어 써서 에러를 내는 경우가 매우 많습니다.
- WHERE 절: 테이블의 개별 행(Row) 하나하나에 조건을 겁니다. 그룹화가 일어나기 전에 실행되므로, WHERE 절 안에는
AVG(),SUM()같은 집계 함수를 절대로 사용할 수 없습니다.
(예:WHERE AVG(price) >= 50000-> 시스템 에러 발생) - HAVING 절: GROUP BY로 묶인 '그룹 결과 데이터'에 조건을 겁니다. 따라서 집계 함수를 사용한 조건식은 반드시 HAVING 절에만 적어주어야 합니다.
9. 핵심 내용 요약
SQL에서 통계 데이터를 만들려면 데이터를 정렬하는 ORDER BY, 특정 기준별로 묶어주는 GROUP BY, 그리고 집계 함수를 유기적으로 사용해야 합니다. 개별 행을 1차로 필터링하는 WHERE 절과 그룹 통계 데이터를 2차로 필터링하는 HAVING 절의 차이점을 명확히 구별하는 것이 실무 쿼리 작성의 핵심입니다.
10. 핵심 용어 정리
ORDER BY = 데이터를 특정 열의 값 기준으로 오름차순 또는 내림차순 정렬하는 명령어
GROUP BY = 테이블의 데이터를 특정 기준 열에 따라 그룹으로 묶어주는 명령어
집계 함수 = 여러 행의 데이터를 합쳐서 총합, 평균, 개수 등의 단일 통계값으로 계산해주는 함수
HAVING = GROUP BY로 묶인 그룹 결과 데이터에 조건 필터링을 적용하는 명령어
LIKE = 문자열 데이터에서 특정 글자 패턴이 포함되어 있는지 검색하는 조건 연산자
AD
제휴 광고
일부 링크는 제휴 링크이며, 구매 또는 가입 시 일정 수수료를 받을 수 있습니다.
AD