데이터 정렬과 통계 내기
데이터를 인기순, 최신순으로 정렬하는 ORDER BY와, 일일 가입자 수 등 통계를 내기 위한 GROUP BY의 사용법을 학습합니다.
게시판에 글이 1만 개 쌓였습니다. 유저들은 "최신순으로 보여주세요", "좋아요가 많은 인기순으로 보여주세요"라고 요구합니다. 또는 관리자 페이지에서 "어제 하루 동안 가입한 유저 수가 총 몇 명인가요?" 같은 통계 정보를 원합니다. 이런 요구사항을 해결하기 위해 자바스크립트나 파이썬 코드로 데이터 1만 개를 다 끌고 와서 정렬하고 계산하려면 서버가 터져버릴 것입니다. 이번 시간에는 데이터베이스 엔진의 엄청난 계산 능력을 빌려 데이터를 입맛대로 정렬하고 엑셀의 피벗 테이블처럼 통계를 내는 `ORDER BY`와 `GROUP BY`를 배웁니다.
줄 세우기: `ORDER BY`
우리가 `SELECT`와 `WHERE`로 데이터를 걸러냈을 때, 데이터베이스는 그냥 자기가 디스크에서 찾은 순서대로(랜덤하게) 데이터를 던져줍니다. 쇼핑몰에서 상품을 조회했는데 최신순도, 가격순도 아닌 뒤죽박죽 순서로 나온다면 아무도 그 쇼핑몰을 쓰지 않을 것입니다.
원하는 컬럼을 기준으로 데이터를 예쁘게 정렬해 주는 구문이 `ORDER BY`입니다. SQL 문장의 맨 마지막 즈음에 위치합니다.
최신순과 인기순 정렬
-- 1. 가장 최근에 쓴 글부터 보기 (최신순)
SELECT title, created_at
FROM posts
ORDER BY created_at DESC;
-- 2. 좋아요가 많은 글부터, 좋아요가 같다면 최신글부터 보기
SELECT title, likes, created_at
FROM posts
ORDER BY likes DESC, created_at DESC;`ORDER BY` 뒤에 기준이 될 컬럼 이름을 적고, 그 뒤에 오름차순(점점 커짐)인지 내림차순(점점 작아짐)인지 방향을 적어줍니다.
- `ASC` (Ascending): 오름차순. 1부터 100까지, 과거부터 현재까지, A부터 Z까지. (생략하면 기본값이 ASC입니다)
- `DESC` (Descending): 내림차순. 100부터 1까지, 최신부터 과거까지, Z부터 A까지. 실무에서 가장 많이 쓰이는 마법의 단어입니다. (최신순, 인기순 등은 모두 숫자가 큰 것부터 줄어드는 내림차순입니다.)
끼리끼리 모아서 묶기: `GROUP BY`
어드민(관리자) 페이지 대시보드에 '일일 가입자 수 추이'나 '카테고리별 게시글 개수'를 그래프로 그리려면 어떻게 해야 할까요? 엑셀의 피벗 테이블 기능처럼, 특정 기준을 가지고 데이터들을 뭉텅이로 묶어낸 다음 덩어리별로 통계를 내주는 구문이 `GROUP BY`입니다.
이 구문은 혼자 쓰이지 않고, 반드시 덩어리를 계산해 주는 집계 함수(Aggregate Function)와 짝꿍으로 붙어 다닙니다. 대표적인 집계 함수로는 `COUNT` (개수 세기), `SUM` (합계 내기), `AVG` (평균 내기)가 있습니다.
GROUP BY와 통계 함수의 콤보
sql```sql
-- 각 유저의 등급(VIP, 일반 등)별로 회원이 몇 명씩 있는지 세어주세요.
SELECT role, COUNT(id) AS member_count
FROM users
GROUP BY role;
```
결과는 아래처럼 나옵니다.
<TableBlock title="GROUP BY 결과 예시" columns={["role", "member_count"]} rows={[
["admin", "3"],
["vip", "150"],
["normal", "9800"]
]} />- 11. SELECT 뒤에 '묶을 기준이 되는 컬럼'과 '계산할 함수'를 적습니다.
- 22. GROUP BY 뒤에 아까 정한 '묶을 기준 컬럼'을 명시하여 데이터베이스에게 덩어리 지시를 내립니다.
바이브코딩 시 주의할 점이 있습니다. 통계 쿼리를 짤 때, AI가 백엔드 코드의 메모리 위에서 직접 반복문(for문)을 돌리며 카운트를 세려고 시도하는 경우가 종종 있습니다. 유저가 100만 명이면 반복문을 100만 번 돌아야 하므로 서버가 뻗어버립니다. 이때 단호하게 "통계는 백엔드 메모리에서 계산하지 말고, GROUP BY와 COUNT를 써서 데이터베이스 단에서 처리하는 쿼리로 다시 짜줘"라고 지시할 수 있어야 진정한 관리자입니다.
정렬과 통계 사용 시 실무 팁
- 1ORDER BY나 집계 함수(COUNT, SUM)는 데이터베이스 CPU를 많이 쓰는 무거운 작업입니다. 전체 데이터가 아닌, WHERE 절로 필요한 범위를 먼저 좁힌 뒤에 정렬하는 것이 기본입니다.
- 2최신순 정렬(ORDER BY id DESC 또는 created_at DESC)은 커뮤니티 서비스 목록 조회 쿼리의 필수 옵션이므로, AI가 빼먹지 않았는지 항상 검수하세요.
- 3집계 함수로 뽑아낸 결과 컬럼은 이름이 못생기게 나오는 경우가 많으므로, AS 키워드를 써서(예: COUNT(id) AS total_users) 프론트엔드가 쓰기 쉬운 예쁜 별명으로 바꿔 전달합니다.
개념 퀴즈
퀴즈 답을 맞춰야 학습 완료가 됩니다.쇼핑몰 리뷰 게시판에서 모든 리뷰 데이터를 가져올 때, 평점(rating)이 가장 높은 5점짜리 칭찬 리뷰가 맨 위에 오도록 정렬하고 싶습니다. 빈칸에 들어갈 알맞은 단어는 무엇인가요? [ ORDER BY rating (빈칸) ]
3줄 요약
- 1ORDER BY 구문은 데이터베이스에서 꺼낸 자료의 순서를 정돈하며, 실무에서는 최신순/인기순을 나타내는 내림차순(DESC) 옵션이 압도적으로 많이 쓰입니다.
- 2GROUP BY는 특정 컬럼을 기준으로 데이터를 덩어리로 묶어, 엑셀의 피벗 테이블처럼 종류별 통계를 내는 데 사용됩니다.
- 3데이터의 개수(COUNT)나 합계(SUM) 같은 통계 연산은 백엔드 앱(Node.js, 파이썬 등)에서 반복문으로 처리하지 말고 반드시 빠르고 튼튼한 DB의 GROUP BY 연산에 맡겨야 합니다.