안녕하세요. 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 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 38722
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20805
2234 SQL강좌: 2-12. SQL UNION 연산자 코난(김대우) 2023.08.18 103
2233 SQL강좌: 2-11. SELECT INTO - 쿼리 결과를 테이블로 복사 코난(김대우) 2023.08.18 141
2232 SQL강좌: 2-10. 하위 쿼리(Subquery-서브쿼리) 코난(김대우) 2023.08.18 124
2231 SQL강좌: 2-9. JOIN - 테이블 연결 file 코난(김대우) 2023.08.18 210
2230 SQL강좌: 2-8. GROUP BY, ROLLUP, CUBE 코난(김대우) 2023.08.18 180
» SQL강좌: 2-7. ORDER BY 결과 정렬 코난(김대우) 2023.08.18 150
2228 SQL강좌: 2-6. DISTINCT 문을 이용한 중복 제거 코난(김대우) 2023.08.18 143
2227 SQL강좌: 2-5. WHERE절의 조건에 의한 행의 검색 코난(김대우) 2023.08.18 139
2226 SQL강좌: 2-4. 데이터형(Data type)과 함수(Function) 코난(김대우) 2023.08.18 188
2225 SQL강좌: 2-3. SELECT - 컬럼선택 file 코난(김대우) 2023.08.18 232
2224 SQL강좌: 2-2. 데이터 검색 - SELECT 구문 file 코난(김대우) 2023.08.18 212
2223 SQL강좌: 2-1. T-SQL SQL Server 언어에 대한 간단한 소개 file 코난(김대우) 2023.08.18 190
2222 SQL강좌: 1-11. 예제 데이터베이스 설치 코난(김대우) 2023.08.18 259
2221 SQL강좌: 1-10. SQL Server 2022 관리 도구 소개 [2] file 코난(김대우) 2023.08.18 160
2220 SQL강좌: 1-9. 업그레이드와 설치 제거 file 코난(김대우) 2023.08.18 97
2219 SQL강좌: 1-8. SQL Server 2022 설치 - 컨테이너 file 코난(김대우) 2023.08.18 106
2218 SQL강좌: 1-7. SQL Server 2022 설치 - 리눅스 file 코난(김대우) 2023.08.18 138
2217 SQL강좌: 1-6. SQL Server 2022 설치 - 윈도 [2] file 코난(김대우) 2023.08.18 321
2216 SQL강좌: 1-5. SQL클라우드와 On-Premise file 코난(김대우) 2023.08.18 151
2215 SQL강좌: 1-4. SQL Server 설치 전 점검사항 file 코난(김대우) 2023.08.18 139





XE Login