Menurut definisi, ORDER BY diproses setelah pengelompokan dengan GROUP BY. Menurut definisi, cara konseptual setiap pernyataan SELECT diproses adalah:
- Hitung produk kartesius dari semua tabel yang dirujuk dalam klausa FROM
- Terapkan kriteria bergabung dari klausa FROM untuk memfilter hasil
- Terapkan kriteria filter dalam klausa WHERE untuk memfilter hasil lebih lanjut
- Kelompokkan hasil ke dalam himpunan bagian berdasarkan klausa GROUP BY, ciutkan hasil menjadi satu baris untuk setiap himpunan bagian tersebut dan hitung nilai fungsi agregat apa pun --
SUM()
,MAX()
,AVG()
, dll. -- untuk setiap subset tersebut. Perhatikan bahwa jika tidak ada klausa GROUP BY yang ditentukan, hasilnya akan diperlakukan seolah-olah ada subset tunggal dan fungsi agregat apa pun berlaku untuk seluruh set hasil, menciutkannya menjadi satu baris. - Filter hasil yang sekarang dikelompokkan berdasarkan klausa HAVING.
- Urutkan hasil berdasarkan klausa ORDER BY.
Satu-satunya kolom yang diizinkan dalam kumpulan hasil SELECT dengan klausa GROUP BY, tentu saja,
- Kolom yang dirujuk dalam klausa GROUP BY
- Fungsi agregat (seperti
MAX()
) - literal/konstanta
- ekspresi yang diturunkan dari salah satu di atas.
Hanya implementasi SQL yang rusak yang memungkinkan hal-hal seperti select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— referensi ke kolom a, b dan c tidak berarti/tidak terdefinisi, mengingat bahwa grup individu telah diciutkan menjadi satu baris,