[MSSQL] ORDER BY 절 사용법 (정렬 순서 지정)

SQL Server에서 SELECT 된 데이터를 정렬하기 위해서는 ORDER BY 절을 사용하면 된다. 정렬할 칼럼을 오름차순(ASC), 내림차순(DESC)으로 조회 순서를 지정할 수 있다. MySQL에서 LIMIT를 사용하듯 SQL Server에서는 TOP을 사용하여 정렬된 데이터에서 특정 개수만큼만 조회할 수 있으며, CASE WHEN 연산자나 함수 등을 사용하여 조금 더 다양한 정렬 순서를 지정할 수 있다. ORDER BY 칼럼은 2개 이상 지정하여 복합 정렬이 가능하다.

 

MSSQL 정렬 방법

ORDER BY의 기본 정렬은 오름차순이며 칼럼명만 명시하면 오름차순으로 정렬되고, 칼럼명 뒤에 DESC를 붙이면 내림차순으로 정렬된다. 칼럼명 뒤에 ASC를 붙여도 오름차순으로 정렬되지만 대부분 오름차순은 ASC를 붙이지 않는다.

 

오림차순, 내림차순 정렬

목차
  1. 기본적인 ORDER BY 사용법
  2. 칼럼 순번, 별칭으로 정렬 방법
  3. 함수 및 연산자를 사용하여 정렬
  4. GROUP BY 절 사용 시 정렬 방법
  5. 한글, 영문, 숫자 순으로 정렬 방법

 

기본적인 ORDER BY 사용법

오름차순 정렬

SELECT *
  FROM dbo.emp
 WHERE job IN ('MANAGER', 'SALESMAN')
 ORDER BY sal ASC

 

 

오름차순 정렬은 ORDER BY에 지정한 칼럼의 값이 작은 값부터 큰 값 순으로 정렬된다.

 

ORDER BY의 기본 정렬 순서는 오름차순이며 sal ASCASC는 생략해도 오름차순으로 정렬된다.

(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차 정렬 우선순위를 부여하면 된다.

 

 

[MSSQL] GROUP BY 절 사용법 (그룹별 집계)

SQL Server에서 GROUP BY 절은 특정 칼럼을 기준으로 집계 함수를 사용하여 건수(COUNT), 합계(SUM), 평균(AVG) 등 집 계성 데이터를 추출할 때 사용한다. GROUP BY 절에서 기준 칼럼을 여러 개 지정할 수 있으

gent.tistory.com

 

[MSSQL] TOP을 사용하여 특정 개수 만큼 조회

SQL Server에서는 오라클에서 사용하는 ROWNUM은 사용할 수 없다. 그러나 TOP과 ROW_NUMBER 함수를 사용하여 비슷한 결과를 만들 수 있다. ROWNUM은 주로 아래의 2가지 경우에 많이 사용한다. ​ 조회 개수

gent.tistory.com

예제쿼리(테이블포함).txt
0.00MB

 

댓글

Designed by JB FACTORY