SQL クエリの WHERE 句と HAVING 句について理解する
SQL 開発者は、WHERE 句と HAVING 句を区別するという課題に直面することがよくあります。この記事は、SQL クエリにおけるこれらのさまざまな使用法を明確にすることを目的としています。
いつどこで使用するか
HAVING を使用する場合
例: 最も多くの専攻を取得した講師
この違いを説明するために、次の表を考えてみましょう:
<code>1. Lecturers (LectID, Fname, Lname, degree) 2. Lecturers_Specialization (LectID, Expertise)</code>
目標は、最も多くの専攻を持っている講師を見つけることです。
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 クエリは、WHERE を使用して集計関数 (COUNT(S.Expertise)) に基づいてフィルタリングしようとしているため、機能しません。 WHERE 句は、結果を集計するのではなく、個々の行をフィルターするために使用されます。
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 クエリは、GROUP BY 操作の後に集計データ (COUNT(S.Expertise)) に条件を設定するため、正しい結果を正常に取得します。
ANSI 接続バージョン (推奨)
ANSI 結合構文を使用すると、クエリは次のように書き換えることができます:
<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>
このバージョンでは、theta 結合条件の WHERE 句が削除され、より効率的で標準に準拠したクエリが実現します。
以上がSQL の WHERE と HAVING: 各句をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。