Z definicji ORDER BY jest przetwarzane po grupowanie z GROUP BY. Z definicji, koncepcyjny sposób przetwarzania każdej instrukcji SELECT to:
- Oblicz iloczyn kartezjański wszystkich tabel, do których odwołuje się klauzula FROM
- Zastosuj kryteria łączenia z klauzuli FROM, aby filtrować wyniki
- Zastosuj kryteria filtrowania w klauzuli WHERE, aby dalej filtrować wyniki
- Pogrupuj wyniki w podzbiory na podstawie klauzuli GROUP BY, zwijając wyniki do jednego wiersza dla każdego takiego podzbioru i obliczając wartości dowolnych funkcji agregujących —
SUM()
,MAX()
,AVG()
itd. - dla każdego takiego podzbioru. Zwróć uwagę, że jeśli nie określono klauzuli GROUP BY, wyniki są traktowane tak, jakby istniał pojedynczy podzbiór, a wszelkie funkcje agregujące dotyczą całego zestawu wyników, zwijając go do pojedynczego wiersza. - Przefiltruj teraz zgrupowane wyniki na podstawie klauzuli HAVING.
- Posortuj wyniki na podstawie klauzuli ORDER BY.
Jedyne kolumny dozwolone w zestawie wyników SELECT z klauzulą GROUP BY to oczywiście
- Kolumny, do których odwołuje się klauzula GROUP BY
- Funkcje agregujące (takie jak
MAX()
) - dosłowne/stałe
- wyrażenia pochodzące z dowolnego z powyższych.
Tylko uszkodzone implementacje SQL pozwalają na takie rzeczy jak select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— odniesienia do kolumn a, b i c są bez znaczenia/nieokreślone, biorąc pod uwagę, że poszczególne grupy zostały zwinięte do jednego wiersza,