본문 바로가기
DataBase/MsSql

MSSQL ORDER BY 사용법 및 예제

by 아우럼 2024. 3. 27.
반응형

ORDER BY는 SELECT 문장으로 조회된 데이터를 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는 데 사용됩니다.

ORDER BY 특징

  • 쿼리 결과 집합을 지정한 열 목록별로 정렬하고 필요한 경우 반환되는 행을 지정한 범위로 제한할 수 있습니다.
  • ORDER BY 절을 지정하지 않으면 결과 집합에서 행이 반환되는 순서가 보장되지 않습니다.
  • 순위 함수 DATA 집합에 적용되는 순서를 결정합니다.
  • 열 정렬은 이름이나 열 별칭으로 지정되거나 SELECT 목록에 있는 열의 위치를 나타내는 음수가 아닌 정수로 지정될 수 있습니다.
  • 열 이름은 고유해야 order by를 사용할 수 있습니다.
  • 결과 집합은 첫 번째 열을 기준으로 정렬된 다음이 정렬된 목록이 두 번째 열을 기준으로 정렬되는 식으로 정렬합니다.
  • COLLATE는 char, varchar, nchar 및 nvarchar 형식의 열에만 적용할 수 있습니다.
  • 지정된 열의 값이 오름차순으로 정렬되는지 내림차순으로 정렬되는지를 지정합니다.
  • ASC는 오름차순으로 정렬하고, DESC는 내림차순으로 정렬합니다. ASC가 기본 정렬 순서입니다.
  • Null 값은 가능한 가장 작은 값으로 취급됩니다.

 

ORDER BY 사용법

기본적인 ORDER BY 사용법.

  • Syntax.
[ ORDER BY   
    {  
    order_by_expression   
    [ ASC | DESC ]   
    } [ ,...n ]   
]

 

  • 예제.
-- 기본적인 ORDER BY 사용법
USE sampleDB;  
GO  
SELECT scoreyyyymm,classNo ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE studentNm LIKE '%A%'  
 AND scoreyyyymm = '202401'
ORDER BY studentNm;

기본적인 ORDER BY 사용법.

 

ORDER BY 칼럼 순번, 별칭으로 정렬 방법.

  • 열 별칭을 지정 후 order by column에서 정렬 순서 열로 지정합니다.
-- 칼럼 순번, 별칭으로 정렬 방법
USE sampleDB;  
GO  
SELECT scoreyyyymm ,classNo num ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE studentNm LIKE '%A%'  
ORDER BY num,4 desc;

ORDER BY 오름차순과 내림차순 둘 다 지정.

  • korScore 열을 기준으로 오름차순으로 정렬된 다음 mathScore 열을 기준으로 내림차순으로 정렬됩니다.
-- 오름차순과 내림차순 둘 다 지정
USE sampleDB;  
GO  
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE studentNm LIKE '%A%'  
ORDER BY korScore asc,mathScore desc;

ORDER BY 조건부 순서 지정.

  • ORDER BY 절에 CASE 식을 사용하여 지정된 열값에 따라 행의 정렬 순서를 조건부로 결정합니다.
-- 조건부 순서 지정
USE sampleDB;  
GO  
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE studentNm LIKE '%A%'  
ORDER BY CASE classNo WHEN 1 THEN korScore END DESC  
        ,CASE WHEN classNo = 2 THEN mathScore END;

순위 함수에 ORDER BY 사용.

  • 순위 함수 ROW_NUMBER, RANK, DENSE_RANK 및 NTILE에 ORDER BY 절을 사용할 수 있습니다.
SELECT classNo,studentNm,korScore
      ,RANK() OVER (ORDER BY classNo asc, korScore DESC ) AS winFuncRank
      ,DENSE_RANK() OVER (ORDER BY classNo asc, korScore DESC ) AS winFuncDenseRank
      ,ROW_NUMBER() OVER (ORDER BY classNo asc, korScore DESC ) AS winFuncRowNum
      ,NTILE(4) OVER (ORDER BY classNo asc, korScore DESC ) AS Quartile 
 FROM UserInfoForOrderby
 WHERE scoreyyyymm = '202401';

반환되는 행 수 제한.

  • 정수 상수를 사용하여 OFFSET 및 FETCH 값 지정.
-- 정수 상수를 사용하여 OFFSET 및 FETCH 값 지정
USE sampleDB;  
GO  
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE scoreyyyymm = '202401' 
ORDER BY classNo  ,studentNm  OFFSET 6 ROWS; 

USE sampleDB;  
GO  
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE scoreyyyymm = '202401' 
ORDER BY classNo  ,studentNm  
	OFFSET 2 ROWS  
	FETCH NEXT 8 ROWS ONLY;

 

  • 변수를 사용하여 OFFSET 및 FETCH 값 지정.
-- 변수를 사용하여 OFFSET 및 FETCH 값 지정
USE sampleDB; 
GO  
-- Specifying variables for OFFSET and FETCH values    
DECLARE @RowsToSkip TINYINT = 2
      , @FetchRows TINYINT = 8; 
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE scoreyyyymm = '202401' 
ORDER BY classNo  ,studentNm  
    OFFSET @RowsToSkip ROWS  
    FETCH NEXT @FetchRows ROWS ONLY;

 

ORDER BY 절에서 OFFSET 및 FETCH 값 사용방법.

UNION, EXCEPT 및 INTERSECT에 ORDER BY 사용.

  • UNION 예제.
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE scoreyyyymm = '202401' 
-- ORDER BY cannot be specified here.  
union all
SELECT scoreyyyymm ,classNo  ,studentNm,korScore,mathScore
FROM UserInfoForOrderby  
WHERE scoreyyyymm = '202401' 
ORDER BY classNo  ,studentNm

 

ORDER BY 제한사항

  • ORDER BY 절의 열 개수에는 제한이 없지만 ORDER BY 절에 지정된 열의 전체 크기는 8,060바이트를 초과할 수 없습니다.
  • ntext, text, image, geography, geometry 및 xml 형식의 열은 ORDER BY 절에서 사용할 수 없습니다.
  • 순위 함수에(OVER 절에서는) 나타나는 경우 정수 또는 상수를 지정할 수 없습니다.
  • UNION, EXCEPT 또는 INTERSECT 연산자를 사용하는 쿼리에서는 문의 끝부분에만 ORDER BY를 사용할 수 있습니다.
  • TOP 절 또는 OFFSET 및 FETCH 절을 함께 지정하지 않은 한 뷰, 인라인 함수, 파생 테이블 및 하위 쿼리에서 ORDER BY 절을 사용할 수 없습니다.
  • OVER 절은 OFFSET 및 FETCH를 지원하지 않습니다.
  • OFFSET 및 FETCH는 INSERT, UPDATE, MERGE 및 DELETE 문에서 직접 지정할 수 없지만 이러한 문에 정의된 sub Query에서는 지정할 수 있습니다.
  • INSERT INTO SELECT 문의 경우 SELECT 문에서 OFFSET 및 FETCH를 지정할 수 있습니다.
  • UNION, EXCEPT 또는 INTERSECT 연산자를 사용하는 쿼리에서는 쿼리 결과의 순서를 지정하는 마지막 쿼리에서만 OFFSET 및 FETCH를 지정할 수 있습니다.
반응형