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:
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>
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>
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>
<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>
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:
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!