백/SQL

[SQL 첫걸음] 3장 - 정렬

복지희 2023. 9. 30. 03:32

1. 정렬 - ORDER BY

검색 결과의 행 순서를 바꿀 수 있음.

SELECT 열 FROM 테이블 ORDER BY 열명;

아무 정렬도 지정해주지 않았을 때

이렇게 이름으로 정렬을 해달라는 SELECT * FROM member ORDER BY name;

라고 정렬을 한 결괏값이다.

WHERE 명령어도 함께 쓸 수 있다.

 

 

<내림차순 정렬하기>

- DESC : descendant(하강) 의 뜻으로, 내림차순.

- ASC : ascendant(상승)의 뜻으로, 오름차순.

뒤에 별도의 명령어를 지정해주지 않으면 기본적으로 오름차순 정렬을 해주고,

내림차순으로 정렬을 하고 싶다면 뒤에 명령어를 붙여줘야 한다.

SELECT 열 FROM 테이블 ORDER BY 열명 DESC;

거꾸로 뒤집혀서 정렬된 것을 확인할 수 있다.

문자열은 사전식 순서,

integer 형은 숫자 크기순으로 정렬을 하지만,

문제는 VARCHAR형 안에 숫자를 넣어놓은 상황이다.

사전식으로 정의하면 1다음이 2이기 때문에,

VARCHAR을 정렬하면 1 < 10 < 11 < 20 같은 결과가 나온다.

 

 

2. 복수의 열을 지정해 정렬하기

데이터 양이 많을 때는 하나의 열만으로는 행을 특정짓이 어려울 때(같은 값이 들어있는 경우 등) 복수의 열을 지정해서 정렬한다.

a b
1 1
2 1
2 2
1 3
1 2

INTEGER 형의 이런 테이블이 존재한다.

1-1, 1-2, 1-3, 2-1, 2-2 이렇게 상관관계 맞춰서 정렬하려고 한다.

SELECT 열 FROM 테이블 ORDER BY 열명1, 열명2...;

 

SELECT * FROM sampledb ORDER BY a,b;
a b
1 1
1 2
1 3
2 1
2 2

a를 먼저 정렬한 후, b를 정렬한다.

 

반대로,

SELECT * FROM sampledb ORDER BY b,a;
a b
1 1
2 1
1 2
2 2
1 3

b를 먼저 정렬한 후, a를 정렬한다.

 

a는 내림차순, b는 오름차순 그대로 정렬하고 싶다면,

SELECT * FROM sampledb ORDER BY a DESC, b;

 

NULL 값의 정렬순서는 표준 SQL에도 규정되어 있지 않아 데이터베이스 제품에 따라 기준이 다르다.

My SQL 은 null값을 가장 작은 값으로 취급해서,

ASC(오름차순)에서는 가장 먼저 표시한다.

 

 

3. 결과 행 제한하기 - LIMIT

표현하는 최대 행수는 지정한다.

다만, LIMIT 는 표준 SQL 이 아니고 MySQL 과 PodtgreSQL에서만 사용 가능하다.

SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수;

 

<오프셋 지정>

대량의 데이터를 하나의 페이지에 표현하는것은 효율적이지 못하므로,

일반적으로 페이지 나누기 기능을 사용한다.

커뮤니티 사이트에서 밑에 1 2 3 4 다음 이렇게 표시한것이 이 예시이다.

OFFSET을 사용하면 이 페이지 나누기가 가능해진다.

OFFSET은 행을 시작할 초기위치이고, -1을 해서 계산해줘야 한다.

(첫번째 행이 0부터 시작한다.)

SELECT 열명 FROM 테이블명 LIMIT 행수 OFFSET 시작위치;

1부터 쭉 no열로 나열되어있다고 생각해보면,

SELECT * FROM sampledb LIMIT 3 OFFSET 4;
no
5
6
7

OFFSET이 4이므로 5행부터, LIMIT가 3이므로 3개의 행을 보여준다.