MySQL memilih baris secara sewenang-wenang. Dalam praktiknya, mesin penyimpanan MySQL yang umum digunakan mengembalikan nilai dari pertama baris dalam grup, sehubungan dengan penyimpanan fisik.
create table foo (id serial primary key, category varchar(10));
insert into foo (category) values
('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar');
select * from foo group by category;
+----+----------+
| id | category |
+----+----------+
| 4 | bar |
| 1 | foo |
+----+----------+
Orang lain benar bahwa MySQL memungkinkan Anda untuk menjalankan kueri ini meskipun memiliki hasil yang sewenang-wenang dan berpotensi menyesatkan. Standar SQL, dan sebagian besar vendor RDBMS lainnya, melarang jenis kueri GROUP BY yang ambigu ini. Ini disebut Aturan Nilai Tunggal :semua kolom dalam daftar pilih harus secara eksplisit menjadi bagian dari kriteria GROUP BY, atau di dalam fungsi agregat, mis. COUNT()
, MAX()
, dll.
MySQL mendukung mode SQL ONLY_FULL_GROUP_BY
yang membuat MySQL mengembalikan kesalahan jika Anda mencoba menjalankan kueri yang melanggar semantik standar SQL.
AFAIK, SQLite adalah satu-satunya RDBMS lain yang memungkinkan kolom ambigu dalam kueri yang dikelompokkan. SQLite mengembalikan nilai dari terakhir baris dalam grup:
select * from foo group by category;
6|bar
3|foo
Kita dapat membayangkan kueri yang tidak ambigu, namun tetap melanggar semantik standar SQL.
SELECT foo.*, parent_of_foo.*
FROM foo JOIN parent_of_foo
ON (foo.parent_id = parent_of_foo.parent_id)
GROUP BY foo_id;
Tidak ada cara logis ini bisa menghasilkan hasil yang ambigu. Setiap baris di foo mendapatkan grupnya sendiri, jika kita GROUP BY kunci utama foo. Jadi kolom apa pun dari foo hanya dapat memiliki satu nilai dalam grup. Bahkan bergabung ke tabel lain yang direferensikan oleh kunci asing di foo hanya dapat memiliki satu nilai per grup, jika grup ditentukan oleh kunci utama foo.
MySQL dan SQLite memercayai Anda untuk merancang kueri yang tidak ambigu secara logis. Secara formal, setiap kolom dalam daftar pilih harus berupa ketergantungan fungsional kolom dalam kriteria GROUP BY. Jika Anda tidak mematuhi ini, itu salah Anda. :-)
SQL standar lebih ketat dan melarang beberapa kueri yang bisa tidak ambigu--mungkin karena terlalu rumit untuk RDBMS untuk memastikan secara umum.