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
name | created_at | gender |
---|---|---|
김철수 | 2022-01-01 | male |
이영희 | 2022-03-01 | female |
홍길동 | 2022-04-01 | male |
조용현 | 2022-02-01 | male |
홍길순 | 2022-03-01 | female |
만약 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를 습관화하여 치명적인 실수를 줄이는 것을 권장한다.