반응형
Web Development · MySQL
MySQL ORDER BY · DISTINCT · LIMIT —
정렬과 중복 제거 완전 정리
ASC / DESC 다중 정렬 · DISTINCT 중복 제거 · LIMIT 상위 N개 · NULL 정렬 순서
시작 오늘 분석할 코드
-- 가입일 오름차순 (ASC 기본) SELECT name, mDate FROM usertbl ORDER BY mDate; -- 가입일 내림차순 SELECT name, mDate FROM usertbl ORDER BY mDate DESC; -- 복합 정렬: 키 내림차순, 키 같으면 이름 오름차순 SELECT name, height FROM usertbl ORDER BY height DESC, name ASC; -- 중복 지역 제거 후 고유 지역만 표시 SELECT DISTINCT addr FROM usertbl; -- 구매테이블 userID 오름차순 SELECT userID, amount FROM buytbl ORDER BY userID;
핵심 개념 미리보기: ORDER BY는 "어떤 컬럼 기준으로 정렬할지"를 지정한다. ASC(오름차순)가 기본, DESC(내림차순)을 명시해야 역순이 된다.
1 ORDER BY — 정렬 기초
SELECT 결과는 기본적으로 삽입 순서대로 나온다. ORDER BY를 붙이면 원하는 컬럼 기준으로 정렬된 결과를 얻는다.
| 문법 | 의미 | 예시 |
|---|---|---|
ORDER BY 컬럼 |
오름차순 (ASC, 기본) | 1, 2, 3 … / 가, 나, 다 … |
ORDER BY 컬럼 ASC |
오름차순 명시 | ORDER BY name ASC |
ORDER BY 컬럼 DESC |
내림차순 | 큰 수 → 작은 수, Z → A |
ORDER BY 컬럼 DESC, 컬럼2 ASC |
복합 정렬 | height DESC, name ASC |
-- mDate 오름차순 (가장 오래된 가입자부터) SELECT name, mDate FROM usertbl ORDER BY mDate; -- 결과: 1987-01-01, 1993-02-14, 1997-08-21 ... 순 -- mDate 내림차순 (가장 최근 가입자부터) SELECT name, mDate FROM usertbl ORDER BY mDate DESC; -- 결과: 2009-04-04, 2007-07-07, 2003-01-05 ... 순
ASC는 생략 가능 — ORDER BY mDate와 ORDER BY mDate ASC는 동일하다. DESC만 반드시 명시해야 한다.
2 복합 정렬 — 여러 컬럼 기준
콤마로 구분해서 여러 기준을 지정할 수 있다. 첫 번째 기준이 같을 때 두 번째 기준이 적용된다.
-- 키 내림차순, 키가 같으면 이름 오름차순 SELECT name, height FROM usertbl ORDER BY height DESC, name ASC; -- 결과 예시 (height가 같은 경우 name으로 구분) -- 임재범 182 -- 이승기 182 (height 동일 → name 오름차순) -- 김범수 173
| 표현 | 해석 |
|---|---|
ORDER BY height DESC, name ASC |
키 큰 순, 키 같으면 이름 가나다 순 |
ORDER BY addr ASC, name ASC |
지역 가나다 순, 같은 지역이면 이름 가나다 순 |
ORDER BY userID ASC, prodName DESC |
회원ID 오름차순, 같은 ID면 상품명 내림차순 |
3 DISTINCT — 중복 제거
SELECT addr FROM usertbl는 10명 모두의 addr을 반환해 서울, 경남 등이 여러 번 나온다. DISTINCT를 붙이면 같은 값을 하나로 합쳐서 고유 목록만 출력한다.
-- 중복 포함 (10개 행) SELECT addr FROM usertbl; -- 서울 / 경북 / 서울 / 경남 / 경남 / 경남 / 서울 / 강원 / 경북 / 경남 -- DISTINCT로 고유값만 (5개 행) SELECT DISTINCT addr FROM usertbl; -- 서울 / 경북 / 경남 / 강원 → 중복 없음 -- 여러 컬럼 DISTINCT (조합이 고유한 것만) SELECT DISTINCT addr, mDate FROM usertbl;
SELECT addr (중복 포함)
서울 경북 서울 ← 중복 경남 경남 ← 중복
전체 행 수만큼 출력
SELECT DISTINCT addr (고유값)
서울 경북 경남 강원
고유한 값만 출력
DISTINCT는 SELECT 키워드 바로 뒤에 한 번만 쓴다.
SELECT addr, DISTINCT name처럼 중간에 쓸 수 없다. 여러 컬럼이면 SELECT DISTINCT addr, name처럼 쓰면 두 컬럼 조합이 고유한 것만 남긴다.
반응형
4 LIMIT — 상위 N개만 추출
ORDER BY로 정렬한 뒤 상위 N개만 가져올 때 LIMIT을 사용한다. 페이징 처리에도 자주 쓴다.
-- 키가 가장 큰 회원 3명 SELECT name, height FROM usertbl ORDER BY height DESC LIMIT 3; -- OFFSET: 3번째부터 3개 (페이징) SELECT name, height FROM usertbl ORDER BY height DESC LIMIT 3 OFFSET 3; -- 또는: LIMIT 3, 3 (LIMIT offset, count 순서)
| 문법 | 의미 |
|---|---|
LIMIT 5 |
상위 5개 행만 반환 |
LIMIT 5 OFFSET 10 |
10개 건너뛰고 5개 반환 (11~15번째) |
LIMIT 10, 5 |
OFFSET 10, 5개 반환 (LIMIT offset, count) |
LIMIT은 SELECT 실행 마지막에 처리된다 — ORDER BY 정렬 후 잘라낸다. ORDER BY 없이 LIMIT만 쓰면 순서가 보장되지 않아 결과가 매 쿼리마다 달라질 수 있다.
5 NULL 정렬 순서
컬럼에 NULL 값이 있으면 정렬 시 위치가 중요하다. MySQL에서 NULL은 오름차순 정렬 시 맨 앞, 내림차순 시 맨 뒤에 배치된다.
-- NULL이 있는 컬럼 정렬 예시 (height SMALLINT NULL 허용) SELECT name, height FROM usertbl ORDER BY height ASC; -- NULL → 170 → 173 → 176 ... 순 (NULL 먼저) SELECT name, height FROM usertbl ORDER BY height DESC; -- 183 → 182 → ... → NULL 순 (NULL 마지막) -- NULL을 맨 뒤로 보내고 싶을 때 (오름차순) SELECT name, height FROM usertbl ORDER BY height IS NULL ASC, height ASC;
| 정렬 방향 | NULL 위치 |
|---|---|
| ASC (오름차순) | NULL이 맨 앞에 나옴 |
| DESC (내림차순) | NULL이 맨 뒤에 나옴 |
| ORDER BY col IS NULL ASC, col ASC | NULL을 마지막으로 이동 (꼼수) |
6 SELECT 실행 순서
SQL 키워드는 쓰는 순서와 실행 순서가 다르다. ORDER BY는 SELECT 다음으로 마지막에 실행된다.
| 실행 단계 | 키워드 | 설명 |
|---|---|---|
| ① | FROM | 어떤 테이블에서 읽을지 결정 |
| ② | WHERE | 행 필터링 (조건에 맞는 행만 남김) |
| ③ | GROUP BY | 그룹 묶기 |
| ④ | HAVING | 그룹 필터링 |
| ⑤ | SELECT | 출력할 컬럼 선택 + AS 별칭 적용 |
| ⑥ | DISTINCT | 중복 제거 |
| ⑦ | ORDER BY | 정렬 (AS 별칭 사용 가능) |
| ⑧ | LIMIT | 상위 N개 추출 |
ORDER BY는 SELECT 이후에 실행되므로 AS 별칭을 ORDER BY 절에서 참조할 수 있다.
SELECT name AS 이름 FROM usertbl ORDER BY 이름 ASC; — 이 쿼리는 유효하다.반면 WHERE 절은 SELECT보다 먼저 실행되므로 WHERE 절에서는 AS 별칭을 쓸 수 없다.
WHERE 이름 = '김경호'처럼 쓰면 오류가 난다.7 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| ORDER BY 위치 잘못 | Syntax error | ORDER BY는 WHERE, GROUP BY, HAVING 다음 맨 마지막 |
| DISTINCT를 여러 번 씀 | Syntax error | SELECT 바로 뒤에 한 번만, DISTINCT addr, name |
| WHERE에서 AS 별칭 사용 | Unknown column 오류 | WHERE는 SELECT보다 먼저 실행됨 — 원래 컬럼명 사용 |
| ORDER BY 없이 LIMIT 사용 | 매번 다른 결과 | 순서 보장하려면 반드시 ORDER BY 먼저 |
| NULL 정렬 기대와 다름 | NULL이 예상 위치에 없음 | ASC → NULL 먼저, DESC → NULL 나중 |
핵심 한 줄 요약
ORDER BY 컬럼 ASC오름차순 정렬 (기본, ASC 생략 가능)
ORDER BY 컬럼 DESC내림차순 정렬 (큰 수→작은 수, Z→A)
A DESC, B ASC복합 정렬 — A 같으면 B 기준으로 이차 정렬
SELECT DISTINCT 컬럼중복 제거 고유값 목록 반환
LIMIT N상위 N개만 반환 — 항상 ORDER BY 다음에 사용
LIMIT N OFFSET MM개 건너뛰고 N개 반환 — 페이징 구현에 활용
NULL + ASCNULL이 맨 앞에 배치됨
ORDER BY 실행 순서FROM → WHERE → GROUP BY → SELECT → ORDER BY → LIMIT
ORDER BY에서 AS 가능SELECT 이후 실행되므로 별칭 참조 가능
WHERE에서 AS 불가WHERE는 SELECT보다 먼저 실행 — 원래 컬럼명 사용
DISTINCT 위치SELECT 바로 뒤에 한 번만 — 여러 컬럼은 조합 고유값
실무 활용ORDER BY + LIMIT = 게시판 최신글/인기글 TOP N 구현
ORDER BY 숫자 인덱스ORDER BY 2 = SELECT 두 번째 컬럼 기준 (권장하지 않음)
LIMIT 10, 5 형식LIMIT offset, count 순서 — LIMIT 5 OFFSET 10과 동일
문자열 정렬VARCHAR 컬럼 ORDER BY = 사전순 (가나다, ABC) 정렬
날짜 정렬DATE/DATETIME 컬럼 ORDER BY = 오래된 날짜가 먼저 (ASC 기준)
CASE 정렬ORDER BY CASE WHEN ... END 로 커스텀 순서 지정 가능 (심화)
SELECT * 정렬SELECT * FROM usertbl ORDER BY name — 전체 컬럼 + 이름순
GROUP BY + ORDER BYGROUP BY로 집계 후 ORDER BY로 집계 결과 정렬
DISTINCT + ORDER BYDISTINCT 중복제거 후 ORDER BY 정렬 — 중복 없는 정렬 목록
ORDER BY + WHEREWHERE로 행 필터 후 ORDER BY 정렬 — 순서 무관하게 쓰면 됨
Tags
#MySQL #ORDER BY #ASC #DESC #DISTINCT #LIMIT #정렬 #중복제거 #SQL #데이터베이스 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, ORDER BY, ASC, DESC, DISTINCT, LIMIT, 정렬, 중복제거, SQL, 데이터베이스, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| MySQL 서브쿼리 · ANY · ALL · IN 완전 정리 (0) | 2026.07.14 |
|---|---|
| MySQL GROUP BY · 집계함수 · AS 완전 정리 (0) | 2026.07.14 |
| MySQL INSERT INTO — 데이터 삽입 완전 정리 (0) | 2026.07.14 |
| MySQL FOREIGN KEY — buytbl 구매 테이블 완전 정리 (1) | 2026.07.14 |
| MySQL SELECT · WHERE 조건 조회 완전 정리 (1) | 2026.07.14 |
왕진 블로그

댓글