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

テストのダミーデータ作成

データベースに大量のデータを作りたいときにいつもあああやhoge,aaaですとデータという感じがしないですし、抽出や集計ができません。 なるべく自然に近いデータが欲しいのですが、簡単に作れる方法があり …

no image

オブジェクト指向 データベース層

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日は主にデータベース層の考え方について。 Contents1 データべース層1.1 要点1.1.1 典型的なダメテーブル設計1.1 …

no image

Firebaseについて

前回Lambdaに少し触れましたが、2019年6月現在、サーバーレスなアプリというものが活況(?)のようです。 大規模なアプリというと Webサーバー+RDB+サーバーサイドプログラミング言語 が必須 …

no image

ER図作成ツールについて(Mac版)

ER図作成ツールについてMacで色々と調べましたので、メモを。 フリー限定で。 ちなみにwindowsを使っていればA5:SQLが一番使えるかと思います。 以前も下記リンクで説明させていただきました。 …

no image

SQL基礎 case式について

case式に関して。 集約系の関数では複雑な処理を一気に行うことができる。 case式は1列のみ有効。複数の列に対して行うことはできない。 case ~ when ・・・thenではwhenが評価され …