ホームページ > データベース > mysql チュートリアル > SQL の HAVING と WHERE: 集計に各句をいつ使用する必要がありますか?

SQL の HAVING と WHERE: 集計に各句をいつ使用する必要がありますか?

Barbara Streisand
リリース: 2025-01-21 09:53:09
オリジナル
432 人が閲覧しました

HAVING vs. WHERE in SQL: When Should I Use Each Clause for Aggregation?

SQL 集計クエリの HAVING 句と WHERE 句の違い

集計データを操作する場合、HAVING 句と WHERE 句の違いを理解することが重要です。この記事では、一般的なクエリ シナリオについて詳しく説明し、あるメソッドでは正しい結果が返され、別のメソッドでは正しい結果が返されない理由を説明します。

クエリコンテキスト

次の表があるとします:

  • 講師 (列: LectID、Fname、Lname、学位)
  • 講師_専門分野 (列: LectID、専門知識)

目標は、最も専門性の高いインストラクターを見つけることです。

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート