skillup

技術ブログ

Database

HAVING句について NULL時の動き

投稿日:2016年11月12日 更新日:

HAVING句のNULLがあった時の挙動にたいしてメモリます。

COUNTの処理

対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前者はそのままですが、後者はNULLを含みません。それを前提として下記のような問題を解いてみましょう。

あ、すべてサンプルデータなどはここにのっています。

stundentsテーブル
student_id | dpt | sbmt_date
————+———-+————
100 | 理学部 | 2005-10-10
101 | 理学部 | 2005-09-22
102 | 文学部 |
103 | 文学部 | 2005-09-10
200 | 文学部 | 2005-09-22
201 | 工学部 |
202 | 経済学部 | 2005-09-25

上記は課題提出のテーブルだとします。ここから全ての生徒が課題を提出している。つまりはsbmt_dateがNULLでない学部を求めるとします。(この場合ですと、理学部と経済学部になります。)

その場合COUNTとHAVUNGを使うと下記のように書けます。

これで下記のようなテーブルになります。

dpt | count | count
———-+——-+——-
経済学部 | 1 | 1
工学部 | 1 | 0
理学部 | 2 | 2
文学部 | 3 | 2

ここからHAVINGでフィルタリングしてみましょう。(HAVINGはエイリアスは使えないので注意です。)

dpt | num | submit_num
———-+—–+————
経済学部 | 1 | 1
理学部 | 2 | 2

模範解答ではCASEを使って下記のようにも書いていました。

これは思いつかなかったなあ・・

次はもう少し実践的です。

下記のような商品テーブル(items)と店舗テーブル(shopitems)があるとします。

item
———-
ビール
紙オムツ
自転車

shop | item
——+———-
仙台 | ビール
仙台 | 紙オムツ
仙台 | 自転車
仙台 | カーテン
東京 | ビール
東京 | 紙オムツ
東京 | 自転車
大阪 | テレビ
大阪 | 紙オムツ
大阪 | 自転車

このなかでitemsの中の商品をすべてそろえている店舗(仙台、東京)を抽出します。
まずは下記SQLを使うとitemsの中に含まれているshopitemsのレコードをすべて求めてくれます。

shop | item
——+———-
仙台 | ビール
仙台 | 紙オムツ
仙台 | 自転車
東京 | ビール
東京 | 紙オムツ
東京 | 自転車
大阪 | 紙オムツ
大阪 | 自転車

上記のテーブルはすべてitemsの中にあるものだけで構成されています。
これを店舗名でGROUP BYし、itemsのレコード数と一緒になれば全部含まれていることになります。

やはり集合の考え方が大事になってきますね。いままであまり考えなかったので、図を書きながら整理するといいかもと思っています。

-Database
-

執筆者:


comment

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

関連記事

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

no image

MySQLのロックに関して+サブクエリ内のupdate

MySQLのロックに関して。 データベースではデータの整合性を保つために読み書きを一時的に制限する仕組みがあります。(データベースだけではないですが・・・) 大きく分けると共有ロック(書き込みは当然だ …

no image

MYSQL group_concat,cast等

実務でいろいろとトラブルがあり、データベースから在庫データを見てくれ~なんて依頼がありましたんでSQLをごりごり書いていたんですが、普段使わないようなSQLの構文を使ったのでここでちょっと紹介します。 …

no image

Cakeでのリレーションについて

いまさらながらCakeのリレーションについての復習。 基本から。 Contents1 基本的なリレーション1.1 1対N1.2 N対11.3 動的な紐づけ 基本的なリレーション 下記のようなテーブル構 …

no image

DBの基礎 テーブルとは

CSSを学習したあとはデータベースの学習などを。 参考図書:「達人に学ぶDB設計指南書」基本的にはこれを読んでいきます。が、現状よくわからないところは飛ばしていきます・・・ Contents1 テーブ …