오늘은 mysql에서 결과값을 정렬하는 방법에 대해 알아봅시다. order by를 쓰면, 레코드를 특정한 기준으로 정렬을 하게 합니다. 쓰는 방법은 아래와 같습니다.

 

 

... order by col_name(1) g(1), col_name(2) g(2), ... , col_name(n) g(n)

 

 

 이 때, 1차 정렬 기준은 col_name(1) 값을 기준으로 g(1)이라는 기준으로, 2차로 col_name(2) 값을 기준으로 g(2)라는 기준으로, ... 요런 식으로 sorting을 하게 됩니다. 컬럼 기준을 주지 않을 수도 있는데요. 이 때에는 오름차순으로 정렬이 됩니다. 예제를 몇 개 봅시다.

 

 


 

 먼저 city 함수에 있는 데이터들을 모두 출력해 보겠습니다.

 

 

 아. 너무 많군요. 자. 일단 저는 Population을 오름차순으로 정렬하고자 합니다. 그러니까, 인구가 작은 도시 순서대로, 오름차순으로 출력하고자 합니다. 그러면 어떻게 쿼리를 작성하면 될까요?

 

 

 일단, city 테이블에서 선택을 해야 하니까, from 절에는 city를 적어야 할 겁니다. 그리고 order by 다음에 기준을 적으라고 했는데요. 어떻게 하라고 했나요? 인구 컬럼을 기준으로. 어떻게? 오름차로. 그러니까 order by population 이렇게 적으면 될 거에요.

 

 

 수행 결과는 위와 같습니다.

 

 


 이제, District 기준으로, 오름차로 출력해 보았습니다.

 

 

 결과를 보면, 이상한 문자 다음에 'B'라는 값이 온다는 것을 알 수 있는데요. 이건 왜 그럴까요? 파란색으로 표시된 부분을 Binary로 보도록 하겠습니다.

 

 

 그러면 맨 앞에 C3로 인코딩이 되었는데요. 'B'나 'A'는 byte로 0xC3보다는 작습니다. 그러니, byte별로 비교하는 것은 아닌 듯 싶네요, c언어의 strcmp와 같은 함수는 byte 별로 비교한다고 합니다. 그 방법 말고, 다른 방식을 쓰는 게 분명해 보입니다. mysql의 world 데이터 베이스의 속성을 봅시다.

 

 

 그러면, District가 latin1 Character set으로 되어 있고, Collation이 latin1_swedish_ci로 되어 있음을 알 수 있어요. 전자는 UTF-8과 같은, 인코딩 형식이라 보시면 됩니다. 후자는, 그러한 형식을 어떻게 sorting, 혹은 비교를 할 것인가와 관련이 있어요. 이건 그냥 알고만 넘어가셔도 좋겠습니다.

 

 정렬 결과를 보면, '알파벳' 순서로 해 놓았다는 걸 알 수 있어요.

 

 


 그러면, District 내림차로 작성해 봅시다. default는 오름차라고 했어요. 내림차는 어떻게 옵션을 주면 될까요? desc로 주면 됩니다.

 

 보시면, 기준 하나 넣었습니다. District desc라고요. District 값이 어떤 순으로? 내려가는 순으로 출력하면 된다는 겁니다. 이 예제까지는 기준을 1개만 잡았습니다. 2개 이상 잡을 수도 있을까요? 네. sort 함수를 쓰기 위해서 커스텀 비교 함수를 만들 때, 기준을 반드시 하나만 두지는 않아요. 2개, 3개, 그 이상도 줄 수 있어요.

 

 마찬가지입니다. 그 예제를 한 번 봅시다.

 

 


 

 먼저 1차는 District 내림차, 2차는 인구 오름차입니다. 1차, 2차는 대체 무엇을 의미할까요? 지역과 인구를 각각 D, P라 해 봅시다. <D1, P1>과 <D2, P2>가 있을 때, D1 > D2라면, <D1, P1>이 <D2, P2>보다 먼저 출력됩니다. 만약에 D1과 D2가 같다면, D만 보아서는 <D1, P1>이 앞서는지 <D2, P2>가 앞서는지 판단할 수 없습니다.

 

 이럴 때, 2차 기준으로 비교합니다. D값이 같은 두 쌍이 있을 때, P가 작은 것이 먼저 출력된다는 겁니다.

 

 

 그러면 이 쿼리는 무엇을 의미할까요? 1차가 무엇인가요? 지역입니다. 사전순으로 역순입니다. 내림차 정도로 생각하시면 좋겠습니다. 2차는 무엇인가요? 인구를 기준으로 오름차순인가요?

 

 

 그러면, District가 같은 레코드들, ID가 3573, 3552, 3540인 것에 대해서 어떻게 순서가 매겨졌나요? population이 작은 것이 먼저 왔어요. 99354인 것이 먼저 왔고, 221329인 것이 다음에 왔고, 1304776인 것이 맨 뒤에 왔어요.

 

 

 그러면 이 경우는 어떤가요? 인구수를 1차 기준으로 삼고, District가 2차 기준이 되는 겁니다.

 

 

 그러면 기본적으로 Population 오름차순인데요. ID가 455인 것과 935인 것을 보세요. population이 89200으로 같아요. 그런데 이 둘의 순서가 District에 의해서 정해졌어요. 'G'가 'A'보다는 사전 순으로 뒤에 있기 때문에, ID가 455인 것이 935인 것보다 먼저 출력이 된 것입니다.

 

 order by는 rank를 매길 때 꽤 유용하게 사용이 됩니다. 예를 들어서, 학생들이 100명이 있는데, 그 중에 10등을 한 학생의 점수는 몇 점인지 구하는 쿼리를 작성하라고 했을 때, 정렬을 해야 합니다. 그럴 때 쓸 수 있어요. rank를 매기는 건 조만간 서브 쿼리 하면서 다시 언급해 보도록 하겠습니다.