ORDER BY 문은 데이터를 정렬할 때 사용합니다.
단일 컬럼 혹은 2개 이상의 컬럼이나 함수를 기준으로 데이터를 오름차순, 내림차순으로 정렬이 가능합니다.
기본 정렬
기본적으로 많이 사용하는 형태는 다음과 같습니다.
SELECT <컬럼명>
FROM <테이블명>
ORDER BY <컬럼명> <ASC | DESC>
도시 테이블에서 인구수를 내림차순(인구 많은 순)으로 정렬한 데이터입니다.
내림차순으로 조회하는 경우에는 DESC 옵션을 붙여야 하지만, 오름차순은 ASC 옵션을 따로 붙이지 않아도 됩니다.
컬럼을 여러개 사용할 수도 있습니다.
# 인구수 오름차순, 국가명 내림차순
select *
from country
order by Population, Name desc;
여러개를 사용하면 첫번째 컬럼으로 정렬했을 때 같은 값이 있다면 그 다음 컬럼을 기준으로 정렬합니다.
위의 쿼리를 예시로 들면, 인구수로 정렬했을 때 인구 수가 같은 국가가 있다면 국가명 내림차순으로 정렬이 됩니다.
문자 컬럼의 경우, 사전순으로 정렬됩니다.
조건부 정렬
ORDER BY는 각 데이터를 비교해서 정렬하는 로직이기 때문에 비교만 할 수 있게 만들면 정렬을 할 수 있습니다.
조건식, 함수 사용
ORDER BY에는 조건식이나 함수도 사용이 가능합니다.
조건식을 사용했을 때 조건을 만족하면 1, 만족하지 않으면 0이 나오기 때문에 이런 특징을 사용하면 됩니다.
함수도 마찬가지로 비교할 수 있는 값이 나온다면 정렬이 가능합니다.
# 조건식 사용
# 조건 결과가 TRUE면 1, FALSE면 0
# 인구수 10000명 미만 국가를 1순위로 조회
select *
from country
order by Population < 10000 desc;
# 함수 사용
# 국가명 길이 내림차순 조회
select *
from country
order by length(Name) desc;
length처럼 비교를 할 수 있는 값이 나오는 함수를 사용하거나 IF나 CASE문을 사용해서 특정 조건일때 특정 값을 반환하는 형태로 사용할 수도 있습니다.
FIELD() 사용
field() 함수를 사용하면 특정 값과 일치하는 데이터를 우선적으로 조회되도록 할 수 있습니다.
# 아시아 국가를 1순위로, 북아메리카 국가를 2순위로 조회
select *
from country
order by field(Continent, 'North America', 'Asia') desc;
1순위를 첫번째 인수로, 2순위를 두번째 인수에 놓고 쓰면 편할것 같은데, 저렇게 사용해야하는 이유가 있습니다.
FIELD 함수에 인수로 들어오지 않은 데이터는 0으로 반환이 되는데, 위의 쿼리의 경우 첫번째 인수 North America는 1이 반환되고 두번째 인수 Asia는 2가 반환되고 나머지는 0이 반환됩니다.
그렇기 때문에 오름차순으로 조회하면 0, 1, 2 순서로 조회됩니다.
그래서 원하는 순서의 역순으로 인수를 주고 내림차순으로 조회하였습니다.