2015-01-26 19 views
6

La clausola "group by" garantisce automaticamente che i risultati vengano ordinati da quella chiave? In altre parole, è sufficiente scrivere:"group by" garantisce automaticamente "ordine per"?

select * 
from table 
group by a, b, c 

o cosa si deve scrivere

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

So per esempio in MySQL non è necessario, ma mi piacerebbe sapere se posso fare affidamento su di esso attraverso le implementazioni SQL. È garantito?

+1

Btw, ho appena controllato: Il mio PostgreSQL 9.3.4 * non * ritorna automaticamente dati ordinati quando si usa 'group by'. – JimmyB

+0

Ho provato ad AdventureWorks db di Msdn. Funziona, raggruppa per dati ordinati, mi chiedo dipende dal tipo di dati? Così ho provato una data e un solo gruppo di istruzioni. –

risposta

15

group by non ordina i dati correttamente. Un DB è progettato per catturare i dati il ​​più velocemente possibile e ordinare solo se necessario.

Quindi aggiungere order by se è necessario un ordine garantito.

+4

Un'implementazione efficiente di 'group by' eseguirà il raggruppamento ordinando i dati internamente. Ecco perché alcuni RDBMS restituiscono l'output ordinato durante il raggruppamento. Tuttavia, le specifiche SQL non impongono questo comportamento, quindi, a meno che non sia esplicitamente documentato dal fornitore RDBMS, non scommetterei che funzioni (domani). OTOH, * se * l'RDBMS fa implicitamente un ordinamento, potrebbe anche essere abbastanza intelligente da ottimizzare (via) l'ordine 'ridondante di'. – JimmyB

+0

grazie @JimmyB. I tuoi commenti su questa pagina probabilmente costituiranno un'ottima risposta se messi insieme :-) – TMS

0

Decisamente no. L'ho sperimentato, una volta che una delle mie domande ha improvvisamente iniziato a restituire risultati non ordinati, man mano che i dati nella tabella aumentavano.

-1

Dipende dal numero di record. Quando i record sono inferiori, raggruppa ordinandoli automaticamente. Quando i record sono più (più di 15) è necessario aggiungere Ordine per clausola

+0

puoi citare qualche riferimento per questo? Questo è probabilmente solo per un motore particolare, giusto? – TMS

0

Ho provato. Adventureworks db di Msn.

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

resuts:

2009-01-10Production Tecnico - WC40

2009-01-11Application Specialist

2009-01-12Assistant al Chief Financial Officer

2009-01-13 Tecnico di produzione - WC50 <

Restituisce i dati ordinati di hiredate, ma non si basa su GROUP BY su SORT in nessun caso.

per esempio; gli indici possono cambiare questi dati ordinati.

ho aggiunto seguente indice (HireDate, jobTitle)

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

Risultato cambierà con stessa query di selezione;

2006-06-30 Produzione Tecnico - WC60

2007-01-26 Marketing Assistant

2007-11-11 Engineering Manager

2007-12-05 anziano Designer Tool

2007-12-11 Designer Tool

2007-12-20 Marketing manager

2007-12-26 Produzione Supervisore - WC60

È possibile scaricare Adventureworks2016 al seguente indirizzo

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