ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 比較述語とNULL⑥ 集約関数とNULL

SQL 指南書集 目次 - ray88’s diary
入力が空テーブルの場合、極値関数と同様に
COUNT関数以外の集約関数(AVG, SUM 等)もNULLを返す

【例題】
東京在住の生徒の平均年齢より若いAクラスの生徒を選択する

--東京在住の生徒の平均年齢より若いAクラスの生徒を選択するSQL?
SELECT * 
FROM class_a
WHERE age < (SELECT AVG(age)
			 	FROM class_b
				WHERE city = '東京');

出力結果

※東京在住の生徒がいない場合、AVG関数はNULLを返すため、
WHERE句が常にunknownになり、1行も選択されない

【対処方法について】
集約関数や極値関数がNULLを返すことについては、関数の仕様が原因なので、
NULLを事前に何らかの値に変換するか、テーブル列にNOT NULL制約をつけるしかない。
しかし、テーブル列に NOT NULL制約を不可するくらいでは根絶できないケースが多い。
そのため、プログラミングの際はよく注意する必要がある。