Klausa yang mempunyai SQL digunakan untuk menapis data dikumpulkan berdasarkan keadaan yang terpakai kepada hasil agregat kumpulan oleh klausa. Ia amat berguna apabila anda ingin memohon syarat pada fungsi agregat seperti Count, Sum, AVG, Max, atau Min.
Berikut adalah cara anda boleh menggunakan klausa yang mempunyai untuk menapis data dikumpulkan:
Sebagai contoh, jika anda mempunyai jadual yang dipanggil sales
dengan salesperson
Lajur dan amount
, dan anda ingin mencari jurujual yang mempunyai jumlah jualan lebih daripada $ 10,000, anda akan menggunakan pertanyaan SQL berikut:
<code class="sql">SELECT salesperson, SUM(amount) AS total_sales FROM sales GROUP BY salesperson HAVING SUM(amount) > 10000;</code>
Dalam pertanyaan ini:
GROUP BY
klausa kumpulan jualan oleh salesperson
.HAVING
menapis hasil yang dikumpulkan untuk hanya termasuk kumpulan (jurujual) di mana jumlah amount
mereka lebih besar daripada $ 10,000.Di mana dan mempunyai klausa kedua -duanya digunakan untuk penapisan data dalam SQL, tetapi mereka melayani tujuan yang berbeza dan digunakan pada tahap pemprosesan pertanyaan yang berlainan. Berikut adalah perbezaan utama di antara mereka:
Peringkat Permohonan:
Penggunaan dengan fungsi agregat:
WHERE SUM(amount) > 10000
kerana klausa di mana tidak melihat hasil agregat.HAVING SUM(amount) > 10000
adalah penggunaan yang sah dari klausa yang mempunyai.Pesanan Pelaksanaan:
Sintaks dan penempatan:
Inilah contoh untuk menggambarkan perbezaan ini:
<code class="sql">SELECT department, AVG(salary) AS average_salary FROM employees WHERE hire_date > '2020-01-01' -- Filters rows before grouping GROUP BY department HAVING AVG(salary) > 50000; -- Filters groups after grouping</code>
Klausa yang mempunyai biasanya digunakan bersempena dengan kumpulan dengan klausa untuk menapis data berkumpulan. Walau bagaimanapun, secara teknikalnya mungkin menggunakan klausa yang mempunyai kumpulan dengan klausa, tetapi ia mempunyai implikasi khusus:
Berikut adalah contoh di mana klausa mempunyai digunakan tanpa kumpulan mengikut klausa:
<code class="sql">SELECT COUNT(*) AS total_customers FROM customers HAVING COUNT(*) > 1000;</code>
Dalam pertanyaan ini, klausa yang mempunyai menapis hasilnya hanya untuk mengembalikan jumlah kiraan pelanggan jika kiraan itu lebih besar daripada 1000. Oleh kerana tidak ada kumpulan oleh klausa, seluruh jadual customers
dianggap sebagai satu kumpulan.
Walaupun ada kemungkinan untuk menggunakan tanpa kumpulan, secara amnya tidak disyorkan melainkan jika anda bekerja dengan jelas dengan keseluruhan hasil yang ditetapkan sebagai satu kumpulan. Ia boleh menyebabkan kekeliruan dan kurang cekap daripada menggunakan klausa di mana mungkin.
Untuk menggabungkan pelbagai syarat dalam klausa yang mempunyai, anda boleh menggunakan pengendali logik seperti AND
, OR
, dan NOT
. Pengendali ini membolehkan anda membuat keadaan yang kompleks untuk menapis data berkumpulan dengan lebih tepat. Berikut adalah beberapa cara untuk menggabungkan pelbagai syarat dengan berkesan dalam klausa yang mempunyai:
Menggunakan dan pengendali:
Operator AND
digunakan untuk menggabungkan keadaan di mana semua syarat mestilah benar bagi kumpulan untuk dimasukkan ke dalam set hasil.
<code class="sql">SELECT category, COUNT(*) AS product_count, AVG(price) AS average_price FROM products GROUP BY category HAVING COUNT(*) > 10 AND AVG(price) > 50;</code>
Kategori penapis pertanyaan ini yang mempunyai lebih daripada 10 produk dan harga purata lebih besar daripada $ 50.
Menggunakan atau pengendali:
Pengendali OR
pengendali digunakan untuk menggabungkan keadaan di mana sekurang -kurangnya satu syarat mestilah benar bagi kumpulan yang dimasukkan ke dalam set hasil.
<code class="sql">SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department HAVING AVG(salary) > 70000 OR COUNT(*) > 50;</code>
Jabatan pertanyaan ini menapis jabatan yang mempunyai gaji purata lebih daripada $ 70,000 atau mempunyai lebih daripada 50 pekerja.
Menggunakan Pengendali Bukan:
Pengendali NOT
digunakan untuk menafikan keadaan.
<code class="sql">SELECT category, SUM(quantity) AS total_quantity FROM inventory GROUP BY category HAVING NOT (SUM(quantity) </code>
Kategori penapis pertanyaan ini yang mempunyai jumlah kuantiti sekurang -kurangnya 1000.
Menggabungkan dan dan atau:
Anda boleh menggabungkan AND
OR
pengendali untuk mewujudkan keadaan yang lebih kompleks. Untuk memastikan kejelasan dan perintah penilaian yang betul, gunakan kurungan kepada keadaan kumpulan.
<code class="sql">SELECT region, COUNT(*) AS customer_count, AVG(total_purchases) AS average_purchase FROM customers GROUP BY region HAVING (COUNT(*) > 100 AND AVG(total_purchases) > 1000) OR (COUNT(*) > 500);</code>
Kawasan penapis pertanyaan ini yang mempunyai lebih daripada 100 pelanggan dan pembelian purata lebih besar daripada $ 1000, atau kawasan yang mempunyai lebih daripada 500 pelanggan.
Dengan berkesan menggunakan pengendali logik ini, anda boleh membuat penapis terperinci dan tepat pada data dikumpulkan menggunakan klausa yang mempunyai.
Atas ialah kandungan terperinci Bagaimana anda menapis data berkumpulan menggunakan klausa yang mempunyai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!