Rumah >pangkalan data >tutorial mysql >Pertanyaan MySQL: WHERE vs. HAVING – Bilakah Saya Harus Menggunakan HAVING untuk Lajur Tersuai?

Pertanyaan MySQL: WHERE vs. HAVING – Bilakah Saya Harus Menggunakan HAVING untuk Lajur Tersuai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-19 22:32:14614semak imbas

MySQL Queries: WHERE vs. HAVING – When Should I Use HAVING for Custom Columns?

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:

  • MEMILIH menapis data hasil yang dipilih, termasuk lajur tersuai.
  • WHERE menapis data hasil sebelum pemilihan, tidak termasuk lajur tersuai.

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:

  • Letakkan lajur tersuai selepas klausa HAVING untuk menapis data yang dipilih.
  • Gunakan klausa WHERE untuk menapis set data yang besar dengan cekap dengan mengecualikan baris yang tidak berkaitan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn