GROUP BY
dan HAVING
klausa digunakan dalam SQL untuk melaksanakan operasi agregat pada kumpulan data dan untuk menapis kumpulan ini. Inilah cara menggunakannya:
GROUP BY
klausa : Klausa ini digunakan untuk mengumpulkan baris yang mempunyai nilai yang sama dalam lajur yang ditentukan ke dalam baris ringkasan, seperti "Count", "Min", "Max", dan lain -lain. Ia sering digunakan dengan fungsi agregat untuk menghasilkan statistik ringkasan. Berikut adalah contoh:
<code class="sql">SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;</code>
Dalam pertanyaan ini, GROUP BY
klausa kumpulan pekerja oleh jabatan mereka dan fungsi COUNT(*)
mengira bilangan pekerja dalam setiap kumpulan.
HAVING
klausa : Klausa ini digunakan untuk menapis kumpulan yang dihasilkan oleh GROUP BY
klausa. Ia sama dengan klausa WHERE
tetapi beroperasi pada data dikumpulkan. Inilah cara anda menggunakannya:
<code class="sql">SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 10;</code>
Kumpulan pertanyaan ini pekerja oleh jabatan dan kemudian menapis mana -mana jabatan yang tidak mempunyai lebih daripada 10 pekerja.
Ringkasnya, GROUP BY
digunakan untuk membentuk kumpulan berdasarkan nilai lajur, dan HAVING
penapis kumpulan ini berdasarkan syarat yang digunakan untuk agregat fungsi.
Perbezaan utama antara GROUP BY
dan HAVING
dalam pertanyaan SQL adalah:
Fungsi :
GROUP BY
kumpulan baris ke dalam set berdasarkan satu atau lebih nilai lajur. Ia adalah perlu apabila anda ingin menggunakan fungsi agregat seperti SUM
, COUNT
, AVG
, dan lain -lain, dengan cara yang digunakan untuk kumpulan ini.HAVING
, sebaliknya, menapis kumpulan yang dibentuk oleh GROUP BY
berdasarkan syarat -syarat yang digunakan untuk data agregat. Ia beroperasi pada hasil GROUP BY
klausa.Konteks penggunaan :
GROUP BY
boleh digunakan secara bersendirian atau bersempena dengan HAVING
.HAVING
mesti sentiasa digunakan bersempena dengan GROUP BY
kerana ia beroperasi pada baris berkumpulan.Penempatan dalam pertanyaan SQL :
GROUP BY
biasanya datang selepas mana -mana klausa WHERE
tetapi sebelum ORDER BY
dan LIMIT
.HAVING
mesti datang selepas GROUP BY
dan sebelum ORDER BY
dan LIMIT
.Keadaan penapisan :
WHERE
klausa penapis baris sebelum kumpulan dan hanya boleh menggunakan syarat pada baris individu.HAVING
kumpulan penapis selepas mereka telah dibentuk dan boleh menggunakan syarat pada data agregat.Memahami perbezaan ini adalah penting untuk menulis pertanyaan SQL yang berkesan yang memanipulasi data pada kedua -dua baris dan tahap kumpulan.
Ya, GROUP BY
dan HAVING
boleh digunakan bersama dalam SQL. Gabungan ini berguna apabila anda ingin mengumpulkan data dan kemudian menapis kumpulan yang dihasilkan berdasarkan keadaan agregat. Inilah cara anda boleh menggunakannya bersama:
<code class="sql">SELECT category, AVG(price) AS average_price FROM products GROUP BY category HAVING AVG(price) > 50;</code>
Dalam pertanyaan ini:
GROUP BY category
mengumpulkan produk dengan kategori mereka.AVG(price)
mengira harga purata dalam setiap kumpulan.HAVING AVG(price) > 50
keadaan menapis kumpulan untuk hanya memasukkan kategori di mana harga purata melebihi 50. Apabila menggunakan GROUP BY
dan HAVING
-sama, ingatlah bahawa:
GROUP BY
mesti muncul sebelum HAVING
pertanyaan.HAVING
hanya boleh digunakan jika GROUP BY
klausa hadir, kerana ia menapis kumpulan yang dicipta oleh GROUP BY
.Gabungan ini berkuasa untuk melakukan analisis data yang kompleks, di mana anda perlu mengagregatkan data dan kemudian menapis hasil pengagregatan itu.
Mengoptimumkan pertanyaan SQL yang menggunakan GROUP BY
dan HAVING
klausa melibatkan beberapa strategi untuk meningkatkan prestasi:
Gunakan indeks : Pastikan lajur yang digunakan dalam GROUP BY
dan HAVING
klausa diindeks. Pengindeksan lajur ini dapat mempercepatkan pengumpulan dan penapisan operasi dengan ketara.
<code class="sql">CREATE INDEX idx_department ON employees(department);</code>
Hadkan data awal : Gunakan WHERE
klausa untuk menapis data sebelum GROUP BY
dan HAVING
operasi. Ini mengurangkan jumlah data yang perlu dikelompokkan dan ditapis.
<code class="sql">SELECT department, COUNT(*) AS employee_count FROM employees WHERE hire_date > '2020-01-01' GROUP BY department HAVING COUNT(*) > 10;</code>
Elakkan menggunakan fungsi dalam kumpulan oleh : jika boleh, elakkan menggunakan fungsi dalam GROUP BY
klausa kerana mereka boleh menghalang penggunaan indeks.
Daripada GROUP BY UPPER(department)
, gunakan GROUP BY department
jika anda boleh menapis dan huruf besar di tempat lain.
HAVING
mudah dan efisien yang mungkin. Elakkan pengiraan kompleks HAVING
jika mereka dapat dipermudahkan atau dipindahkan ke klausa WHERE
.GROUP BY
dan HAVING
optimum untuk operasi yang dilakukan. Sebagai contoh, menggunakan INT
untuk mengira operasi lebih cekap daripada menggunakan VARCHAR
.Pertimbangkan menggunakan subqueries atau Ekspresi Jadual Biasa (CTE) : Dalam pertanyaan kompleks, memecahkan pertanyaan ke bahagian yang lebih kecil, lebih mudah diurus dapat membantu pengoptimuman.
<code class="sql">WITH dept_counts AS ( SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department ) SELECT department, employee_count FROM dept_counts WHERE employee_count > 10;</code>
Dengan menggunakan teknik pengoptimuman ini, anda dapat meningkatkan prestasi pertanyaan SQL yang melibatkan GROUP BY
dan HAVING
klausa.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan kumpulan dan mempunyai klausa di SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!