2015-01-26 4 views
6

"group by"절이 자동으로 결과가 해당 키로 정렬되도록 보장합니까? 즉, 쓸 충분히입니다 :"그룹 기준"이 자동으로 "주문"을 보증합니까?

select * 
from table 
group by a, b, c 

또는 하나

select * 
from table 
group by a, b, c 
order by a, b, c 

내가 예를 들어, 알고 쓸 필요가 않습니다 MySQL에서 필자는 그렇게 할 필요는 없지만 SQL 구현 전체에 의지 할 수 있는지 알고 싶습니다. 보장 되나요?

+1

Btw는 다음 주소에서 Adventureworks2016을 다운로드 할 수 있습니다, 난 그냥 확인 : 내 PostgreSQL의 9.3.4는 않습니다 *하지 * 자동으로 돌아 정렬 된 데이터 group by를 사용할 때. – JimmyB

+0

Msdn의 AdventureWorks db를 시도했습니다. 정렬 된 데이터별로 그룹화됩니다. 데이터 유형에 따라 다릅니다. 그래서 저는 성명서로 날짜와 단 하나의 그룹을 시도했습니다. –

답변

15

group by 데이터를 주문하지 않아도됩니다. DB는 가능한 한 빨리 데이터를 수집하고 필요한 경우 정렬 만하도록 설계되었습니다.

보증 된 주문이 필요한 경우 을 추가하십시오.

+4

'group by '을 효율적으로 구현하면 내부적으로 데이터를 정렬하여 그룹화를 수행 할 수 있습니다. 이것이 그룹화 할 때 일부 RDBMS가 정렬 된 결과를 반환하는 이유입니다. 그러나 SQL 스펙은 해당 동작을 요구하지 않으므로 RDBMS 공급 업체가 명시 적으로 문서화하지 않으면 (내일) 작동 할 수는 없습니다. OTOH, * RDBMS가 암시 적으로 정렬을 수행하면 잉여'order by '를 최적화 (멀리) 할만큼 똑똑 할 수도 있습니다. – JimmyB

+0

감사합니다. @JimmyB. 이 페이지에 대한 귀하의 의견은 아마도 :-) – TMS

0

확실히 그렇지 않습니다. 테이블의 데이터가 증가함에 따라 쿼리 중 하나가 갑자기 순서가 지정되지 않은 결과를 반환하기 시작한 것을 경험했습니다.

-1

레코드 수에 따라 다릅니다. 레코드가 적 으면 그룹화가 자동으로 정렬됩니다. 레코드가 15 개 이상일 때 Order by 절을 추가해야합니다.

+0

을 함께 쓰면 좋은 대답이 될 수 있습니다. 이것은 아마도 특정 엔진에 대한 권리 일 뿐입니 까? – TMS

0

시도했습니다. Msdn의 Adventureworks db

select HireDate, min(JobTitle) 
from AdventureWorks2016CTP3.HumanResources.Employee 
group by HireDate 

Resuts :

2009-01-10Production 기술자 - WC40

2009-01-11Application 전문가

2009-01-12Assistant 최고 재무 책임자 (CFO)

에 2009-01-13 생산 기술자 - WC50 <

hardate의 정렬 된 데이터를 반환하지만 어떤 상황에서도 GROUP BY를 사용하여 SORT에 의존하지 않습니다.

예 : 인덱스는이 정렬 된 데이터를 변경할 수 있습니다.

내가 지수에게 다음과 같은 추가 된 (HIREDATE, jobtitle)

CREATE NONCLUSTERED INDEX NonClusturedIndex_Jobtitle_hireddate ON [HumanResources].[Employee] 
(
    [JobTitle] ASC, 
    [HireDate] ASC 
) 

결과이 같은 선택 쿼리로 변경됩니다;

2006년 6월 30일 생산 기술자 - WC60

2007년 1월 26일 마케팅 지원

2007-11-11 엔지니어링 매니저

2007-12-05 수석 도구 디자이너

2007년 12월 11일 도구 디자이너

2007-12-20 마케팅 매니저

2007-12-26 생산 관리자 - WC60

당신은

https://www.microsoft.com/en-us/download/details.aspx?id=49502