WHERE 句と HAVING 句については、この記事で詳しく説明します。これらは、SQL クエリでレコードをフィルターするためにも使用されます。 WHERE 句と HAVING 句の違いは、面接時に最もよく聞かれる質問です。 これらの主な違いは、WHERE 句はグループ化を行う前にレコードをフィルタリングするための条件を指定するために使用されるのに対し、HAVING 句はグループから値をフィルタリングするための条件を指定するために使用されることです。 比較する前に、まず次のことを知ってください。 SQL 条項。
WHERE句
MySQL の WHERE 句は SELECT とともに使用されます。 入れる 、 アップデート 、 そして 消去 テーブルまたはリレーションからデータをフィルタリングするためのクエリ。 JOIN 句を使用して単一のテーブルまたは複数のテーブルからレコードを取得するときの特定の条件について説明します。指定された条件が満たされる場合、テーブルから特定の値が返されます。 WHERE 句は、選択した列に条件を設定します。
MySQL の WHERE 句では、次のこともできます。 論理接続詞を実装する AND、OR、NOT。それらはブール条件として知られており、 真実 データを取得します。論理接続式は、次のような比較演算子をオペランドとして使用します。<, ,>=、=、および 。比較演算子は通常、文字列と算術式を比較するために使用されます。,>
次の構文は、WHERE 句の使用法を示しています。
SELECT column_lists, FROM table_name WHERE conditions GROUP BY column_lists;
この条項を理解するために例を挙げてみましょう。という名前のテーブルがあるとします。 従業員 次のデータが含まれています。
望むなら 勤務時間が9時間を超える従業員の詳細を取得するには の場合、次のようにステートメントを使用できます。
mysql> SELECT * FROM employees WHERE working_hour > 9;
以下の出力が得られ、勤務時間が 9 時間を超える従業員の詳細が表示されます。
上記のクエリを使用すると、 グループ化 句を使用すると、異なる結果が得られます。
mysql> SELECT * FROM employees WHERE working_hour > 9 GROUP BY name;
出力は次のとおりです。
HAVING 句
MySQL の HAVING 句 GROUP BY と組み合わせて使用されます 句を使用すると、結果に表示されるグループ結果をフィルタリングする条件を指定できます。最終結果のグループから特定の条件を満たす値のみを返します。選択中に WHERE 句と HAVING 句を一緒に使用することもできます。この場合、最初に WHERE 句で個々の行をフィルタリングし、次に行をグループ化して集計計算を実行し、最後に HAVING 句でグループをフィルタリングします。
この句は、GROUP BY 句によって作成されたグループに条件を設定します。 SQL ステートメントで GROUP BY キーワードが使用されていない場合は、WHERE 句と同様に動作します。 SUM 、 MIN 、 MAX、 AVG などの集計 (グループ) 関数を使用できます。 カウント SELECT と HAVING の 2 つの句のみを使用します。
次の構文は、HAVING 句の使用法を示しています。
SELECT column_lists, aggregate_function (expression) FROM table_name WHERE conditions GROUP BY column_lists HAVING condition;
この条項を理解するために例を挙げてみましょう。ここでは同じテーブルを検討します 従業員 デモンストレーション用に。
望むなら 労働時間が 6 時間を超える各従業員の合計労働時間を取得する の場合、次のようにステートメントを使用できます。
mysql> SELECT name, SUM(working_hour) AS 'Total working hours' FROM employees GROUP BY name HAVING SUM(working_hour) > 6;
各従業員の合計労働時間を確認できる以下の出力が得られます。
WHERE 句と HAVING 句の主な違い
次の点で、データベースとスキーマの主な違いについて説明します。
- WHERE 句は個々の行をフィルタリングしますが、HAVING 句は一度に 1 行ではなくグループをフィルタリングします。
- WHERE 句は個々の行をフィルタリングするために機能するため、集計関数では使用できません。対照的に、HAVING はグループのフィルター処理に使用されるため、集計関数と連携できます。
- 行操作は WHERE 句によって処理され、HAVING 句は集計された行またはグループに対する列操作を処理します。
- WHERE は GROUP BY の前にあります。これは、WHERE 句が集計計算を実行する前に行をフィルタリングすることを意味します。 HAVING は GROUP BY の後に来ます。これは、HAVING 句が集計計算を実行した後に行をフィルターすることを意味します。したがって、HAVING は効率の点で WHERE よりも遅いため、可能な限り避けるべきです。
- SELECT クエリで WHERE 句と HAVING 句を組み合わせることができます。この場合、最初に WHERE 句を使用して個々の行をフィルタリングします。次に、行がグループ化され、集計計算が実行され、最後に HAVING 句を使用してグループがフィルタリングされます。
- WHERE 句は、指定された条件に基づいて必要なデータを取得します。一方、HAVING 句は、最初にデータ全体を取得し、その後、指定された条件に基づいて分離が行われます。
- SELECT ステートメントがないと、HAVING 句を使用できません。逆に、SELECT、UPDATE、および DELETE ステートメントで WHERE を使用することもできます。
- WHERE 句は前置フィルタですが、HAVING 句は後置フィルタです。
WHERE と HAVING の比較表
次の比較表は、それらの主な違いを簡単に説明しています。
比較基準 | WHERE句 | HAVING 句 |
---|---|---|
意味 | 個々の行に対してフィルタリングを実行するために使用されます。 | グループに対してフィルタリングを実行するために使用されます。 |
基本 | これは行操作で実装されます。 | これは列演算で実装されます。 |
データの取得 | WHERE 句は、指定された条件に基づいて特定の行から特定のデータをフェッチします。 | HAVING 句は、最初に完全なデータをフェッチします。次に、指定された条件に従ってそれらを分離します。 |
集計関数 | WHERE 句では、集計関数を使用できません。 | HAVING 句は集計関数と併用できます。 |
として作用します | WHERE 句はプレフィルターとして機能します。 | HAVING 句はポストフィルターとして機能します。 |
と一緒に使用 | WHERE 句は、SELECT、UPDATE、および DELETE ステートメントで使用できます。 | HAVING 句は、SELECT ステートメントでのみ使用できます。 |
グループ化 | GROUP BY 句は WHERE 句の後に来ます。 | GROUP BY 句は HAVING 句の前に置きます。 |
結論
この記事では、WHERE 句と HAVING 句を比較しました。ここでは、追加機能により HAVING 句の人気が高まっていることを除いて、両方の句がデータのフィルタリングにおいて同じように機能すると結論付けています。 HAVING 句では集約関数を効率的に操作できますが、WHERE では集約関数を使用できません。