Perbedaan nomor satu bagi saya: jika HAVING
dihapus 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 WHERE
dari 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 DUAL
dalam Oracle) menggunakan ON
klausa untuk mensimulasikan WHERE
klausa 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 HAVING
besok 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 HAVING
klausa dapat digunakan tanpa GROUP BY
klausa. Dalam hal ini, HAVING
klausa diterapkan ke seluruh ekspresi tabel dan mengharuskan hanya konstanta yang muncul dalam SELECT
klausa. Biasanya HAVING
klausa akan melibatkan agregat.
Ini lebih bermanfaat daripada kedengarannya. Misalnya, pertimbangkan permintaan ini untuk menguji apakah name
kolom 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 HAVING
klausa itu benar maka hasil dengan menjadi satu baris berisi nilai 1
, jika tidak hasilnya akan menjadi set kosong.
HAVING
adalah filter pasca-agregasi, sedangkan filterWHERE
pra-agregasi.