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 ステートメントでのみ使用できます。 |
