Pengenalan
Pelanjutan MySQL kepada GROUP BY klausa, membenarkan pemilihan lajur yang tidak termasuk dalam kumpulan, telah menimbulkan persoalan mengenai pematuhan kepada piawaian SQL. Artikel ini meneroka konteks sejarah dan implikasi sisihan ini.
Standard
Sebelum SQL-2003, adalah amalan standard untuk melarang pemilihan bukan agregat lajur yang bukan sebahagian daripada klausa GROUP BY. Sekatan ini memastikan hasil yang konsisten dengan menghapuskan kumpulan samar-samar.
Sambungan MySQL
MySQL memperkenalkan sambungan yang membenarkan lajur tidak teragregat dipilih walaupun ia bukan sebahagian daripada KUMPULAN OLEH. Menurut dokumentasi MySQL, ini dilakukan untuk pengoptimuman prestasi dengan mengelakkan pengisihan dan pengelompokan yang tidak perlu. Walau bagaimanapun, ia disertakan dengan kaveat: nilai bukan agregat mungkin tidak tentu, bermakna pelayan boleh memilih sebarang nilai daripada setiap kumpulan.
Tafsiran SQL Standard
The Standard SQL-2003 membenarkan rujukan lajur tidak teragregat dalam senarai pilih jika ia bergantung secara fungsi pada lajur kumpulan atau terkandung dalam hujah agregat. Kebergantungan fungsi memastikan bahawa untuk setiap nilai lajur pengumpulan, terdapat satu nilai unik untuk lajur tidak teragregat.
Pelaksanaan MySQL
Pelanjutan MySQL menyimpang daripada standard dengan membenarkan semua lajur dipilih, walaupun lajur yang tidak bergantung secara fungsi pada lajur pengelompokan. Ini boleh membawa kepada hasil yang tidak dijangka apabila nilai bukan agregat berbeza-beza dalam kumpulan.
Akibat Sambungan MySQL
Pelaksanaan MySQL mempunyai dua implikasi utama:
Mengalamatkan MySQL Sisihan
Pengguna MySQL boleh melumpuhkan tingkah laku bukan standard dengan menetapkan mod_sql kepada ONLY_FULL_GROUP_BY. Selain itu, penambahbaikan telah diperkenalkan dalam MySQL 5.7 untuk lebih mematuhi standard. PostgreSQL 9.1 juga menawarkan pelaksanaan yang lebih ketat yang mematuhi keperluan pergantungan berfungsi.
Atas ialah kandungan terperinci Adakah MySQL Bukan Standard GROUP BY Behavior Melanggar Piawaian SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!