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