Mysqlのwhereとhaveの違いについての話

 

SQL文で集計関数を使用し、集計関数のレコードセットをフィルタリングする必要がある場合、このときHaving句を使用する必要がありますが、次の記事ではMysqlにおけるwhereとhaveの違いを中心に紹介しています。情報、必要な友人は以下を参照してください

OrderItems テーブルは、注文番号 order_num および item_price 製品販売価格、数量製品数量などのフィールドを含む注文情報を表します。

注文番号

商品価格

a1

10

105

a2

1

1100

a3

1

200

a4

2

1121

a5

5

10

a6

1

19

a7

7

5

【質問】 SQL文を書き、注文番号に従って集計し、注文金額の合計が1000以上のすべての注文番号を返し、最終結果は注文番号の昇順にソートされます。

ヒント: 合計価格 = item_price に数量を掛けたもの

注文番号

合計金額

a1

1050

a2

1319

a4

2242

間違った書き方を見てみましょう。

1

2

3

4

5

select order_num, sum(item_price*quantity) total_price

from OrderItems

group by order_num

where total_price >= 1000

order by order_num

説明:SQL_ERROR_INFO: 「SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、4 行目の「where total_price >= 1000\norder by order_num」付近で使用する正しい構文を確認してください。」

上記のエラーは、集計関数の不正な使用です。集計関数は WHERE 句で使用できません。

total_price は sum(item_price*quantity) に相当し、集計関数は WHERE 句で使用されます。

誤りを訂正

1

2

3

4

5

select order_num, sum(item_price*quantity) total_price

from OrderItems

group by order_num

having total_price >= 1000

order by order_num

それは正しい

使用する場合の注意点:

1. 行がグループ化されます。

2. 集計関数が使用されます。

3. HAVING句の条件を満たすグループが表示されます。

4. HAVING は単独で使用できません。GROUP BY と一緒に使用する必要があります。

次に、where には次のような違いがあります。

1. WHERE はテーブル内のフィールドをフィルター条件として直接使用できますが、グループ内の計算関数をフィルター条件として使用できません。HAVING は GROUP BY と組み合わせて使用​​する必要があり、グループ計算関数とグループ フィールドは使用できます。フィルター条件として。

2. 接続を通じて関連テーブルから必要なデータを取得する必要がある場合、WHERE は最初にフィルタリングしてから接続し、HAVING は最初に接続してからフィルタリングします。

3. 2 番目の項目は、WHERE はグループ内の計算関数でフィルタリングできないため、実行効率が高くなります。一方、HAVING はグループ内の計算関数が使用できるため、実行効率が低くなります。

ここで、from の後に実行シーケンスを持つ集計関数:

ここで > 集計関数 > を持つ

グループの結果を集計関数でフィルタリングする必要がある場合は、having のみを使用できます。Hasting ステートメントは、通常、Group by ステートメントによって返された結果セットをフィルター処理するために、Group by ステートメントと組み合わせて使用​​されます。Having ステートメントの存在により、Where キーワードを集計関数と組み合わせて使用​​できないという欠点が補われます。

例: 平均成績が 60 ポイントを超える学生の学生 ID と平均成績をクエリします。

AVG(s_score) > 60 を持つ s_id によるスコア グループから s_id、AVG(s_score) s_avg を選択します。

次のように書くこともできます。

select s_id, AVG(s_score) s_avg from Score group by s_id s_avg > 60;

Have to where を変更すると、where の実行順序が集計関数の実行順序よりも大きいため、エラーが報告されます。

転載元:マイクロリーディング  https://www.weidianyuedu.com

おすすめ

転載: blog.csdn.net/weixin_45707610/article/details/131865657