ホームページ >データベース >mysql チュートリアル >MySQL クエリ: WHERE と HAVING – カスタム列に HAVING を使用する必要があるのはどのような場合ですか?
MySQL クエリ内のカスタム列の位置: WHERE と HAVING
質問:
MySQL では、SELECT ステートメントで作成されたカラムを WHERE 句の後ではなく、HAVING 句の後に配置する必要があるのはなぜですか?また、列の完全な定義を指定する代わりに WHERE 1 を使用することに何か欠点はありますか?
答え:
他の回答もこのトピックに触れていますが、主な違いは次のとおりです:
WHERE 句: 選択する前にデータをフィルターし、任意のテーブル列を許可します。エイリアスや集計関数は使用できません。
HAVING 句: 選択後にデータをフィルターし、選択した列、エイリアス、または集計関数の使用を許可します。
場所:
カスタム列は HAVING 句の後に配置する必要があります。理由は次のとおりです。
効率:
大規模なデータセットをフィルタリングする場合、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 は選択後に行をフィルターします。
結論:
以上がMySQL クエリ: WHERE と HAVING – カスタム列に HAVING を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。