Saya memiliki dua tabel berikut:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Saya ingin mencari dosen dengan Spesialisasi paling banyak. Ketika saya mencoba ini, itu tidak berfungsi:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Tetapi ketika saya mencoba ini, ia bekerja:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
Fname,
Lname
HAVING COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Apa alasannya? Terima kasih.
Jawaban:
WHERE
klausa memperkenalkan suatu kondisi pada baris individual ;HAVING
klausa memperkenalkan kondisi pada agregasi , yaitu hasil seleksi di mana hasil tunggal, seperti jumlah, rata-rata, min, maks, atau jumlah, telah dihasilkan dari beberapa baris. Kueri Anda meminta jenis kondisi kedua (yaitu kondisi pada agregasi) karenanyaHAVING
berfungsi dengan benar.Sebagai aturan praktis, gunakan
WHERE
sebelumGROUP BY
danHAVING
sesudahGROUP BY
. Ini adalah aturan yang agak primitif, tetapi berguna dalam lebih dari 90% kasus.Saat melakukannya, Anda mungkin ingin menulis ulang kueri menggunakan versi ANSI dari gabungan:
Ini akan menghilangkan
WHERE
yang digunakan sebagai syarat bergabung theta .sumber
HAVING
beroperasi pada agregat. KarenaCOUNT
fungsi agregat, Anda tidak bisa menggunakannya dalamWHERE
klausa.Berikut ini beberapa bacaan dari MSDN tentang fungsi agregat.
sumber
Pertama-tama kita harus mengetahui urutan pelaksanaan Klausul yaitu DARI> DIMANA> KELOMPOK OLEH> HAVING> DISTINCT> SELECT> ORDER BY. Karena Klausa WHERE dieksekusi sebelum GROUP BY Clause, rekaman tidak dapat difilter dengan menerapkan WHERE ke GROUP BY rekaman terapan.
"MEMILIKI sama dengan klausa WHERE tetapi diterapkan pada catatan yang dikelompokkan".
pertama klausa WHERE mengambil catatan berdasarkan kondisi kemudian klausa GROUP BY mengelompokkannya sesuai dan kemudian klausa HAVING mengambil catatan grup berdasarkan kondisi yang ada.
sumber
Klausa WHERE dapat digunakan dengan pernyataan SELECT, INSERT, dan UPDATE, sedangkan HAVING hanya dapat digunakan dengan pernyataan SELECT.
WHERE menyaring baris sebelum agregasi (KELOMPOK OLEH), sedangkan HAVING grup filter setelah agregasi dilakukan.
Fungsi agregat tidak dapat digunakan dalam klausa WHERE kecuali dalam subquery yang terkandung dalam klausa HAVING, sedangkan fungsi agregat dapat digunakan dalam klausa HAVING.
Sumber
sumber
Tidak melihat contoh keduanya dalam satu kueri. Jadi contoh ini mungkin bisa membantu.
Ini memfilter tabel pertama oleh companyId, lalu mengelompokkannya (berdasarkan negara dan kota) dan juga memfilternya ke agregat kota di Meksiko. CompanyId tidak diperlukan dalam agregasi tetapi kami dapat menggunakan WHERE untuk memfilter hanya baris yang kami inginkan sebelum menggunakan GROUP BY.
sumber
Anda tidak dapat menggunakan mana klausa dengan fungsi agregat karena di mana mengambil catatan berdasarkan kondisi, itu masuk ke tabel catatan dengan catatan dan kemudian mengambil catatan berdasarkan kondisi yang kami berikan. Sehingga saat itu kita tidak bisa kemana klausa. Meskipun klausa berfungsi pada resultSet yang akhirnya kami dapatkan setelah menjalankan kueri.
Contoh permintaan:
Ini akan menyimpan resultSet dalam memori sementara, kemudian memiliki klausa akan melakukan tugasnya. Jadi kita dapat dengan mudah menggunakan fungsi agregat di sini.
sumber
1. Kita dapat menggunakan fungsi agregat dengan klausa HAVING bukan dengan klausa WHERE mis. Min, max, avg.
2. WHERE clause menghilangkan record tuple dengan tuple HAVING klausa menghilangkan seluruh grup dari kumpulan grup
Sebagian besar HAVING digunakan ketika Anda memiliki grup data dan DI MANA digunakan ketika Anda memiliki data dalam baris.
sumber