안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 2-7. ORDER BY 결과 정렬을 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번 강좌는 ‘ORDER BY’ 절을 사용한 쿼리 결과 정렬입니다.
TL;DR
정렬은 데이터를 순서대로 나열하는 기능입니다. ORDER BY로 오름차순(ASC) 또는 내림차순(DESC) 정렬이 가능합니다. 언어셋(Collation)에 따라 정렬 방식이 달라질 수 있습니다.
정렬이란
정렬이란, C A B 데이터가 있을 때 A B C의 순서로 변경하는 것이 정렬입니다. 정확히 오름차순(Ascending) 정렬이며 C B A 순서로 변경하면 내림차순(Descending) 정렬입니다. 물론 한글 정렬도 가능합니다. 한글 정렬은 Collation(데이터 정렬)과 연관이 있어서 뒤에서 자세히 소개해 드리겠습니다.
ORDER BY 구문 정보
SELECT column_name[, column_name…] FROM table_list WHERE search_conditions ORDER BY order_by_expression [ COLLATE collation_name ] [ ASC | DESC ] [ ,...n ] [ <offset_fetch> ] |
고려사항
- ORDER BY 절에 컬럼 명이 아닌 상대적인 컬럼 번호를 사용할 수 있다.
- 오름차순(ASC)또는 내림차순(DESC)이 지정되지 않으면 기본 오름차순으로 가정한다.
- 정렬의 대상이 된 열이 select_list에 반드시 나타날 필요는 없다.
복잡하게 느껴지지만 예제 쿼리를 수행해 보시면 쉽습니다.
ORDER BY 구문 예제
기본 정렬 구문
아래 SQL 구문은 Production.Product 테이블에서 ProductID, Name 컬럼을 필터에 맞춰 조회하고 ProductID로 정렬합니다.
SELECT ProductID, Name FROM Production.Product WHERE Name LIKE 'Lock Washer%' ORDER BY ProductID;
ProductID가 낮은 번호부터 높은 번호로 오름차순으로 출력됩니다. 오름차순이나 내림차순 정의가 없다면 기본은 오름차순 ASC입니다.
반대인 내림차순으로 정렬합니다.
SELECT ProductID, Name FROM Production.Product WHERE Name LIKE 'Lock Washer%' ORDER BY ProductID DESC;
두 개 이상 컬럼 정렬
두 개 이상 컬럼 정렬은 아래처럼 순차적으로 나열합니다. FirstName 먼저 오름차순으로 정렬하고 FirstName에 중복이 있다면 다음 LastName을 내림차순으로 정렬합니다.
SELECT LastName, FirstName FROM Person.Person WHERE LastName LIKE 'R%' ORDER BY FirstName ASC, LastName DESC; 결과 LastName FirstName ----------------- ------------------ Russell Aaron Ross Aaron Roberts Aaron ...
이렇게 두 개의 컬럼을 동시에 정렬도 가능합니다.
집계 함수와 정렬
컬럼 집계 함수 등도 정렬에 사용할 수 있습니다. 즉, 그룹화된 집계함수(COUNT, SUM, AVG, MIN, MAX 등)의 결과셋에 정렬을 걸 수 있습니다.
SELECT COLOR, COUNT(*) as CountColor FROM Production.Product GROUP BY Color ORDER BY CountColor DESC; 결과 COLOR CountColor --------------- ----------- NULL 248 Black 93 Silver 43 Red 38 ...
갑자기 GROUP BY가 나왔습니다. 다음 강좌에서 배우시게 되며 지금은 그룹을 만들어 묶어 주는구나 정도로만 이해하시면 됩니다.
한글 정렬
가장 많이 받는 질문이기도 합니다. 먼저 한글 정렬을 말씀드립니다.
--임시테이블을 생성. 이후 테이블 강좌에서 상세하게 배웁니다. CREATE TABLE #t1 (name NVARCHAR(15) COLLATE Korean_Wansung_CI_AS); GO --테스트 데이터 삽입 INSERT INTO #t1 VALUES(N'김대우'),(N'강하늘'),(N'박서준'),('B'),('C'),('A'); GO SELECT name from #t1; --------------- 김대우 강하늘 박서준 B C A --삽입 순서로 출력됨 --정렬 작업 수행 SELECT name from #t1 ORDER BY name ASC; GO name --------------- 강하늘 김대우 박서준 A B C --한글 정렬 잘됨
영문과 한글이 섞여 있을 경우 정렬
많이 받는 질문입니다. 보통 한글 설정을 위해 Collation 설정을 한글 기본값인 ‘Korean_Wansung_CI_AS’로 하게 됩니다.
CI(Case-insensitive 대소문자 구별 안 함)와 AS(accent-sensitive 엑센트 구별-한국어와 무관)의 의미는 아래 링크를 참조하세요.
- Collation and Unicode support : Collation and Unicode support - SQL Server | Microsoft Learn
☑️ 챗GPT 활용: 한글 완성형 입력 방식에 대해서 알려줘
1. 프로그래밍에서의 일반적인 정렬은 이렇게 한글-영어-숫자 순서입니다.
'0' < 'a' < '한' |
2. SQL Server의 정렬은 기본 Collation ‘Korean_Wansung_CI_AS’ 일 경우 영어-한글-숫자 순서입니다.
'0' < '한' < 'a' |
1번 방식처럼 하고 싶다면 Korean_Wansung_BIN2으로 설정하면 해결됩니다.
--방법 1. ORDER BY에 COLLATE 속성 설정 SELECT name from #t1 ORDER BY name COLLATE Korean_Wansung_BIN2 ASC; --방법 2. 테이블을 생성하면서 컬럼에 COLLATE 설정 CREATE TABLE #t2 (name NVARCHAR(15) COLLATE Korean_Wansung_BIN2); GO INSERT INTO #t2 VALUES(N'김대우'),(N'강하늘'),(N'박서준'),('B'),('C'),('A'); GO SELECT name from #t2 ORDER BY name ASC; GO 결과는 둘 다 아래처럼 나옵니다. --------------- A B C 강하늘 김대우 박서준
반드시 알파벳-한글 순서로 정렬해야 한다면 설계부터 고려해 위와 같이 컬럼 COLLATE를 Korean_Wansung_BIN2으로 설정합니다. 참고로, 대용량 데이터를 ORDER BY로 정렬하면서 COLLATE를 설정하면 약간의 성능 저하가 있을 수 있습니다.
SQL Server에서 Collation 설정을 확인하는 방법
SQL서버, 개별 데이터베이스, 테이블 컬럼, 위와 같이 ORDER BY 구문에서 Collation을 사용할 수 있습니다.
--서버 Collation 설정 확인 SELECT SERVERPROPERTY('collation'); --데이터베이스 Collation 확인 SELECT DATABASEPROPERTYEX('AdventureWorks','collation'); --테이블과 컬럼 Collation 확인 SELECT t.name TableName, c.name ColumnName, collation_name FROM sys.columns c inner join sys.tables t on c.object_id = t.object_id;
참고자료
SQLER의 윤선식 님 글입니다. 참고하세요.
개발자 커뮤니티 SQLER.com - SQL Collation에 대한 설명입니다.
개발자 커뮤니티 SQLER.com - collation 주로 머 사용하시는지 도움 좀 주세요
서버 콜레이션 / 데이터베이스 콜레이션 / 테이블 / 컬럼 콜레이션
View Collation Information - SQL Server | Microsoft Learn
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.