MMeshOps
바이브코딩을 위한 완벽한 방어선: SQL과 PostgreSQL 기초
5예상 8입문

데이터 정렬과 통계 내기

데이터를 인기순, 최신순으로 정렬하는 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"]
]} />
  1. 11. SELECT 뒤에 '묶을 기준이 되는 컬럼'과 '계산할 함수'를 적습니다.
  2. 22. GROUP BY 뒤에 아까 정한 '묶을 기준 컬럼'을 명시하여 데이터베이스에게 덩어리 지시를 내립니다.

바이브코딩 시 주의할 점이 있습니다. 통계 쿼리를 짤 때, AI가 백엔드 코드의 메모리 위에서 직접 반복문(for문)을 돌리며 카운트를 세려고 시도하는 경우가 종종 있습니다. 유저가 100만 명이면 반복문을 100만 번 돌아야 하므로 서버가 뻗어버립니다. 이때 단호하게 "통계는 백엔드 메모리에서 계산하지 말고, GROUP BY와 COUNT를 써서 데이터베이스 단에서 처리하는 쿼리로 다시 짜줘"라고 지시할 수 있어야 진정한 관리자입니다.

정렬과 통계 사용 시 실무 팁

  1. 1ORDER BY나 집계 함수(COUNT, SUM)는 데이터베이스 CPU를 많이 쓰는 무거운 작업입니다. 전체 데이터가 아닌, WHERE 절로 필요한 범위를 먼저 좁힌 뒤에 정렬하는 것이 기본입니다.
  2. 2최신순 정렬(ORDER BY id DESC 또는 created_at DESC)은 커뮤니티 서비스 목록 조회 쿼리의 필수 옵션이므로, AI가 빼먹지 않았는지 항상 검수하세요.
  3. 3집계 함수로 뽑아낸 결과 컬럼은 이름이 못생기게 나오는 경우가 많으므로, AS 키워드를 써서(예: COUNT(id) AS total_users) 프론트엔드가 쓰기 쉬운 예쁜 별명으로 바꿔 전달합니다.

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

쇼핑몰 리뷰 게시판에서 모든 리뷰 데이터를 가져올 때, 평점(rating)이 가장 높은 5점짜리 칭찬 리뷰가 맨 위에 오도록 정렬하고 싶습니다. 빈칸에 들어갈 알맞은 단어는 무엇인가요? [ ORDER BY rating (빈칸) ]

3줄 요약

  1. 1ORDER BY 구문은 데이터베이스에서 꺼낸 자료의 순서를 정돈하며, 실무에서는 최신순/인기순을 나타내는 내림차순(DESC) 옵션이 압도적으로 많이 쓰입니다.
  2. 2GROUP BY는 특정 컬럼을 기준으로 데이터를 덩어리로 묶어, 엑셀의 피벗 테이블처럼 종류별 통계를 내는 데 사용됩니다.
  3. 3데이터의 개수(COUNT)나 합계(SUM) 같은 통계 연산은 백엔드 앱(Node.js, 파이썬 등)에서 반복문으로 처리하지 말고 반드시 빠르고 튼튼한 DB의 GROUP BY 연산에 맡겨야 합니다.