Saya harus googling dengan cara yang salah atau saya mengalami momen bodoh dalam waktu.
Apa perbedaan antara HAVING
dan WHERE
dalam suatu SQL SELECT
pernyataan?
EDIT: Saya telah menandai jawaban Steven sebagai jawaban yang benar karena berisi sedikit informasi penting pada tautan:
Ketika
GROUP BY
tidak digunakan,HAVING
berperilaku sepertiWHERE
klausa
Situasi yang saya lihat di WHERE
dalam tidak ada GROUP BY
dan di situlah kebingungan saya mulai. Tentu saja, sampai Anda tahu ini, Anda tidak dapat menentukannya dalam pertanyaan.
HAVING
adalah filter pasca-agregasi, sedangkan filterWHERE
pra-agregasi.Jawaban:
Sumber
sumber
HAVING: digunakan untuk memeriksa kondisi setelah agregasi berlangsung.
WHERE: digunakan untuk memeriksa kondisi sebelum agregasi berlangsung.
Kode ini:
Memberi Anda tabel semua kota di MA dan jumlah alamat di setiap kota.
Kode ini:
Memberi Anda daftar kota di MA dengan lebih dari 5 alamat dan jumlah alamat di setiap kota.
sumber
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 (misalnyaDUAL
dalam Oracle) menggunakanON
klausa untuk mensimulasikanWHERE
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 dikatakanWHERE
.Dari jawaban di sini, tampaknya banyak orang tidak menyadari bahwa
HAVING
klausa dapat digunakan tanpaGROUP BY
klausa. Dalam hal ini,HAVING
klausa diterapkan ke seluruh ekspresi tabel dan mengharuskan hanya konstanta yang muncul dalamSELECT
klausa. BiasanyaHAVING
klausa akan melibatkan agregat.Ini lebih bermanfaat daripada kedengarannya. Misalnya, pertimbangkan permintaan ini untuk menguji apakah
name
kolom tersebut unik untuk semua nilai diT
:Hanya ada dua kemungkinan hasil: jika
HAVING
klausa itu benar maka hasil dengan menjadi satu baris berisi nilai1
, jika tidak hasilnya akan menjadi set kosong.sumber
Klausa HAVING ditambahkan ke SQL karena kata kunci WHERE tidak dapat digunakan dengan fungsi agregat.
Lihat tautan w3schools ini untuk informasi lebih lanjut
Sintaksis:
Kueri seperti ini:
... dapat ditulis ulang menggunakan tabel turunan (dan menghilangkan
HAVING
) seperti ini:sumber
HAVING
ditambahkan karena tabel turunan belum ditambahkan ke bahasa dan sampai mereka SQL tidak lengkap secara relasional dan begitu mereka pastiHAVING
menjadi berlebihan.Perbedaan antara keduanya adalah dalam hubungan dengan klausa GROUP BY:
WHERE datang sebelum GROUP BY; SQL mengevaluasi klausa WHERE sebelum mengelompokkan catatan.
HAVING muncul setelah GROUP BY; SQL mengevaluasi HAVING setelah mengelompokkan catatan.
Referensi
SQLite SELECT Statement Syntax / Railroad Diagram
Informix SELECT Statement Syntax / Railroad Diagram
sumber
SELECT 1 AS result FROM T HAVING...
- dalam diagram Anda, saya tidak dapat melakukannyaHAVING
tanpa melewatiGROUP BY
tapi kueri yang benar-benar valid dan berguna tidakGROUP BY
. Poin minor: Anda tidak memiliki opsi untuk memasukkan nilai literal dalamSELECT
klausa.WHERE->HAVING
bagian itu, jadi saya pikir layak untuk memperhatikan detail. Jika menurut Anda jawaban saya salah, edit atau kirim koreksi yang disarankan di komentar.HAVING
digunakan ketika Anda menggunakan agregat sepertiGROUP BY
.sumber
WHERE diterapkan sebagai batasan pada set yang dikembalikan oleh SQL; ia menggunakan set oeprations dan indeks bawaan SQL dan karena itu adalah cara tercepat untuk menyaring set hasil. Selalu gunakan WHERE jika memungkinkan.
HAVING diperlukan untuk beberapa filter agregat. Ini memfilter kueri SETELAH sql telah mengambil, mengumpulkan, dan mengurutkan hasilnya. Oleh karena itu, ini jauh lebih lambat daripada DIMANA dan harus dihindari kecuali dalam situasi yang mengharuskannya.
SQL Server akan membiarkan Anda menggunakan HAVING bahkan ketika DI MANA akan jauh lebih cepat. Jangan lakukan itu.
sumber
Klausa WHERE tidak berfungsi untuk fungsi agregat
berarti: Anda tidak boleh menggunakan bonus seperti ini: nama tabel
DI SINI Alih-alih menggunakan klausa WHERE Anda harus menggunakan HAVING ..
tanpa menggunakan klausa GROUP BY, klausa HAVING hanya berfungsi sebagai klausa WHERE
sumber
Perbedaan b / b
WHERE
danHAVING
klausa:Perbedaan utama antara
WHERE
danHAVING
klausa adalah,WHERE
digunakan untuk operasi baris danHAVING
digunakan untuk operasi kolom.Mengapa kita perlu
HAVING
klausa?Seperti yang kita ketahui, fungsi agregat hanya dapat dilakukan pada kolom, jadi kami tidak dapat menggunakan fungsi agregat dalam
WHERE
klausa. Oleh karena itu, kami menggunakan fungsi agregat dalamHAVING
klausa.sumber
Ketika
GROUP BY
tidak digunakan,WHERE
danHAVING
klausa pada dasarnya setara.Namun, kapan
GROUP BY
digunakan:WHERE
klausul digunakan untuk catatan filter dari hasilnya. Penyaringan terjadi sebelum pengelompokan dibuat.HAVING
klausul digunakan untuk nilai-nilai filter dari kelompok (yaitu, untuk memeriksa kondisi setelah agregasi ke dalam kelompok telah dilakukan).Sumber daya dari Sini
sumber
Salah satu cara untuk memikirkannya adalah bahwa klausa memiliki adalah filter tambahan ke klausa mana.
Sebuah MANA klausa digunakan filter catatan dari hasilnya. Filter terjadi sebelum pengelompokan dibuat. Sebuah HAVING klausa digunakan untuk nilai-nilai filter dari kelompok
sumber
Dalam kueri agregat, (Kueri apa pun tempat fungsi agregat digunakan) Predikat dalam klausa di mana dievaluasi sebelum himpunan hasil antara agregat dihasilkan,
Predikat dalam klausa Memiliki diterapkan ke hasil agregat yang ditetapkan SETELAH itu telah dihasilkan. Itu sebabnya kondisi predikat pada nilai agregat harus ditempatkan di klausa Having, bukan di klausa Where, dan mengapa Anda bisa menggunakan alias yang didefinisikan dalam klausa Select dalam Klausa Having, tetapi tidak dalam klausa Where.
sumber
Saya punya masalah dan menemukan perbedaan lain antara
WHERE
danHAVING
. Itu tidak bertindak dengan cara yang sama pada kolom yang diindeks.WHERE my_indexed_row = 123
akan menampilkan baris dan secara otomatis melakukan "ORDER ASC" pada baris yang diindeks lainnya.HAVING my_indexed_row = 123
menunjukkan segalanya dari baris "yang dimasukkan" yang paling lama ke baris yang terbaru, tanpa urutan.sumber
Dari sini .
yang bertentangan dengan klausa WHERE yang diterapkan pada baris basis data
sumber
HAVING
beberapa dekade setelah itu 'ditinggalkan' oleh tabel turunan.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- tidak merujuk kolom dalamGROUP BY
klausa (tidak ada) atau kolom dalam fungsi agregat (referensi permintaan tidak ada kolom sama sekali).Saat mengerjakan sebuah proyek, ini juga pertanyaan saya. Seperti yang dinyatakan di atas, HAVING memeriksa kondisi pada hasil permintaan yang sudah ditemukan. Tapi DI MANA adalah untuk memeriksa kondisi saat kueri berjalan.
Biarkan saya memberi contoh untuk menggambarkan hal ini. Misalkan Anda memiliki tabel database seperti ini.
Misalkan, baris-baris berikut ada dalam tabel:
Sekarang, kami ingin mendapatkan
userid
dansum(dailyincome)
yangsum(dailyincome)>100
Jika kita menulis:
Ini akan menjadi kesalahan. Kueri yang benar adalah:
sumber
Klausa WHERE digunakan untuk membandingkan nilai dalam tabel dasar, sedangkan klausa HAVING dapat digunakan untuk memfilter hasil fungsi agregat dalam kumpulan hasil kueri Klik di sini !
sumber
Ketika GROUP BY tidak digunakan, klausa WHERE dan HAVING pada dasarnya setara.
Namun, ketika GROUP BY digunakan:
sumber
Saya menggunakan HAVING untuk membatasi kueri berdasarkan hasil fungsi agregat. EG pilih * dalam grup blahblahblah oleh SOMETHING yang memiliki hitungan (SOMETHING)> 0
sumber
Mungkin saja subjek "di mana" adalah baris, sedangkan subjek "memiliki" adalah sebuah kelompok. Apakah saya benar?
sumber