su-tudy 님의 블로그

ORDER BY와 LIMIT 본문

DBMS/Part 2. DML

ORDER BY와 LIMIT

su-tudy 2024. 9. 22. 21:36

 

𖤐 데이터 정렬과 개수 제한

 

데이터를 조회할 때 원하는 순서로 정렬하거나 필요한 만큼만 잘라서 가져오는 게 필요할 때가 많다. ORDER BY로 정렬하고 LIMIT으로 개수를 제한하는 건 실무에서도 자주 쓰이는 조합이다.

 


𖤐 정리 노트

 

✧ ORDER BY - 정렬

조회 결과를 특정 컬럼 기준으로 정렬할 때 사용한다.

-- 오름차순 정렬 (기본값, ASC 생략 가능)
SELECT column1, column2
FROM table_name
ORDER BY column1 ASC;

-- 내림차순 정렬
SELECT column1, column2
FROM table_name
ORDER BY column1 DESC;

 

▸여러 컬럼 혼합 정렬

컬럼을 여러 개 지정할 수 있고, 각각 다른 방향으로 정렬할 수 있다.

-- column1은 오름차순, column2는 내림차순
SELECT *
FROM table_name
ORDER BY column1 ASC, column2 DESC;

왼쪽 컬럼이 우선 적용되고, 해당 값이 같은 행끼리 다음 컬럼 기준으로 정렬된다.

-- 부서 오름차순으로 정렬하되, 같은 부서 내에서는 나이 내림차순
SELECT name, dept, age
FROM employees
ORDER BY dept ASC, age DESC;

 


✧ LIMIT - 개수 제한

반환할 행의 수를 제한할 때 사용한다.

-- 상위 5개 행만 조회
SELECT column_name
FROM table_name
WHERE condition
LIMIT 5;

 

▸ OFFSET - 시작 위치 지정

OFFSET은 몇 번째 행부터 가져올지 시작 위치를 지정한다. 인덱스는 0부터 시작한다.

-- 6번째 행부터 5개 조회 (OFFSET 5 = 0~4를 건너뜀)
SELECT *
FROM table_name
LIMIT 5 OFFSET 5;

페이지네이션(목록을 페이지로 나눠서 보여주는 것)을 구현할 때 자주 쓰인다.

-- 1페이지 (1~10번째)
SELECT * FROM table_name LIMIT 10 OFFSET 0;

-- 2페이지 (11~20번째)
SELECT * FROM table_name LIMIT 10 OFFSET 10;

-- 3페이지 (21~30번째)
SELECT * FROM table_name LIMIT 10 OFFSET 20;

 


𖤐 체크포인트

 

🚨 주의 — OFFSET이 커질수록 느려진다
OFFSET은 건너뛴다는 개념이 아니라 앞에서부터 읽은 다음 버리는 방식으로 동작한다. 그래서 OFFSET 값이 클수록 실제로는 더 많은 데이터를 읽고 버리기 때문에 성능이 점점 느려진다. 데이터가 적을 땐 체감이 없지만, 대용량 테이블에서 페이지네이션을 구현할 땐 이 점을 염두에 두는 게 좋다.

SELECT * FROM table_name LIMIT 10 OFFSET 0; → 이건 빠름
SELECT * FROM table_name LIMIT 10 OFFSET 1000000; → 이건 느림 (100만 건을 읽고 버린 뒤 10개 반환)

🚨 주의 — ORDER BY 없는 LIMIT은 순서 보장이 안 됨
ORDER BY 없이 LIMIT만 쓰면 어떤 행이 반환될지 보장이 안 된다. 항상 ORDER BY랑 같이 쓰는 게 안전하다.

SELECT * FROM users LIMIT 5; → 순서 보장 안 됨
SELECT * FROM users ORDER BY id ASC LIMIT 5; → 이렇게 써야 안전

 


𖤐 오늘의 한 줄 요약

 

ORDER BY로 정렬하고 LIMIT으로 개수를 자른다. OFFSET으로 시작 위치를 지정할 수 있지만 값이 커질수록 성능이 떨어지니 주의하고, LIMIT은 항상 ORDER BY와 함께 쓰자.

'DBMS > Part 2. DML' 카테고리의 다른 글

JOIN (INNER, LEFT, RIGHT, OUTER)  (0) 2024.10.11
GROUP BY와 HAVING  (0) 2024.09.24
COUNT, SUM, AVG, MAX, MIN  (0) 2024.09.23
WHERE와 연산자  (0) 2024.09.20
SELECT, INSERT, UPDATE, DELETE  (0) 2024.09.17