Kueri Anda adalah sintaks yang benar-benar legal, Anda dapat memesan berdasarkan kolom yang tidak ada di pilih.
- Demo Bekerja dengan MySQL
- Demo Bekerja dengan SQL Server
- Demo Bekerja dengan Postgresql
- Demo Bekerja dengan SQLite
- Demo Bekerja dengan Oracle
Jika Anda memerlukan spesifikasi lengkap tentang pemesanan legal, dalam SQL Standard 2003 ia memiliki daftar panjang pernyataan tentang apa yang harus dan tidak boleh berisi pesanan, (Yayasan 02, halaman 415, bagian 7.13
Saya pikir kebingungan Anda mungkin timbul karena memilih, dan/atau mengurutkan berdasarkan kolom yang tidak ada dalam grup oleh, atau mengurutkan berdasarkan kolom yang tidak dipilih saat menggunakan berbeda.
Keduanya memiliki masalah mendasar yang sama, dan MySQL adalah satu-satunya untuk pengetahuan saya yang memungkinkan keduanya.
Masalahnya adalah ini, bahwa ketika menggunakan grup dengan atau berbeda, kolom apa pun yang tidak terdapat di keduanya tidak diperlukan, jadi tidak masalah jika mereka memiliki beberapa nilai berbeda di seluruh baris karena tidak pernah diperlukan. Bayangkan kumpulan data sederhana ini:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
3 | B | Y |
Jika Anda menulis:
SELECT DISTINCT Column1
FROM T;
Anda akan mendapatkan
Column1
---------
A
B
Jika Anda kemudian menambahkan ORDER BY Column2
, mana dari dua kolom2 yang akan Anda gunakan untuk mengurutkan A, X atau Z? Tidak deterministik tentang bagaimana memilih nilai untuk kolom2.
Hal yang sama berlaku untuk memilih kolom yang tidak termasuk dalam grup oleh. Untuk menyederhanakan, bayangkan dua baris pertama dari tabel sebelumnya:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
Di MySQL Anda dapat menulis
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
Ini sebenarnya melanggar Standar SQL, tetapi berfungsi di MySQL, namun masalahnya adalah non-deterministik, hasilnya:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
Tidak lebih atau kurang benar dari
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
Jadi yang Anda katakan adalah beri saya satu baris untuk setiap nilai Column1
yang berbeda , yang memenuhi kedua set hasil, jadi bagaimana Anda tahu mana yang akan Anda dapatkan? Tidak, tampaknya kesalahpahaman yang cukup populer bahwa Anda dapat menambahkan dan ORDER BY
klausa untuk memengaruhi hasil, jadi misalnya kueri berikut:
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
Akan memastikan bahwa Anda mendapatkan hasil berikut:
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
karena ORDER BY ID DESC
, namun ini tidak benar (seperti yang ditunjukkan di sini
).
Dokumen MySQL status:
Jadi meskipun Anda memiliki pesanan dengan ini tidak berlaku sampai setelah satu baris per grup telah dipilih, dan satu baris ini non-deterministik.
SQL-Standard memungkinkan kolom dalam daftar pilih yang tidak terdapat dalam GROUP BY atau fungsi agregat, namun kolom ini harus secara fungsional bergantung pada kolom di GROUP BY. Dari SQL-2003-Standard (5WD-02-Foundation-2003-09 - halaman 346) - http ://www.wiscorp.com/sql_2003_standard.zip
Misalnya, ID dalam tabel sampel adalah KUNCI UTAMA, jadi kita tahu itu unik dalam tabel, jadi kueri berikut sesuai dengan standar SQL dan akan berjalan di MySQL dan gagal di banyak DBMS saat ini (Pada saat penulisan Postgresql adalah DBMS terdekat yang saya tahu untuk menerapkan standar dengan benar - Contoh di sini ):
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
Karena ID unik untuk setiap baris, hanya boleh ada satu nilai Column1
untuk setiap ID, satu nilai Column2
tidak ada ambiguitas tentang apa yang harus dikembalikan untuk setiap baris.