2015-01-26 16 views
6

Điều khoản "nhóm theo" có tự động đảm bảo rằng kết quả sẽ được sắp xếp theo khóa đó không? Nói cách khác, nó là đủ để viết:"Nhóm theo" có tự động đảm bảo "đặt hàng trước" không?

select * 
from table 
group by a, b, c 

hay không một phải viết

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

Tôi biết ví dụ trong MySQL, tôi không phải làm thế, nhưng tôi muốn biết liệu tôi có thể dựa vào nó trong các triển khai SQL hay không. Nó có được đảm bảo không?

+1

Btw, tôi chỉ cần kiểm tra: PostgreSQL 9.3.4 My nào * không * tự động trả về dữ liệu được sắp xếp khi sử dụng 'nhóm theo'. – JimmyB

+0

Tôi đã cố gắng để AdventureWorks db của Msdn. Nó hoạt động, nhóm theo dữ liệu được sắp xếp, tôi tự hỏi nó phụ thuộc vào kiểu dữ liệu? Vì vậy, tôi đã thử một ngày và chỉ có một nhóm bằng các câu lệnh. –

Trả lời

15

group by không yêu cầu dữ liệu một cách cần thiết. DB được thiết kế để lấy dữ liệu nhanh nhất có thể và chỉ sắp xếp nếu cần.

Vì vậy hãy thêm order by nếu bạn cần một đơn đặt hàng được bảo đảm.

+4

Việc triển khai hiệu quả 'nhóm theo' sẽ thực hiện nhóm-ing bằng cách sắp xếp dữ liệu nội bộ. Đó là lý do tại sao một số RDBMS trả về kết quả được sắp xếp khi nhóm-ing. Tuy nhiên, các thông số kỹ thuật SQL không ủy thác hành vi đó, do đó, trừ khi được ghi rõ ràng bởi nhà cung cấp RDBMS, tôi sẽ không đặt cược vào nó để làm việc (ngày mai). OTOH, * nếu * RDBMS ngầm thực hiện một sắp xếp nó cũng có thể đủ thông minh để sau đó tối ưu hóa (đi) sự thừa 'thứ tự bởi'. – JimmyB

+0

cảm ơn @JimmyB. Nhận xét của bạn trên trang này có lẽ sẽ bao gồm một câu trả lời tuyệt vời nếu đặt cùng nhau :-) – TMS

0

Chắc chắn là không. Tôi đã trải qua điều đó, khi một trong các truy vấn của tôi đột nhiên bắt đầu trả lại kết quả không được đặt hàng, vì dữ liệu trong bảng tăng lên.

-1

Tùy thuộc vào số lượng bản ghi. Khi các bản ghi ít hơn, Nhóm được sắp xếp tự động. Khi các bản ghi nhiều hơn (hơn 15), nó yêu cầu thêm Lệnh theo mệnh đề

+0

bạn có thể trích dẫn bất kỳ tham chiếu nào về điều đó không? Điều này có lẽ chỉ dành cho một số động cơ cụ thể đúng không? – TMS

0

Tôi đã thử nó. Adventureworks db của Msdn.

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

Resuts:

2009-01-10Production Kỹ Thuật - WC40

2009-01-11Application Chuyên

2009-01-12Assistant đến Giám đốc tài chính

2009-01-13Chính kỹ thuật sản xuất - WC50 <

Nó trả về dữ liệu được tuyển dụng của thuê, nhưng bạn không dựa vào GROUP BY để SORT trong bất kỳ trường hợp nào. Ví dụ:

; các chỉ mục có thể thay đổi dữ liệu được sắp xếp này.

tôi thêm vào sau chỉ mục (hiredate, jobtitle)

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

Kết quả sẽ thay đổi với cùng một truy vấn chọn;

2006-06-30 Production Technician - WC60

2007-01-26 Marketing Assistant

2007-11-11 Engineering Manager

2007-12-05 Công cụ Senior Designer

2007-12-11 Công cụ thiết kế

2007-12-20 Giám đốc tiếp thị

2007/12/26 Production Supervisor - WC60

Bạn có thể tải Adventureworks2016 theo địa chỉ sau

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

Các vấn đề liên quan