Bolehkah Klausa HAVING Digunakan Tanpa Klausa KUMPULAN MENGIKUT?
Piawaian SQL menggariskan kriteria khusus untuk menggunakan klausa HAVING, yang merangkumi merujuk lajur yang berfungsi bergantung pada klausa GROUP BY atau rujukan luar. Walau bagaimanapun, pertanyaan yang diberikan menimbulkan persoalan sama ada boleh menggunakan HAVING tanpa GROUP BY.
Spesifikasi SQL Standard
Mengikut standard, klausa HAVING tanpa klausa GROUP BY tidak dilarang secara jelas. Walau bagaimanapun, pertanyaan mempamerkan tingkah laku yang boleh dipersoalkan:
SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)
Pertanyaan ini menggunakan fungsi agregat (MAX) dalam klausa HAVING, tetapi ia tidak menunjukkan baris tertentu yang harus dipilih. Oleh itu, tingkah lakunya tidak ditakrifkan secara ketat oleh standard.
Pelaksanaan MySQL
MySQL mentafsir pertanyaan ini seolah-olah terdapat klausa GROUP BY tersirat, memilih baris sahaja dengan nilai NumberOfPages maksimum. Tingkah laku ini tidak mematuhi standard.
Sebab Ketidakpatuhan Standard
Standard memerlukan klausa HAVING untuk beroperasi pada kumpulan baris yang ditakrifkan oleh klausa GROUP BY. Tujuannya adalah untuk menapis kumpulan berdasarkan nilai agregat. Menggunakan HAVING tanpa GROUP BY akan membenarkan penapisan pada keadaan sewenang-wenangnya, yang berpotensi membawa kepada hasil yang tidak dijangka.
Pertanyaan SQL Standard yang Sah
Pertanyaan SQL Standard yang sah menggunakan HAVING tanpa GROUP BY ialah:
SELECT 'T' AS result FROM Book HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
Pertanyaan ini menyemak sama ada NumberOfPages minimum nilai kurang daripada nilai maksimum, mengembalikan satu baris dengan hasil 'T' jika benar dan set kosong jika palsu. Tingkah laku ini konsisten dengan keperluan standard yang HAVING digunakan pada fungsi agregat yang beroperasi pada keseluruhan jadual.
Atas ialah kandungan terperinci Bolehkah HAVING Digunakan dalam SQL Tanpa Klausa GROUP BY?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!