応用情報技術者 2011年 秋期 午前2 問29
問題文
価格設定年月日にNULLを含む“商品”表に対して、次の問合せを行った。この検索結果の行数は幾つか。
SELECT 商品コード FROM 商品 WHERE 価格設定年月日 < '2011-12-01'

選択肢
ア:1
イ:2(正解)
ウ:3
エ:4
🔒 解説は解答すると表示されます
NULLを含む列の比較【午前2解説】
正解の理由
問合せの条件は「価格設定年月日 < '2011-12-01'」です。各行を評価すると、S001(2009-12-31)と S002(2008-03-31)は2011年12月1日より前なので真(TRUE)になり選択されます。S004(2011-12-01)は等しいので「より前」ではなく偽(FALSE)です。S003 は価格設定年月日が NULL なので、比較の結果は真でも偽でもない「不明(UNKNOWN)」になり、WHERE句では選択されません。したがって検索結果は2行で、イが正解です。
解法ステップ
- WHERE句の条件「価格設定年月日 < '2011-12-01'」を確認する。
- 各行の価格設定年月日を '2011-12-01' と比較する。
- SQLの三値論理に従い、結果が TRUE の行だけを数える(FALSE と UNKNOWN は除外)。
行ごとの判定:
- S001: '2009-12-31' < '2011-12-01' → TRUE(選択される)
- S002: '2008-03-31' < '2011-12-01' → TRUE(選択される)
- S003: NULL < '2011-12-01' → UNKNOWN(選択されない)
- S004: '2011-12-01' < '2011-12-01' → FALSE(選択されない)
選択肢別の誤答解説
- ア: 1
S001 と S002 はどちらも条件を満たすので、1行にはなりません。 - イ: 2(正解)
S001 と S002 の2行が選択されます。 - ウ: 3
NULL の行(S003)を「日付が無いので条件を満たす」と考えたり、S004 を「以前」として含めたりすると3行になりますが、どちらも誤りです。 - エ: 4
全行が選択されるのは、NULL の行も等しい日付の行も TRUE と評価した場合で、誤りです。
よくある誤解
- NULL との比較は FALSE ではなく UNKNOWN になります。WHERE句は TRUE の行だけを選ぶので、NULL の行は「<」でも「>=」でも選ばれません。
- 「<」は「より前(未満)」であり、同じ日付は含みません。同じ日付も含めたい場合は「<=」を使います。
補足コラム
NULL の行も結果に含めたい場合は、IS NULL を条件に加えます。
SELECT 商品コード
FROM 商品
WHERE 価格設定年月日 < '2011-12-01'
OR 価格設定年月日 IS NULL;
この問合せなら S001、S002、S003 の3行が選択されます。
FAQ
Q. NULL = NULL は TRUE になりますか?
A. なりません。NULL = NULL も UNKNOWN です。NULL かどうかを調べるには IS NULL / IS NOT NULL を使います。
A. なりません。NULL = NULL も UNKNOWN です。NULL かどうかを調べるには IS NULL / IS NOT NULL を使います。
Q. 日付を文字列として比較してよいのですか?
A. DATE型の列と '2011-12-01' のような日付リテラルの比較は、日付の前後関係で評価されます。
A. DATE型の列と '2011-12-01' のような日付リテラルの比較は、日付の前後関係で評価されます。
関連キーワード: NULL、三値論理、比較演算子、IS NULL、WHERE句

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

