다중 정렬과 NULL을 다루는 과정


우리 퍼즐 조각을 맞춰서 새로운 정렬 기준을 만들어보지 않을래?

새로운 테이블을 생성하고, 이 테이블을 기존의 테이블과 JOIN하여
기존에 데이터를 가져오는 곳의 정렬 기준으로 만드는 과정이 있었다.

새로운 컬럼의 값이 NULL일 경우에는 어떻게 정렬할 것인지,
기존의 테이블과 JOIN할 때는 어떤 방식으로 JOIN할 것인지에 대해 고민하던 과정에 대해 정리해보고자 한다.

정렬 기준

먼저, 정렬 기준을 간단히 정리해보자.

오름차순 정렬은 ASC를 사용하며 정렬의 Default값이 ASC이므로 생략할 경우 오름차순이 적용된다.
내림차순 정렬은 DESC를 사용한다.


정렬할 때 NULL이 나오는 순서를 컨트롤 해보자

Oracle에서 ORDER BY 구문 NULL값 정렬 순서를 정하기 위해서는
NULLS FIRSTNULLS LAST를 이용한다.

1
2
-- NULL이 마지막에 나오도록 정렬
ORDER BY 컬럼명 정렬 기준(ASC | DESC) NULLS LAST;
1
2
-- NULL이 처음에 나오도록 정렬
ORDER BY 컬럼명 정렬 기준 NULLS FIRST;

기존에는 NULL값을 나중에 나오게 만들기 위해 NULLS LAST를 붙여줬었는데,
Oracle에서는 NULLS LAST가 Default이므로 생략할 경우에도
마찬가지로 NULLS LAST를 붙여준 것과 동일하게 정렬된다.

따라서, Oracle에서 NULL값이 가장 먼저 나오게 만들고 싶을 때만 NULLS FIRST를 붙여주면 된다.


다중 정렬을 이용해보자

다중 정렬은 무엇인가?
정렬 기준을 2개 이상 적용하고 싶을 때 사용한다.

이렇게 여러 개의 컬럼을 기준으로 정렬할 경우,
왼쪽인 가장 앞에 정의된 컬럼을 기준으로 먼저 정렬한 후 이후의 정렬 기준들을 기준으로 정렬하게 된다.

가장 먼저 나오는 기준 컬럼을 기준으로 정렬을 먼저 적용하여 정렬한 후,
다음 기준으로 정렬을 하는 것이다.

예를 들어 다중 정렬을 적용하는데, 첫번째 정렬 기준 컬럼은 내림차순,
두 번째 기준 컬럼은 오름차순으로 정렬한다고 해보자.

정렬 기준의 첫 번째 컬럼은 최종 수정한 시간(updatedAt)이며, 두 번째 컬럼은 제목(title)이라고 하자.

최근 시간이 먼저 나오게 정렬

시간 데이터가 들어있는 컬럼을 기준으로
가장 최근 데이터가 가장 먼저 나오도록(최근순)정렬하고자 한다면,
DESC를 넣어서 내림차순으로 정렬한다.

1
2
-- 수정 시간을 기준으로 최근 시간부터 나오게 정렬
ORDER BY UPDATED_AT DESC

다중 정렬을 적용한 예

1
2
-- 수정 시간을 기준으로 최근시간부터 나오도록 정렬한 후, 제목을 기준으로 오름차순 정렬
ORDER BY UPDATED_AT DESC, TITLE (ASC);

어떤 JOIN을 쓸까?

기존에 데이터를 가져오는 쿼리에 정렬 기준을 새로운 테이블의 UPDATED_AT 컬럼으로 만든다고 해보자.

LEFT OUTER JOININNER JOIN 중 어떤 JOIN을 사용할지 고민했다.

LEFT OUTER JOIN은 오른쪽 테이블의 모든 값을 가져와서 왼쪽 테이블과 매칭을 한 후,
매칭되는 값이 없을 경우 null로 표현한다. LEFT JOIN으로 줄여서 사용할 수 있다.

INNER JOIN은 줄여서 JOIN으로 사용할 수 있으며, 값이 없으면 가져오지 않는다.

지금의 경우에는 NULL일 경우에도 데이터를 추출하여 첫번째 정렬 기준으로 사용할 것이므로
LEFT OUTER JOIN을 사용하여 JOIN 해주었다.


참고