ホームページ > データベース > mysql チュートリアル > MySQL における WHERE と HAVING: 計算列に各句をいつ使用する必要があるか?

MySQL における WHERE と HAVING: 計算列に各句をいつ使用する必要があるか?

Linda Hamilton
リリース: 2025-01-19 22:42:09
オリジナル
631 人が閲覧しました

WHERE vs. HAVING in MySQL: When Should I Use Each Clause for Calculated Columns?

MySQL WHERE と HAVING: 計算列を使用したクエリの最適化

MySQL データベース操作では、WHERE 句と HAVING 句のどちらを選択するかが、計算カラムを処理する際のクエリの効率に大きく影響します。 最適化された SQL を作成するには、それぞれの異なる役割を理解することが重要です。

計算列の戦略的な配置

ステートメント内で作成される列 (例: SELECT) などの SELECT 1 AS "number" 計算列は、通常、HAVING ではなく WHERE 句の後に続く必要があります。 これは、WHERE が計算や集計のにデータをフィルタリングするのに対し、HAVING はこれらの操作のにデータをフィルタリングするためです。

WHERE 句の制限

計算列で WHERE を使用すると、エラーが発生することがよくあります。 WHERE 条件は、既存のテーブル列または別名を参照する必要があります。計算された値を直接操作することはできません。

WHERE と HAVING の主な違い

  • WHERE 句: ステートメントが実行されるSELECTに行をフィルタリングします。 条件は任意のテーブル列に適用できますが、SELECT リスト内で定義された計算列には適用できません。

  • HAVING 句: ステートメントと集計関数が適用されたSELECTの行をフィルターします。 条件は、選択した列、エイリアス、または集計関数の結果に適用できます。

パフォーマンスに関する考慮事項

大きなテーブルの場合、WHERE 句に計算列を配置すると、計算コストが高くなる可能性があります。 HAVING は、縮小されたデータセット (SELECT ステートメントの結果) で動作し、不必要な行フィルター処理を最小限に抑えるため、これらのシナリオでパフォーマンス上の利点を提供します。

具体例

サンプルテーブルを考えてみましょう:

<code class="language-sql">CREATE TABLE `table` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `value` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `value` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code>
ログイン後にコピー

10 行が入力されます (ID と値の範囲は 1 ~ 10):

<code class="language-sql">INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);</code>
ログイン後にコピー

次のクエリは同じ結果を返します:

<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- Returns 5 rows
SELECT `value` v FROM `table` HAVING `value`>5; -- Returns 5 rows</code>
ログイン後にコピー

ただし、EXPLAIN ではパフォーマンスに重大な違いがあることがわかります。

<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;  -- Uses index but scans more rows
EXPLAIN SELECT `value` v FROM `table` HAVING `value`>5; -- Uses index efficiently, scans fewer rows</code>
ログイン後にコピー

どちらもインデックスを利用しますが、WHERE はテーブルの大部分をスキャンしてフィルタリングしますが、HAVING は事前にフィルタリングされた小さなサブセットに対してより効率的に動作します。この違いは、データセットが大きくなるほど顕著になります。 したがって、計算列の場合、一般に HAVING の方がパフォーマンスが向上します。

以上がMySQL における WHERE と HAVING: 計算列に各句をいつ使用する必要があるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート