Microsoft SQL Server
행 정렬 / 정렬
수색…
기초
먼저 예제 테이블을 설정해 보겠습니다.
-- Create a table as an example
CREATE TABLE SortOrder
(
ID INT IDENTITY PRIMARY KEY,
[Text] VARCHAR(256)
)
GO
-- Insert rows into the table
INSERT INTO SortOrder ([Text])
SELECT ('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
UNION ALL SELECT ('Pellentesque eu dapibus libero')
UNION ALL SELECT ('Vestibulum et consequat est, ut hendrerit ligula')
UNION ALL SELECT ('Suspendisse sodales est congue lorem euismod, vel facilisis libero pulvinar')
UNION ALL SELECT ('Suspendisse lacus est, aliquam at varius a, fermentum nec mi')
UNION ALL SELECT ('Praesent tincidunt tortor est, nec consequat dolor malesuada quis')
UNION ALL SELECT ('Quisque at tempus arcu')
GO
데이터를 검색 할 때 행 순서 지정 절 (ORDER BY)을 지정하지 않으면 SQL Server는 언제든지 정렬 (열 순서)을 보장하지 않습니다. 정말로, 언제든지. 그리고 그것에 대해 논쟁의 여지가 없습니다, 그것은 수천 번 문자 그대로 인터넷을 통해 보여졌습니다.
ORDER BY == 정렬 없음. 이야기의 끝.
-- It may seem the rows are sorted by identifiers,
-- but there is really no way of knowing if it will always work.
-- And if you leave it like this in production, Murphy gives you a 100% that it wont.
SELECT * FROM SortOrder
GO
다음 두 가지 방향으로 데이터를 정렬 할 수 있습니다.
- 오름차순 (위쪽으로 이동), ASC 사용
- 내림차순 (아래로 이동), DESC 사용
-- Ascending - upwards
SELECT * FROM SortOrder ORDER BY ID ASC
GO
-- Ascending is default
SELECT * FROM SortOrder ORDER BY ID
GO
-- Descending - downwards
SELECT * FROM SortOrder ORDER BY ID DESC
GO
텍스트 열 ((n) char 또는 (n) varchar)을 주문할 때는 순서가 데이터 정렬을 준수해야합니다. 데이터 정렬에 대한 자세한 내용은 해당 주제를 참조하십시오.
데이터 정렬 및 정렬은 리소스를 소비 할 수 있습니다. 이것은 올바르게 생성 된 인덱스가 유용하게 쓰이는 곳입니다. 인덱스에 대한 자세한 정보는 해당 주제를 찾아보십시오.
결과 집합의 행 순서를 의사 임의화할 수 있습니다. 순서가 비 결정적으로 나타나게하십시오.
SELECT * FROM SortOrder ORDER BY CHECKSUM(NEWID())
GO
순서 지정은 저장 프로 시저에서 기억할 수 있으며 행 집합을 최종 사용자에게 표시하기 전에 행 집합을 조작하는 마지막 단계 인 경우 수행해야합니다.
CREATE PROCEDURE GetSortOrder
AS
SELECT *
FROM SortOrder
ORDER BY ID DESC
GO
EXEC GetSortOrder
GO
SQL Server보기에서도 주문에 대한 제한된 (그리고 해킹 된) 지원이 있지만 사용하지 않는 것이 좋습니다.
/* This may or may not work, and it depends on the way
your SQL Server and updates are installed */
CREATE VIEW VwSortOrder1
AS
SELECT TOP 100 PERCENT *
FROM SortOrder
ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder1
GO
-- This will work, but hey... should you really use it?
CREATE VIEW VwSortOrder2
AS
SELECT TOP 99999999 *
FROM SortOrder
ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder2
GO
주문시 ORDER BY에서 열 이름, 별칭 또는 열 번호를 사용할 수 있습니다.
SELECT *
FROM SortOrder
ORDER BY [Text]
-- New resultset column aliased as 'Msg', feel free to use it for ordering
SELECT ID, [Text] + ' (' + CAST(ID AS nvarchar(10)) + ')' AS Msg
FROM SortOrder
ORDER BY Msg
-- Can be handy if you know your tables, but really NOT GOOD for production
SELECT *
FROM SortOrder
ORDER BY 2
코드를 실행 한 후 잠시 잊고 싶을 경우를 제외하고는 코드의 숫자를 사용하지 않는 것이 좋습니다.
사례 별 주문
데이터를 숫자 또는 알파벳순으로 정렬하려면 order by [column]
사용하여 간단하게 order by [column]
수 있습니다. 사용자 지정 계층 구조를 사용하여 정렬하려면 case 문을 사용합니다.
Group
-----
Total
Young
MiddleAge
Old
Male
Female
기본 order by
사용 :
Select * from MyTable
Order by Group
항상 바람직하지 않은 알파벳순 정렬을 반환합니다.
Group
-----
Female
Male
MiddleAge
Old
Total
Young
'case'문을 추가하고 데이터를 정렬하려는 순서대로 오름차순 숫자 값을 지정합니다.
Select * from MyTable
Order by case Group
when 'Total' then 10
when 'Male' then 20
when 'Female' then 30
when 'Young' then 40
when 'MiddleAge' then 50
when 'Old' then 60
end
지정된 순서대로 데이터를 반환합니다.
Group
-----
Total
Male
Female
Young
MiddleAge
Old