[MSSQL] ORDER BY 절 사용법 (정렬 순서 지정)
- 데이터베이스/MSSQL
- 2022. 5. 10.
SQL Server에서 SELECT 된 데이터를 정렬하기 위해서는 ORDER BY 절을 사용하면 된다. 정렬할 칼럼을 오름차순(ASC), 내림차순(DESC)으로 조회 순서를 지정할 수 있다. MySQL에서 LIMIT를 사용하듯 SQL Server에서는 TOP을 사용하여 정렬된 데이터에서 특정 개수만큼만 조회할 수 있으며, CASE WHEN 연산자나 함수 등을 사용하여 조금 더 다양한 정렬 순서를 지정할 수 있다. ORDER BY 칼럼은 2개 이상 지정하여 복합 정렬이 가능하다.
ORDER BY의 기본 정렬은 오름차순이며 칼럼명만 명시하면 오름차순으로 정렬되고, 칼럼명 뒤에 DESC를 붙이면 내림차순으로 정렬된다. 칼럼명 뒤에 ASC를 붙여도 오름차순으로 정렬되지만 대부분 오름차순은 ASC를 붙이지 않는다.
목차 |
기본적인 ORDER BY 사용법
오름차순 정렬
SELECT *
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY sal ASC
오름차순 정렬은 ORDER BY에 지정한 칼럼의 값이 작은 값부터 큰 값 순으로 정렬된다.
ORDER BY의 기본 정렬 순서는 오름차순이며 sal ASC의 ASC는 생략해도 오름차순으로 정렬된다.
(ORDER BY sal ASC과 ORDER BY sal는 동일한 오름차순)
내림차순 정렬
SELECT *
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY sal DESC
정렬한 칼럼명 뒤에 DESC를 붙이면 내림차순 정렬이며, 큰 값부터 작은 값 순으로 정렬된다.
복합 정렬
SELECT *
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY job, sal DESC
직업(job) 명칭을 오름차순으로 정렬 후, 각 직업 내에서 급여(sal)가 높은 순(내림차순)으로 정렬된다.
정렬할 칼럼이 여러 개인 경우 범위가 넓은 칼럼을 우선으로 정렬해야 정확한 정렬이 된다.
ORDER BY 칼럼명1 [ASC|DESC], 칼럼명2 [ASC|DESC], 칼럼명3 [ASC|DESC], 칼럼명4 [ASC|DESC] ...
칼럼 순번, 별칭으로 정렬 방법
칼럼 순번으로 정렬
SELECT *
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY 3, 6 DESC
SELECT 절의 칼럼 순번(순서)으로 정렬할 칼럼을 지정할 수 있다.
SELECT 절의 3번째 칼럼은 job, 6번째 칼럼은 sal이다.
칼럼 별칭으로 정렬
SELECT empno AS id
, ename AS nm
, job
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY id, ename, 3
SELECT 절에서 함수를 사용했을 경우 칼럼의 별칭이나 칼럼의 순번으로 정렬하는 것이 편하다.
ORDER BY job, ISNULL(sal, 0), 2 이렇게 함수를 직접 사용해도 된다.
칼럼 명칭, 칼럼 별칭, 칼럼 순번을 섞어서 ORDER BY 절에 사용할 수 있다.
함수 및 연산자를 사용하여 정렬
함수를 사용하여 정렬
SELECT *
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY ISNULL(comm, 0) DESC
ORDER BY 절에서 함수를 사용하여 값을 변경하여 정렬할 수 있다.
SUM, COUNT, MAX, MIN 등 집계 함수는 GROUP BY 절을 사용할 때만 사용할 수 있다.
CASE 연산자를 사용하여 정렬
SELECT *
FROM dbo.emp
WHERE job IN ('MANAGER', 'SALESMAN')
ORDER BY CASE WHEN sal >= 2500 THEN 1
WHEN sal >= 2000 THEN 2
WHEN sal >= 1500 THEN 3
ELSE 4
END
CASE 연산자를 사용하여 값을 범위를 지정하여 정렬할 수 있다.
ORDER BY 절이 조금 복잡해 보이지만 자주 사용하는 정렬 방법이다.
GROUP BY 절 사용 시 정렬 방법
GROUP BY 절 정렬 방법
SELECT job
, SUM(sal) AS sal_sum
, AVG(sal) AS sal_avg
FROM dbo.emp
GROUP BY job
ORDER BY job
GROUP BY 절과 ORDER BY 절을 함께 사용하여 정렬할 수 있다.
집계 함수를 사용하여 정렬
SELECT job
, SUM(sal) AS sal_sum
, AVG(sal) AS sal_avg
FROM dbo.emp
GROUP BY job
ORDER BY AVG(sal) DESC
GROUP BY 절과 ORDER BY 절을 함께 사용하면 ORDER BY 절에서 집계 함수를 사용하여 정렬할 수 있다.
(집계 함수: COUNT , SUM , AVG, MAX, MIN)
한글, 영문, 숫자 순으로 정렬 방법
영문, 한글 순으로 정렬
WITH temp AS (
SELECT 'ALLEN' AS ename UNION ALL
SELECT '클락' AS ename UNION ALL
SELECT 'BLAKE' AS ename UNION ALL
SELECT '존스' AS ename UNION ALL
SELECT '마틴' AS ename
)
SELECT *
FROM temp
ORDER BY ename COLLATE Korean_Wansung_BIN
ORDER BY의 기본 정렬은 한글, 영문 순이지만 COLLATE를 변경하여 영문을 먼저 정렬되도록 할 수 있다.
한글, 영문, 숫자 순으로 정렬
WITH temp AS (
SELECT '1-KING' AS ename UNION ALL
SELECT 'ALLEN' AS ename UNION ALL
SELECT '클락' AS ename UNION ALL
SELECT 'BLAKE' AS ename UNION ALL
SELECT '존스' AS ename UNION ALL
SELECT '마틴' AS ename UNION ALL
SELECT 'adams' AS ename UNION ALL
SELECT '2-SCOTT' AS ename
)
SELECT *
FROM temp
ORDER BY CASE WHEN ename LIKE '[ㄱ-ㅎ가-힣]%' THEN 1 --한글
WHEN ename LIKE '[A-Za-z]%' THEN 2 --영문
WHEN ename LIKE '[0-9]%' THEN 3 --숫자
ELSE 4
END, ename
문자열을 다양한 케이스로 정렬 순서를 지정하고 싶다면 CASE 연산자를 활용하면 된다.
문자열의 첫 글자로 1차 정렬 우선순위를 부여하면 된다.