5.1 MEMPUNYAI pernyataan
Terdapat satu lagi pengendali berguna dalam SQL yang digunakan dengan GROUP BY
, ia dipanggil HAVING
.
Dalam maknanya, ia adalah sama sepenuhnya dengan operator WHERE
. Ia hanya WHERE
membenarkan anda menetapkan penapis baris sebelum mengumpulkan, dan dengan bantuan HAVING
anda boleh menetapkan penapis yang digunakan pada rekod selepas pengumpulan.
Pandangan umum pertanyaan apabila menggunakan hasil pengumpulan dan penapisan kumpulan adalah seperti berikut:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
hanya boleh digunakan jika permintaan mengandungi GROUP BY
.
Mari tulis pertanyaan di mana kami memaparkan bilangan pekerja yang diupah mengikut tahun.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
Dan hasil daripada pertanyaan ini:
upah_tahun | jumlah |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
Dan kini kami mengecualikan daripadanya tahun-tahun apabila seorang atau kurang pekerja diambil bekerja. Contoh:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
Dan hasil daripada pertanyaan ini:
upah_tahun | jumlah |
---|---|
2015 | 2 |
5.3 Susunan pelaksanaan kenyataan
Untuk menulis pertanyaan SQL yang betul dan cekap, anda perlu memahami cara ia dilaksanakan oleh pelayan SQL.
Prosedur untuk melakukan tindakan dikawal ketat dan tidak bergantung pada keinginan anda. Anda tidak boleh menyusun semula operator dan mendapatkan pesanan yang berbeza.
Pertanyaan SQL dilaksanakan dalam beberapa peringkat dalam susunan ini.
- Peringkat 1 - mengambil baris
- Pertama, semua baris daripada jadual yang ditentukan dipilih.
- Kemudian medan yang dikira ditambahkan padanya.
- Dan kemudian daripada semua baris, hanya yang memenuhi syarat yang kekal
WHERE
- Peringkat 2 - berkumpulan
- Pengelompokan kemudian digunakan pada keputusan.
- Semasa kumpulan, medan seperti
COUNT(*)
. - Akhir sekali, penapis digunakan pada hasil pengumpulan
HAVING
. - Peringkat 3 - menyusun
- Baris yang diperoleh dalam langkah sebelumnya diisih menggunakan
ORDER BY
.
Akhirnya, hasilnya boleh dipangkas dengan LIMIT
dan OFFSET
.
GO TO FULL VERSION