ホームページ >データベース >mysql チュートリアル >MySQL クエリ: WHERE と HAVING – カスタム列に HAVING を使用する必要があるのはどのような場合ですか?

MySQL クエリ: WHERE と HAVING – カスタム列に HAVING を使用する必要があるのはどのような場合ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-19 22:32:14572ブラウズ

MySQL Queries: WHERE vs. HAVING – When Should I Use HAVING for Custom Columns?

MySQL クエリ内のカスタム列の位置: WHERE と HAVING

質問:

MySQL では、SELECT ステートメントで作成されたカラムを WHERE 句の後ではなく、HAVING 句の後に配置する必要があるのはなぜですか?また、列の完全な定義を指定する代わりに WHERE 1 を使用することに何か欠点はありますか?

答え:

他の回答もこのトピックに触れていますが、主な違いは次のとおりです:

WHERE 句: 選択する前にデータをフィルターし、任意のテーブル列を許可します。エイリアスや集計関数は使用できません。

HAVING 句: 選択後にデータをフィルターし、選択した列、エイリアス、または集計関数の使用を許可します。

場所:

カスタム列は HAVING 句の後に配置する必要があります。理由は次のとおりです。

  • HAVING は、カスタム列を含む、選択された結果データをフィルターします。
  • WHERE は、カスタム列を除き、選択前に結果データをフィルターします。

効率:

大規模なデータセットをフィルタリングする場合、WHERE 句を使用すると、選択を実行する前に無関係な行が削除されるため、より効率的です。

例:

次の形式を考えてみましょう:

<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>

ID と値の値が 1 ~ 10 の範囲の 10 行のデータが含まれます。

クエリ:

<code class="language-sql">SELECT `value` v FROM `table` WHERE `value`>5; -- 获取 5 行
SELECT `value` v FROM `table` HAVING `value`>5; -- 获取 5 行</code>

結果:

どちらのクエリも同じ結果を返します。これは、HAVING 句が GROUP BY 句なしで機能できることを示しています。

説明:

<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+
|  1 | SIMPLE      | table | range | value         | value | 4       | NULL |    5 | Using where; Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+</code>
<code class="language-sql">EXPLAIN SELECT `value` v FROM `table` having `value`>5;</code>
<code>+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key   | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+
|  1 | SIMPLE      | table | index | NULL          | value | 4       | NULL |   10 | Using index |
+----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+</code>

ご覧のとおり、WHERE と HAVING は両方ともインデックスを使用しますが、返される行数は異なります。 WHERE は選択前にデータをフィルターして行数を減らしますが、HAVING は選択後に行をフィルターします。

結論:

  • 選択したデータをフィルターするには、HAVING 句の後にカスタム列を配置します。
  • WHERE 句を使用すると、無関係な行を除外して大規模なデータ セットを効率的にフィルタリングできます。

以上がMySQL クエリ: WHERE と HAVING – カスタム列に HAVING を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。