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

cakeでのトランザクション、コミット、ロールバック

cakePHP(2.X系)でのトランザクション、コミット、ロールバックについて。 cakePHPでトランザクションを書ける場合、Model内に [crayon-642114c8a3b252817017 …

no image

論理設計のアンチパターン その2

今回は論理設計のアンチパターンの続きです。 今までに比べると何も意図がないというものではなく、パフォーマンスを考えて設計されているようなものが多いです。 ただし、中には絶対に許されないタイプのものもあ …

no image

正規化について&EXTRACT

Contents1 正規化とは?2 第一正規化3 SQLネタ EXTRACT 正規化とは? 正確な定義は難しいですが、8割ぐらいあっている定義としては「適切なテーブルに分割すること」です。※ただし正確 …

no image

集合としてのSQL その2

本日も前回に引き続き集合としてのSQLに入っていきます。 Contents1 完全一致のテーブル2 重複行の削除 完全一致のテーブル 下記のようなテーブル(supparts)があり、持っている部品が完 …

no image

ajaxのasync:falseと複数DBのjoinに関して

本日も小ネタ集です。 Contents1 ajax:false2 複数DBでのJOIN ajax:false ajaxは非同期処理が基本ですが、async:falseとすると同期処理になります。 ただ …

アーカイブ