SQL 集計クエリの HAVING 句と WHERE 句の違い
集計データを操作する場合、HAVING 句と WHERE 句の違いを理解することが重要です。この記事では、一般的なクエリ シナリオについて詳しく説明し、あるメソッドでは正しい結果が返され、別のメソッドでは正しい結果が返されない理由を説明します。
クエリコンテキスト
次の表があるとします:
目標は、最も専門性の高いインストラクターを見つけることです。
WHERE 句の使用に失敗しました
失敗したクエリは、WHERE 句を使用して専攻の数に基づいて結果をフィルタリングしようとします:
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);
WHERE 句が集計値に条件を適用するのに適していないため、このクエリは期待した結果を生成できませんでした。
HAVING 句を使用したクエリの成功
成功したクエリでは代わりに HAVING 句が使用されます:
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);
HAVING が成功する理由
HAVING 句は、集計クエリの結果をフィルタリングするために特に使用されます。 GROUP BY 操作の後に条件が適用され、各講師の専攻数を確認できるようになります。
経験則
一般に、個々の行をフィルターするには GROUP BY の前に WHERE を使用し、集計結果をフィルターするには GROUP BY の後に HAVING を使用します。
ANSI JOIN を使用したクエリの改善
ANSI JOIN 構文を使用した代替クエリ バージョンも提供されています。
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)
このバージョンでは、結合条件に WHERE の使用がなくなり、代わりに JOIN が使用されます。
以上がSQL の HAVING と WHERE: 集計に各句をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。