Post

1.4 Order By (SQL)

SQL을 이용하여 조회를 하다보면 특정 기준을 통한 정렬이 필요하다. 또한 SELECT문을 실행했을 때 database는 저장하고 있는 모든 데이터를 반환하려하기 때문에 제한하는 구문이 필수적이다.

정렬과 조회할 row를 제한하는 SQL 구문으로는 ORDER BY, OFFSET, LIMIT가 있다.

ORDER BY

데이터를 조회할 때 때때로 생성 시간 순이나 이름 순 같은 특정 조건으로 정렬해야 할 필요가 있다. 이럴 때 사용하는 기능이 바로 ORDER BY다. ORDER BY 구문은 다음과 같이 사용할 수 있다:

1
SELECT columns... FROM tb_name ORDER BY col_name;

Table 0: Customer Table

namecreated_atgender
김철수2022-01-01male
이영희2022-03-01female
홍길동2022-04-01male
조용현2022-02-01male
홍길순2022-03-01female

만약 customer 테이블에서 회원 정보를 이름 순으로 조회하고 싶다면, 다음과 같이 작성할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
SELECT * FROM customer ORDER BY name;
-- 조회 결과:
-- +-----+----------+------+
-- |name |created_at|gender|
-- +-----+----------+------+
-- |김철수|2022-01-01|male  |
-- |이영희|2022-03-01|female|
-- |조용현|2022-02-01|male  |
-- |홍길동|2022-04-01|male  |
-- |홍길순|2022-03-01|female|
-- +-----+----------+------+

정렬 순서 (ASC, DESC)

하지만 회원 정보를 최근 가입한 회원순으로 조회한다고 가정해보자. 해당 요구사항을 만족하기 위해서는 create_at 컬럼을 기준으로 내림차순 정렬을 해야한다. 정렬 순서는 ORDER BY col_name 이후에 DESC/ASC 키워드를 통해서 지정할 수있다. 지정하지 않는 경우에는 오름차순으로 정렬된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 오름차순 (default)
SELECT * FROM customer ORDER BY name ASC;
-- 내림차순
SELECT * FROM customer ORDER BY created_at DESC;
-- 조회 결과:
-- +-----+----------+------+
-- |name |created_at|gender|
-- +-----+----------+------+
-- |홍길동|2022-04-01|male  |
-- |이영희|2022-03-01|female|
-- |홍길순|2022-03-01|female|
-- |김철수|2022-01-01|male  |
-- |조용현|2022-02-01|male  |
-- +-----+----------+------+

n차 정렬

또한 SQL에서는 n차 정렬을 지정한다. ,를 구분자로, 다음 정렬 순서를 지정할 수 있으며 다음과 같이 사용할 수 있다:

1
2
3
4
5
6
7
8
9
10
11
12
-- 성별로 정렬 후 이름으로 정렬
SELECT * FROM customer ORDER BY gender ASC, name ASC;
-- 조회 결과:
-- +-----+----------+------+
-- |name |created_at|gender|
-- +-----+----------+------+
-- |이영희|2022-03-01|female|
-- |홍길순|2022-03-01|female|
-- |김철수|2022-01-01|male  |
-- |조용현|2022-02-01|male  |
-- |홍길동|2022-04-01|male  |
-- +-----+----------+------+

LIMIT, OFFSET

Customer Table에서 2 ~ 4번 째로 가입한 회원의 정보가 필요하다고 가정해보자. 이때는 테이블의 모든 데이터가 이닌 일정 범위를 조회해야한다. 이때 사용 가능한 구문이 OFFSET과 LIMIT이다.

  • LIMIT: 데이터를 몇번째 row 부터 불러올지 지정
  • OFFSET: 불러올 데이터의 row 수 지정

사용 방법은 다음과 같다:

1
2
-- col_name으로 정렬 후 start_idx 부터 num_of_rows개의 데이터 조회
SELECT columns... FROM tb_name ORDER BY col_name OFFSET start_idx LIMIT num_of_rows;

위에서 가정한 예시처럼 2 ~ 4번 쨰 가입한 회원의 정보가 필요한 경우에는 다음과 같이 쿼리문을 작성할 수 있다:

1
2
3
4
5
6
7
8
9
SELECT * FROM customer ORDER BY created_at OFFSET 2 LIMIT 3;
-- 조회 결과:
-- +-----+----------+------+
-- |name |created_at|gender|
-- +-----+----------+------+
-- |이영희|2022-03-01|female|
-- |조용현|2022-02-01|male  |
-- |홍길동|2022-04-01|male  |
-- +-----+----------+------+

특히나 수백만 ~ 수천만 건의 데이터를 저장하고 있는 데이터베이스라면 LIMIT 없이 조회를 하는 경우, 장애로까지 이어질 수 있다. LIMIT를 습관화하여 치명적인 실수를 줄이는 것을 권장한다.

This post is licensed under CC BY 4.0 by the author.