プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • SQL
  • 【SQL】「GROUP BY句」、「HAVING句」について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【SQL】「GROUP BY句」、「HAVING句」について

06.21

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

「GROUP BY句」とは?

テーブルのデータを、商品分類ごとに価格を集計する等、カテゴリ分けします。

集約関数(COUNT、MAX等)と組み合わせることで、カテゴリ別に集計することができます。

「HAVING句」とは?

「GROUP BY句」でグループ化した結果に対する条件指定をする場合に使用します。

「WHERE句」はあくまで、行に対する条件指定のために使用するのであり、グループ化した結果に対する条件指定をするものではないので注意です。

「GROUP BY句」、「HAVING句」の記述ルール

構文

1
2
3
4
5
SELECT 列1,列2,列3
  FROM テーブル名
  WHERE 抽出条件
  GROUP BY 列1,列2,列3
  HAVING グループ化された結果に対する条件を指定する。

GROUP BY句は、必ずFROM句やWHERE句の後ろに置くこと。

WHERE句を使う場合

WHERE句で絞り込まれた条件に対して、GROUP BY句が実行されます。

「GROUP BY句」と「集約関数」を使った場合の注意点

  • SELECT句に書けるものが限定される。
  • GROUP BY句には、SELECT句でつけた別名は使えない。
  • GROUP BY句は、集計結果のソートをしない。
  • WHERE句に集約関数を書くことはできない。

SELECT句に書けるものが限定されます。

GROUP BYを使った場合は、SELECT句に書けるものは、下記の3つに限定されます。

  • 定数
  • 集約関数
  • GROUP BY句で指定した列名(集約のキーとなる列)

要は、「集約キーに登場していない列は書くことができない」のです。

理由としては、グループ化されているということは、グループ化のキー項目で1意になっており、それ以外の項目は一つに特定できる内容かわからないためです。

GROUP BY句には、SELECT句でつけた別名は使えない。

GROUP BY句では、SELECT句で使った別名は使えません。

これは、SQLの評価順として、SELECT句よりも、GROUP BY句の方が先だからです。

SQLの句の評価順については、下記の記事でも解説しています。

【SQL】SELECT文の評価順

GROUP BY句の集計結果のソート順はランダムになる。

GROUP BY句の集計結果のソート順はランダムです。

ソートさせるには、ORDER BY句でしっかりとソートさせるようにしましょう。

WHERE句に集計関数を指定できない。

集計関数を書くことができるのは、下記の三つです。

  • SELECT句
  • HAVING句
  • ORDER BY句

「DISTINCTキーワード」と、「GROUP BY句」の比較

単純に「GROUP BY句」で、列をまとめるだけであれば「DISTINCTキーワード」と抽出結果は同じです。

また、実行速度もほぼ同じですが、「GROUP BY句」はあくまで「グループ分けをする」という目的の元に使用する構文であり、「重複を排除する」という目的とは少しずれるので、重複を排除する目的であれば、「GROUP BY句」ではなく、「DISTINCTキーワード」を使用するべきでしょう。

「HAVING句」に指定できる条件

下記の3つです。

  • 定数
  • 集約関数
  • GROUP BY句で指定した列名

例えば、「HAVING COUNT(*) = 2」という条件指定であれば、「COUNT(*)」が集約関数であり、「2」が定数になります。

「WHERE句」と「HAVING句」の使い分け

また、例えば下記のようにGROUP BY句で指定した列名も抽出条件として指定することができます。

1
2
3
4
SELECT NAME
FROM ITEM
GROUP BY NAME
HAVING NAME = '商品1'

しかし、GROUP BY句に対する抽出条件を指定する場合は、WHERE句で指定するべきです。

理由としては、あくまでHAVING句は「抽出結果に対して、条件を指定するもの」であり、「集約キーに対する条件の指定」は、集約前のWHERE句での条件指定で補うことができるためです。

また、WHERE句の方が、HAVING句よりも、パフォーマンスが良いので、もしグループ化の列に対して条件を指定する場合は、WHERE句に指定するべきです。

スポンサーリンク
  • 2018 06.21
  • miyabisan2
  • コメントを書く
  • SQL
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 08.15

    【SQL】読みやすいSQLを作るための手法(WITH句)

  2. 2018 05.05

    【SQL】パフォーマンスを考えるに当たり必要な「結合」の知識(Oracle)

  3. 2018 05.20

    【PL/SQL】「変数」や「固定値」の使い方

  4. 2018 06.22

    【SQL】「制約」の種類と使い方

  5. 2018 05.03

    【SQL】実行計画を調べるEXPLAIN PLANコマンドの使い方(Oracle、MySQL)

  6. 2018 06.22

    【SQL】「ウィンドウ関数」(OLAP関数)について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【PostgreSQL】特徴、バージョン、データベース…

【SQL】「ORDER BY句」の細かい挙動について

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー