5.1 HAVING ステートメント

SQL には、 と併用されるもう 1 つの便利な演算子がありGROUP BY、それは と呼ばれますHAVING

その意味では、これは演算子と完全に似ていますWHEREWHEREグループ化の前に行フィルターを設定することのみが可能ですが、このヘルプHAVINGを使用すると、グループ化後にレコードに適用されるフィルターを設定できます。

グループ化およびグループ化結果のフィルタリングを使用する場合のクエリの一般的なビューは次のとおりです。

SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition

HAVINGリクエストに が含まれる場合にのみ使用できますGROUP BY

雇用された従業員の数を年ごとに表示するクエリを作成してみましょう。

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year

そして、このクエリの結果は次のようになります。

雇用年数 合計
2012年 1
2013年 1
2014年 1
2015年 2
2018年 1

そして現在は、従業員が 1 人以下の雇用があった年はこの計算から除外されています。例:

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1

そして、このクエリの結果は次のようになります。

雇用年数 合計
2015年 2

5.3 ステートメントの実行順序

正しく効率的な SQL クエリを作成するには、SQL サーバーによってクエリがどのように実行されるかを理解する必要があります。

アクションを実行する手順は厳密に規制されており、あなたの願望には依存しません。演算子を並べ替えて、別の順序を取得することはできません。

SQL クエリは、この順序でいくつかの段階で実行されます。

  1. ステージ 1 - 行のフェッチ
    • まず、指定されたテーブルのすべての行が選択されます。
    • 次に、計算フィールドがそれらに追加されます。
    • そして、すべての行のうち、条件を満たす行だけが残ります。WHERE
  2. ステージ 2 - グループ化
    • その後、結果にグループ化が適用されます。
    • グループ化中に、 などのフィールドが表示されますCOUNT(*)
    • 最後に、グループ化結果にフィルターが適用されますHAVING
  3. ステージ 3 - 分類
    • 前の手順で取得した行は、 を使用して並べ替えられますORDER BY

最後に、結果をLIMITとでトリミングできますOFFSET