본문 바로가기
CS/DataBase

데이터베이스 첫걸음 정리 - 10장. 복수의 열을 지정해 정렬하기

by yongckim 2022. 8. 31.
728x90
반응형

‘상품 코드와 해당 상품의 하위번호'까지 함께 고려했을 때 하나의 행을 특정지을 수 있는 경우와 같이 하나의 열만으로는 행을 특정짓기 어려운 때가 많습니다.

이런 경우 복수의 열을 지정해 정렬할 수 있습니다.

복수 열로 정렬 지정

ORDER BY로 정렬을 하다보면 값은 값을 가진 행의 순서는 어떻게 정해지는지 궁금증이 들 수 있습니다.

또, ORDER BY 구는 생략할 수 있는데 이때 순서는 어떻게 정해질지도 궁금합니다.

답은, “순서는 일정하지 않다” 입니다.

데이터 베이스 서버의 당시 상황에 따라 어떤 순서로 행을 반환할지 결정됩니다. 따라서, 언제나 같은 순서로 결과를 얻고 싶다면 반드시 ORDER BY 구로 순서를 지정해야 합니다.

일반적으로 ORDER BY 구를 지정하지 않는 경향이 있으나 사실 중요한 부분입니다.

ORDER BY구를 지정해도 1개의 열만으로는 정확히 순서를 결정할 수 없는 경우도 많을 겁니다.

예를들어, 다음과 같이 해당 열의 데이터가 중복되는 값의 경우 제대로 순서가 정렬되지 않을 수 있습니다.

SELECT Country, City FROM Customers ORDER BY CITY;

이런 상황에서 ORDER BY를 복수 열로 지정하면 문제를 해결할 수 있습니다.

SELECT 구에서 열을 지정한 것 처럼 쉼표(,)로 구분하여 지정하면 해결할 수 있습니다.

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

복수열을 지정하면 정렬 결과가 바뀝니다. 정렬 순서는 지정한 열명의 순서를 따르며, 이때 값이 같아 순서를 결정할 수 없는 경우에는 다음으로 지정한 열명을 기준으로 정렬하는 식으로 처리됩니다.

SELECT Country, City FROM Customers ORDER BY Country, City;

정렬방법 지정하기

복수 열을 지정한 경우에도 각 열에 대해 개별적으로 정렬방법을 지정할 수 있습니다.

다음과 같이 각 열 뒤에 ASC나 DESC를 붙여주면 됩니다.

SELECT 열 명 FROM 테이블명
	ORDER BY 열명1 [ASC|DESC], 열명2 [ASC|DESC] ...

위의 구문에서 [] 부분은 생략할 수 있으며, |는 둘 중 하나라는 뜻이며, …은 동일한 형태로 연속해서 지정할 수 있다는 의미입니다.

다음은 정렬방법을 지정한 예시입니다.

SELECT Country, City FROM Customers ORDER BY Country ASC, City DESC;

앞서 설명했듯이 복수 열을 지정하는 경우에도 정렬방법을 생략하면 기본값은 ASC가 됩니다.

단, 데이터베이스 제품에 따라 기본값을 변경할 수 있기 때문에 주의해야 합니다.

추가적으로 문장의 가독성을 높이기 위해서라도 가능한 한 정렬방법을 생략하지말고 지정하도록 합시다.

NULL 값의 정렬순서

지금까지 ORDER BY로 데이터를 정렬해보았지만 NULL 값이 들어가 있는 경우에는 어떻게 정렬될까요?

NULL은 특성상 대소비교를 할 수 없어 정렬시에는 별도의 방법으로 취급됩니다.

NULL값의 비교는 특정 값보다 큰 값이나 특정 값보다 작은 값으로 나뉘어 대소 비교를 하게 됩니다.

이를 쉽게 말하면 ORDER BY로 지정한 열에서 NULL 값을 가지는 데이터가 있을 경우 해당 행은 가장 먼저 표시되거나 가장 나중에 표시됩니다.

NULL에 대한 대소비교 방법은 표준 SQL에도 규정되어 있지 않아 데이터베이스 제품에 따라 기준이 다릅니다.

MySQL의 경우에는 NULL 값을 가장 작은 값으로 취급해 ASC에서는 가장 먼저, DESC에서는 가장 나중에 표시됩니다.

반응형