0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HAVING句を使って集合を切り分けることで、NULLを含まない集合の探し方 〜 COUNT(*)とCOUNT(列名)の違い 〜 (Vol.2)

Posted at

はじめに

HAVING句を使って集合を切り分けることで、NULLを含まない集合の探し方を紹介します。

実行結果はこちらで確認できます。

本記事は、下記の記事の続きです。

本記事では、CASE式による表現を扱っています。

Schemaや、クエリのお題は前の記事を参考にしてください。

Query

SELECT class
FROM members
GROUP BY class
HAVING COUNT(*) = SUM(
	CASE
  		WHEN submit_date IS NOT NULL
  		THEN 1 ELSE 0 END
)

Results

class
A
D

CASE式は、提出日がNULLでない行については1、NULLなら0というフラグを立てています。

CASE式は、各要素が特定の条件を満たす集合に含まれているかどうかを決める関数を表しています。

こういう関数を

  • 特性関数
  • 定義関数(集合を定義するという意味)

というそうです。

HAVING句は集合の性質を調べる道具として使えます。とくに集約関数(SUM, COUNT)やCASE式と組み合わせると便利です。

手続き型言語では、フローチャートが思考の補助線になりますが、集合指向言語では、HAVING句で集合を切り分けて問題を解く際には紙にベン図的なものを書くと効果的だと思います。

本日は以上です。

次は、特性関数やを利用して、複雑な条件を集合を切り分けて集計をしてみましょう!

参照

116p

アウトプット100本ノック実施中

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?