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
Lepaskan: 2025-01-19 22:32:14
asal
569 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk
<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>
Salin selepas log masuk
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
Salin selepas log masuk
<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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan