MySQL のどこにあるのか

今日は、MySQL の WHERE
句と HAVING
句の違いについて学びます。コード例を使用して句を個別に理解し、表形式で比較して違いを強調します。
MySQL の WHERE
と HAVING
WHERE
句と HAVING
句は非常によく似ています。これらの句の主な違いは、GROUP BY
で使用する場合に発生します。
集合データで WHERE
句を使用することはできませんが、HAVING
は使用できます。
WHERE
はグループ化する前にレコード(行)をフィルタリングすると言えますが、HAVING
句はグループ化後のレコード(行)を除外します。
この記事を段階的に続けるには、表が必要です。
したがって、ID
、Product
、MonthOfTransaction
、および AmountInUSD
という名前の 4つの属性を含む transactions
テーブルを作成します。
コード例:
#create a table CREATE TABLE `ms20`.`transactions` ( `ID` INT NOT NULL AUTO_INCREMENT, `Product` VARCHAR(45) NOT NULL, `MonthOfTransaction` VARCHAR(20) NOT NULL, `AmountInUSD` INT NOT NULL, PRIMARY KEY (`ID`)); #insert data into a table INSERT INTO ms20.transactions(Product, MonthOfTransaction, AmountInUSD) VALUES ('Air Conditioner', 'January', 500), ('Television', 'January', 600), ('Refrigerator', 'January', 550), ('Television', 'March', 600), ('Air Conditioner', 'March', 500), ('Juicer Machine', 'March', 200); #select all data from the table SELECT * FROM ms20.transactions;
出力:
MySQL の WHERE
句
MySQL では、WHERE
句を使用してレコードをフィルタリングし、指定された条件を満たす行(レコード)のみを抽出します。SELECT
ステートメントと UPDATE
、INSERT
、および DELETE
コマンドで使用できます。
WHERE
句は、JOIN
句を使用して単一または複数のテーブルからレコードを取得するときに、選択した列に配置される特定の条件に関係します。WHERE
句で論理演算を実行できます。たとえば、AND
、NOT
、OR
などです。
テーブルから情報を取得するときに true
でなければならないブール条件(リレーションとも呼ばれます)と呼ぶこともできます。これらの論理演算子は、<
、>
、<=
、>=
、=
、<>
などの比較演算子を使用します。
コード例:
SELECT Product, sum(AmountInUSD) AS Total FROM ms20.transactions WHERE Product in ( 'Television', 'Refrigerator') GROUP BY Product;
出力:
MySQL の HAVING
句
MySQL では、HAVING
句が GROUP BY
句と組み合わされています。この句を使用する目的は、列の操作を実行し、指定された条件に従って集約されたデータまたはグループに適用することです。
HAVING
句は、特定の条件を満たすグループからの結果のみを返します。WHERE
句と HAVING
句を一緒に使用すると、WHERE
は個々のレコード(行)をフィルタリングします。
次に、レコード(行)がグループ化され、集計計算が実行され、最後に HAVING
がグループをフィルタリングします。HAVING
句は、GROUP BY
句が作成したグループの状態をチェックします。
GROUP BY
句がない場合、HAVING
句は WHERE
句のように動作します。
HAVING
句を SELECT
ステートメントと組み合わせることで、さまざまな集計関数を使用することもできます。集約(グループ)メソッドには、SUM
、MAX
、MIN
、COUNT
、および AVG
が含まれます。
HAVING
句を使用すると集計関数を簡単に使用できますが、WHERE
句を使用するとグループ関数の無効な使用
としてエラーが発生します。
サンプルコード(集計関数なし):
SELECT Product, sum(AmountInUSD) AS Total FROM ms20.transactions GROUP BY Product HAVING Product in ('Television', 'Refrigerator');
出力:
サンプルコード(集計関数を使用):
SELECT Product, sum(AmountInUSD) AS Total FROM ms20.transactions GROUP BY Product HAVING sum(AmountInUSD) > 800;
出力:
1つのクエリに複数の句がある場合は、実行順序を知っておくことが重要です。F = FROM
、W = WHERE
、G = GROUP BY
、H = HAVING の実行シーケンスを知るには、
FWGHSOL(
Fで始まり
Lで終わる)の順序を覚えておく必要があります。
、S = SELECT
、O = ORDER BY
、および L = LIMIT
。
MySQL の WHERE
句と HAVING
句の違い
データを操作するクエリを作成する際には、次の点を考慮する必要があります。
WHERE 条項 | HAVING 句 |
---|---|
行(レコード)操作で実装されます。 | 列(属性)操作で実装されます。 |
集計計算の前に、個々の行に対してフィルター操作を実行します。 | 集約された(グループ)データに対してフィルター操作を実行します。 |
指定された条件を満たす特定の行から特定のデータを取得します。 | 最初にすべてのデータを取得し、次に指定された条件に応じて分離します。 |
この句で集計メソッドを使用することはできません。 | この句で集約メソッドを簡単に使用できます。 |
プレフィルターのように動作し、GROUP BY 句の前にあります。 | ポストフィルターのように動作し、GROUP BY 句の後にあります。 |
DELETE 、SELECT 、および UPDATE ステートメントで使用できます。 | SELECT ステートメントでのみ使用できます。 |