Heim > Datenbank > MySQL-Tutorial > MySQL-Abfragen: WHERE vs. HAVING – Wann sollte ich HAVING für benutzerdefinierte Spalten verwenden?

MySQL-Abfragen: WHERE vs. HAVING – Wann sollte ich HAVING für benutzerdefinierte Spalten verwenden?

Mary-Kate Olsen
Freigeben: 2025-01-19 22:32:14
Original
569 Leute haben es durchsucht

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

Position benutzerdefinierter Spalten in MySQL-Abfragen: WHERE und HAVING

Frage:

Warum müssen die in der SELECT-Anweisung erstellten Spalten nach der HAVING-Klausel und nicht nach der WHERE-Klausel in MySQL platziert werden? Gibt es auch Nachteile bei der Verwendung von WHERE 1 anstelle der Angabe der vollständigen Definition der Spalte?

Antwort:

Während andere Antworten dieses Thema angesprochen haben, sind die wichtigsten Unterschiede wie folgt:

WHERE-Klausel: Filtert Daten vor der Auswahl und lässt jede Tabellenspalte zu. Es können keine Aliase oder Aggregatfunktionen verwendet werden.

HAVING-Klausel: Filtert Daten nach der Auswahl und ermöglicht die Verwendung ausgewählter Spalten, Aliase oder Aggregatfunktionen.

Standort:

Benutzerdefinierte Spalten sollten nach der HAVING-Klausel platziert werden, weil:

  • HAVING filtert ausgewählte Ergebnisdaten, einschließlich benutzerdefinierter Spalten.
  • WHERE filtert die Ergebnisdaten vor der Auswahl, ausgenommen benutzerdefinierte Spalten.

Effizienz:

Zum Filtern großer Datensätze ist die Verwendung der WHERE-Klausel effizienter, da sie irrelevante Zeilen eliminiert, bevor die Auswahl durchgeführt wird.

Beispiel:

Betrachten Sie das folgende Formular:

<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>
Nach dem Login kopieren

Enthält 10 Datenzeilen mit ID- und Wertwerten im Bereich von 1 bis 10.

Abfrage:

<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- 获取 5 行
SELECT `value` v FROM `table` HAVING `value`>5; -- 获取 5 行</code>
Nach dem Login kopieren

Ergebnis:

Beide Abfragen liefern die gleichen Ergebnisse, was zeigt, dass die HAVING-Klausel ohne die GROUP BY-Klausel funktionieren kann.

ERKLÄREN:

<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;</code>
Nach dem Login kopieren
<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>
Nach dem Login kopieren
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
Nach dem Login kopieren
<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>
Nach dem Login kopieren

Wie Sie sehen können, verwenden sowohl WHERE als auch HAVING Indizes, aber die Anzahl der zurückgegebenen Zeilen ist unterschiedlich. WHERE filtert die Daten vor der Auswahl und reduziert so die Anzahl der Zeilen, während HAVING die Zeilen nach der Auswahl filtert.

Fazit:

  • Fügen Sie benutzerdefinierte Spalten nach der HAVING-Klausel ein, um ausgewählte Daten zu filtern.
  • Verwenden Sie die WHERE-Klausel, um große Datensätze effizient zu filtern, indem Sie irrelevante Zeilen ausschließen.

Das obige ist der detaillierte Inhalt vonMySQL-Abfragen: WHERE vs. HAVING – Wann sollte ich HAVING für benutzerdefinierte Spalten verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage