Perbedaan nomor satu bagi saya: jika HAVINGdihapus dari bahasa SQL maka kehidupan akan berjalan kurang lebih seperti sebelumnya. Tentu saja, permintaan minoritas perlu ditulis ulang menggunakan tabel turunan, CTE, dll, tetapi mereka bisa lebih mudah dipahami dan dipertahankan sebagai hasilnya. Mungkin kode pengoptimal vendor perlu ditulis ulang untuk menjelaskan hal ini, lagi-lagi kesempatan untuk perbaikan dalam industri.
Sekarang pertimbangkan sejenak untuk menghapus WHEREdari bahasa. Kali ini mayoritas pertanyaan yang ada perlu ditulis ulang tanpa konstruk alternatif yang jelas. Coders harus mendapatkan kreatif misalnya gabung dalam ke tabel yang diketahui mengandung tepat satu baris (misalnya DUALdalam Oracle) menggunakan ONklausa untuk mensimulasikan WHEREklausa sebelumnya . Konstruksi seperti itu akan dibuat; akan jelas ada sesuatu yang hilang dari bahasa dan situasinya akan menjadi lebih buruk.
TL; DR kita bisa kehilangan HAVINGbesok dan segalanya tidak akan lebih buruk, mungkin lebih baik, tetapi hal yang sama tidak dapat dikatakan WHERE.
Dari jawaban di sini, tampaknya banyak orang tidak menyadari bahwa HAVINGklausa dapat digunakan tanpa GROUP BYklausa. Dalam hal ini, HAVINGklausa diterapkan ke seluruh ekspresi tabel dan mengharuskan hanya konstanta yang muncul dalam SELECTklausa. Biasanya HAVINGklausa akan melibatkan agregat.
Ini lebih bermanfaat daripada kedengarannya. Misalnya, pertimbangkan permintaan ini untuk menguji apakah namekolom tersebut unik untuk semua nilai di T:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
Hanya ada dua kemungkinan hasil: jika HAVINGklausa itu benar maka hasil dengan menjadi satu baris berisi nilai 1, jika tidak hasilnya akan menjadi set kosong.
HAVINGadalah filter pasca-agregasi, sedangkan filterWHEREpra-agregasi.