skillup

技術ブログ

Database

HAVING句について

投稿日:

本日はHAVINGについて。

かろうじて用法はしっており、たまに使うこともありますが、あまりしっかり理解しているとはいえない状況ですので、掘り下げてみようと思います。

WHEREとは違い、抽出した結果に対しての絞り込みを行います。GROUP BYで絞ったあとの抽出などに最適です。

下記のようなテーブル(SeqTbl)があるとします。

seq | name
—–+———-
1 | ディック
2 | アン
3 | ライル
5 | カー
6 | マリー
8 | ベン

番号が歯抜けになっているのがわかるかと思います。歯抜けがあるかどうかは

このSQLで出せます。(歯抜けがなければCOUN(*)すべての列数とMAX(seq)が一緒になります。)

また歯抜けになっているseqを出したい場合は、下記のようなSQLになります。

下記のようなテーブル( graduates)があり最頻値(このケースでいうと20000と10000を求めるとします)

name | income
————+——–
サンプソン | 400000
マイク | 30000
ホワイト | 20000
アーノルド | 20000
スミス | 20000
ロレンス | 15000
ハドソン | 15000
ケント | 10000
ベッカー | 10000
スコット | 10000

考える場合のステップですが、下記のような流れになるかと思います。

  1. まず回数のみのテーブルを考慮
  2. そのテーブルをもとに最大値の算出
  3. その最大値と同様のデータを抽出

1の段階で下記テーブルを作ります。

2の段階(1のテーブルをベースに考えます)

3の段階(これが最終解になります。)

またALLを使った方法でも可能です。

こっちのほうが、わざわざ最大値を絞らなくていいので楽ですね。

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

JavaでのSQLの書き方

ちょっと小ネタです。 通常SQLを記述する場合、縦に分けて書くのが見た目にも見やすく、保守性も高いです。 例として

と書くよりは、 [ …

no image

MySQLのLIMIT,OFFSETに関して&explainの見方など

自作のWEBアプリを作っていたところSELECT句が異常に遅いケースがありました。 発見までにかなり時間がかかったんですが、不可思議な現象としてはOFFSETが小さいときと大きいときで検索スピードが全 …

no image

HAVING句について NULL時の動き

HAVING句のNULLがあった時の挙動にたいしてメモリます。 COUNTの処理 対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前 …

no image

JPAでのリレーションに関して

JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。 もともとクラスを作ってからDBを作成したり、JTAの規 …

no image

MySQL.sockファイルに関して

朝出社してテストサーバーを見るといきなりサーバーが動いていないという事態が発生。 MySQLを起動しようとすると

なるメッセージがでて …