본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL ORDER BY · DISTINCT · LIMIT 완전 정리

by 왕진 2026. 7. 14.
반응형

 

 

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, 데이터베이스, 웹개발, 티스토리
반응형

댓글