ホームページ >データベース >mysql チュートリアル >SQL HAVING と WHERE: データ フィルタリングに各句をいつ使用するか?
SQL データのフィルタリング: WHERE 句と HAVING 句の違い
SQL の HAVING 句と WHERE 句はどちらもデータのフィルタリングに使用されますが、その機能は異なります。 WHERE 句は個々の行に対して機能しますが、HAVING 句は集計結果に対して機能します。
違いの例
Lecturers
と Lecturers_Specialization
という 2 つのテーブルがあり、最も専門分野を持っている講師を見つけたいとします。
WHERE 句を使用した最初のクエリでは期待した結果が得られません:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);</code>
これは、WHERE 句が単一の行をフィルターし、COUNT(S.Expertise) >= ALL
比較を単一の行に適用できないためです。
正しいクエリでは HAVING 句が使用されています:
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID); </code>
HAVING 句は集計結果に作用して、各講師の専門分野の数に比較が適用されるようにします。
経験則と最適化
一般に、WHERE 句は GROUP BY 句の前に使用して個々の行をフィルタリングし、HAVING 句は GROUP BY 句の後に使用して集計結果をフィルタします。
さらに、L、S θ 結合構文の代わりに ANSI JOIN 構文を使用してクエリを最適化できます。
<code class="language-sql">SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)</code>
以上がSQL HAVING と WHERE: データ フィルタリングに各句をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。