重複の可能性:
SQL:HAVINGとWHEREの違いは何ですか?
WHERE
とについていろいろな議論を見てきましたHAVING
。まだ質問があります。HAVING
集計を検討する場合にのみ使用されますか、それともより一般的な用語で使用できますか。クエリでフィールドを作成またはエイリアス化した場合はいつでも使用できますか?WHERE
可能な場合は常にそれを使用する必要があることを私は知っています。
重複の可能性:
SQL:HAVINGとWHEREの違いは何ですか?
WHERE
とについていろいろな議論を見てきましたHAVING
。まだ質問があります。HAVING
集計を検討する場合にのみ使用されますか、それともより一般的な用語で使用できますか。クエリでフィールドを作成またはエイリアス化した場合はいつでも使用できますか?WHERE
可能な場合は常にそれを使用する必要があることを私は知っています。
HAVING
SELECT
ステートメントで使用される何かの検索を指定します。
言い換えると。
HAVING
グループに適用されます。
WHERE
行に適用されます。
HAVING
GROUP BY
句と組み合わせて使用される集計を含む条件専用です。例えば。COUNT
、、、、、。SUM
_ AVG
_ MAX
_ 非集計条件用です。同じクエリで一緒に使用することもできます。例えば。MIN
WHERE
SELECT t1.id, COUNT(*) FROM table1 AS t1
INNER JOIN table2 AS t2 ON t2.t1_id = t1.id
WHERE t1.score > 50
GROUP BY t1.id HAVING COUNT(*) > 2;
HAVING
私が知らなかった非集約的な使用法があることがわかりました。エイリアスを使用する以下のクエリは、HAVING
キーワードではなくキーワードでのみ機能しWHERE
ます。MySQL での私のテストを参照してください。
mysql> create table my_contacts (
-> id int unsigned primary key auto_increment,
-> first_name varchar(32) not null,
-> last_name varchar(32) not null,
-> index (last_name, first_name)
-> ) engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into my_contacts (first_name, last_name)
-> values ('Randy', 'Jackson'), ('Billy', 'Johnson'), ('Sam', 'Harris'), ('Lenny', 'Benson'), ('Sue', 'Flax');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT last_name AS l FROM my_contacts HAVING l LIKE '%son';
+---------+
| l |
+---------+
| Benson |
| Jackson |
| Johnson |
+---------+
3 rows in set (0.00 sec)
mysql> SELECT last_name AS l FROM my_contacts WHERE l LIKE '%son';
ERROR 1054 (42S22): Unknown column 'l' in 'where clause'
HAVING
SQL Server での新しい使い方をテストしましたが、うまくいきません。したがって、これは MySQL のみの機能である可能性があります。また、@Denis はコメントで、このトリックは列/エイリアスを明確にできる場合にのみ機能し、一部のエンジンでのみ機能することを指摘しました。
このWHERE
句は、レコードを制限するために使用され、使用するインデックスとテーブルを決定するためにクエリ オプティマイザーによっても使用されます。 HAVING
は最終的な結果セットの「フィルター」であり、 の後
GROUP BY
に適用されるため、SQL はそれを使用してクエリを最適化できません。
WHERE
抽出中に各行に適用されます。HAVING
すべての行を抽出し、結果をフィルタリングします。
したがってWHERE
、集約関数には使用できません。これは、完全な行セットを抽出する必要があるためです。
HAVING
GROUP BY
句があり、グループ化フィールドの 1 つに基づいてフィルタリングしようとしている場合に使用されます。WHERE
それ以外の場合は、フィルタリングに使用されます。
例えば。
select StudentName from students where Age > 20
select className, count(studentId) from classes group by className
having count(studentId) > 10