6

重複の可能性:
SQL:HAVINGとWHEREの違いは何ですか?

WHEREとについていろいろな議論を見てきましたHAVING。まだ質問があります。HAVING集計を検討する場合にのみ使用されますか、それともより一般的な用語で使用できますか。クエリでフィールドを作成またはエイリアス化した場合はいつでも使用できますか?WHERE可能な場合は常にそれを使用する必要があることを私は知っています。

4

4 に答える 4

10

HAVINGSELECTステートメントで使用される何かの検索を指定します。

言い換えると。

HAVINGグループに適用されます。

WHERE行に適用されます。

于 2011-06-15T15:31:05.270 に答える
7

HAVINGGROUP BY句と組み合わせて使用​​される集計を含む条件専用です。例えば。COUNT、、、、、。SUM_ AVG_ MAX_ 非集計条件用です。同じクエリで一緒に使用することもできます。例えば。MINWHERE

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;

更新 #1:

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'

更新 #2:

HAVINGSQL Server での新しい使い方をテストしましたが、うまくいきませ。したがって、これは MySQL のみの機能である可能性があります。また、@Denis はコメントで、このトリックは列/エイリアスを明確にできる場合にのみ機能し、一部のエンジンでのみ機能することを指摘しました。

于 2011-06-15T15:30:38.143 に答える
7

このWHERE句は、レコードを制限するために使用され、使用するインデックスとテーブルを決定するためにクエリ オプティマイザーによっても使用されます。 HAVING は最終的な結果セットの「フィルター」であり、 の後 GROUP BYに適用されるため、SQL はそれを使用してクエリを最適化できません。

WHERE抽出中に各行に適用されます。HAVINGすべての行を抽出し、結果をフィルタリングします。

したがってWHERE、集約関数には使用できません。これは、完全な行セットを抽出する必要があるためです。

于 2011-06-15T15:31:58.623 に答える
4

HAVINGGROUP BY句があり、グループ化フィールドの 1 つに基づいてフィルタリングしようとしている場合に使用されます。WHEREそれ以外の場合は、フィルタリングに使用されます。

例えば。

select StudentName from students where Age > 20

select className, count(studentId) from classes group by className 
                                      having count(studentId) > 10
于 2011-06-15T15:31:05.113 に答える