Rumah > pangkalan data > tutorial mysql > WHERE vs. HAVING dalam MySQL: Bilakah Saya Harus Menggunakan Setiap Klausa untuk Lajur Dikira?

WHERE vs. HAVING dalam MySQL: Bilakah Saya Harus Menggunakan Setiap Klausa untuk Lajur Dikira?

Linda Hamilton
Lepaskan: 2025-01-19 22:42:09
asal
677 orang telah melayarinya

WHERE vs. HAVING in MySQL: When Should I Use Each Clause for Calculated Columns?

MySQL WHERE lwn. HAVING: Mengoptimumkan Pertanyaan dengan Lajur Dikira

Dalam operasi pangkalan data MySQL, pilihan antara klausa WHERE dan HAVING memberi kesan ketara kepada kecekapan pertanyaan apabila berurusan dengan lajur yang dikira. Memahami peranan mereka yang berbeza adalah penting untuk menulis SQL yang dioptimumkan.

Penempatan Strategik Lajur Dikira

Lajur yang dikira, seperti yang dibuat dalam penyata SELECT (cth., SELECT 1 AS "number"), pada umumnya harus mengikut klausa HAVING, bukan WHERE. Ini kerana WHERE menapis data sebelum sebarang pengiraan atau pengagregatan, manakala HAVING menapis selepas operasi ini.

Batasan Klausa WHERE

Menggunakan WHERE dengan lajur yang dikira selalunya mengakibatkan ralat. WHERE syarat mesti merujuk kepada lajur atau alias jadual sedia ada; ia tidak boleh beroperasi secara langsung pada nilai yang dikira.

Perbezaan Utama Antara WHERE dan HAVING

  • WHERE Klausa: Menapis baris sebelum pernyataan SELECT dilaksanakan. Syarat boleh digunakan pada mana-mana lajur jadual tetapi tidak pada lajur terkira yang ditakrifkan dalam senarai SELECT.

  • HAVING Klausa: Menapis baris selepas pernyataan SELECT fungsi pengagregatan telah digunakan. Syarat boleh digunakan pada lajur yang dipilih, alias atau hasil fungsi agregat.

Pertimbangan Prestasi

Untuk jadual besar, meletakkan lajur yang dikira dalam klausa WHERE boleh menjadi mahal dari segi pengiraan. HAVING menawarkan kelebihan prestasi dalam senario ini kerana ia beroperasi pada set data yang dikurangkan (hasil daripada pernyataan SELECT), meminimumkan penapisan baris yang tidak perlu.

Contoh Ilustrasi

Mari kita pertimbangkan jadual contoh:

<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

Diisi dengan sepuluh baris (id dan nilai antara 1 hingga 10):

<code class="language-sql">INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);</code>
Salin selepas log masuk

Pertanyaan berikut menghasilkan hasil yang sama:

<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- Returns 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Returns 5 rows</code>
Salin selepas log masuk

Walau bagaimanapun, EXPLAIN mendedahkan perbezaan prestasi yang penting:

<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;  -- Uses index but scans more rows
EXPLAIN SELECT `value` v FROM `table` HAVING `value`>5; -- Uses index efficiently, scans fewer rows</code>
Salin selepas log masuk

Semasa kedua-duanya menggunakan indeks, WHERE mengimbas sebahagian besar jadual untuk ditapis, manakala HAVING beroperasi dengan lebih cekap pada subset pra-tapis yang lebih kecil. Perbezaan ini menjadi semakin ketara dengan set data yang lebih besar. Oleh itu, untuk lajur yang dikira, HAVING secara amnya memberikan prestasi yang lebih baik.

Atas ialah kandungan terperinci WHERE vs. HAVING dalam MySQL: Bilakah Saya Harus Menggunakan Setiap Klausa untuk Lajur Dikira?. 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