Kedudukan lajur tersuai dalam pertanyaan MySQL: WHERE dan HAVING
Soalan:
Mengapa mesti lajur yang dibuat dalam pernyataan SELECT diletakkan selepas klausa HAVING dan bukan selepas klausa WHERE dalam MySQL? Juga, adakah terdapat sebarang kelemahan untuk menggunakan WHERE 1 dan bukannya menentukan definisi penuh lajur?
Jawapan:
Walaupun jawapan lain telah menyentuh topik ini, perbezaan utama adalah seperti berikut:
Klausa WHERE: Menapis data sebelum memilih, membenarkan mana-mana lajur jadual. Ia tidak boleh menggunakan alias atau fungsi agregat.
Klausa MEMPUNYAI: Menapis data selepas pemilihan, membenarkan penggunaan lajur, alias atau fungsi agregat yang dipilih.
Lokasi:
Lajur tersuai hendaklah diletakkan selepas klausa HAVING kerana:
Kecekapan:
Untuk menapis set data yang besar, menggunakan klausa WHERE adalah lebih cekap kerana ia menghapuskan baris yang tidak berkaitan sebelum melakukan pemilihan.
Contoh:
Pertimbangkan borang berikut:
<code class="language-sql">CREATE TABLE `table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `value` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `value` (`value`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8</code>
Mengandungi 10 baris data, dengan nilai id dan nilai antara 1 hingga 10.
Pertanyaan:
<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- 获取 5 行 SELECT `value` v FROM `table` HAVING `value`>5; -- 获取 5 行</code>
Keputusan:
Kedua-dua pertanyaan mengembalikan hasil yang sama, yang menunjukkan bahawa klausa HAVING boleh berfungsi tanpa klausa GROUP BY.
JELASKAN:
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+</code>
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ | 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index | +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+</code>
Seperti yang anda lihat, WHERE dan HAVING menggunakan indeks, tetapi bilangan baris yang dikembalikan adalah berbeza. WHERE menapis data sebelum pemilihan, mengurangkan bilangan baris, manakala HAVING menapis baris selepas pemilihan.
Kesimpulan:
Atas ialah kandungan terperinci Pertanyaan MySQL: WHERE vs. HAVING – Bilakah Saya Harus Menggunakan HAVING untuk Lajur Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!