Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL GROUP BY perilaku

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menghitung Selisih Antara Dua Tanggal di MySQL

  2. Jenis MySQL ENUM vs tabel gabungan

  3. Bagaimana cara memilih baris pertama untuk setiap grup di MySQL?

  4. Cara Gagal atau Hancurkan Instans MySQL Anda untuk Pengujian

  5. Cara mengatur dan login sebagai pengguna root di MySQL