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 |
|
説明: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 |
|
それは正しい
使用する場合の注意点:
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 の実行順序が集計関数の実行順序よりも大きいため、エラーが報告されます。