0

HAVING行のグループとWHERE個々の行に使用します。
ただし、以下は有効です。

SELECT Salesperson, SUM(TotalSale)  
   FROM SALES  
   GROUP BY Salesperson  
   HAVING Salesperson <> 'Georgio';    

HAVINGつまり、集計関数なしで使用します。WHERE Salesperson <> 'Georgio';では、代わりに 使用することもできなかったのでしょうか?

4

4 に答える 4

3

最も簡単な答えは、HAVING両方の条件 (単純条件と集約条件) をWHEREサポートし、集約条件はサポートできないということです。

また、HAVINGレコードがグループ化された後に評価されます。

于 2013-03-14T08:13:38.657 に答える
2

はい。違いは、節が集計のHAVINGに評価され、節が前に評価されることです。WHERE

通常、これにより を使用することでパフォーマンスが向上しますが、WHERE常に 100% とは限りません。たとえば、次のようにします

create table foo(type int, data int);
create index bar on foo(id);

insert into foo values(1,3);

insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);

insert into foo values(3,3);

insert into foo values(5,3);

このクエリは次のように優れていWHEREます。

select type, sum(data)
from foo
where type = 5
group by type;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo ref bar bar 5 const 1 100 where の使用
select type, sum(data)
from foo
group by type
having type = 5;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo インデックスバー 5 8 100

しかし、値が十分に選択的でないため、このクエリは実際には としてパフォーマンスが向上します。HAVINGtype=2

select type, sum(data)
from foo
where type = 2
group by type;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo ALL bar 8 62.5 where の使用
select type, sum(data)
from foo
group by type
having type = 2;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo インデックスバー 5 8 100
于 2013-03-14T08:14:24.350 に答える
1

特定のクエリの答えは「はい」です

このように見てください。グループ化/集約するデータが少ないほど、SQL サーバーの負担が少なくなります。「どこで」は、実行する作業が少ないため、パフォーマンスが向上します。

ただし、クエリでは <> / not equal を使用しますが、これは SQL サーバーが実行する (難しい) フィルターであるため、サーバーがすべてをグループ化する方が簡単であるため、having 句の方が高速になる可能性があります。次に、この1つの例を削除します。

しかし、クエリオプティマイザーは何を言っているのでしょうか?

于 2013-03-14T08:24:26.577 に答える
0

できますが、各営業担当者の総売上を合計する機能が失われます;)

WHERE と HAVING の両方を使用することをお勧めします....

于 2013-03-14T08:13:31.433 に答える