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

選択肢
ア:1
イ:2(正解)
ウ:3
エ:4
🔒 解説は解答すると表示されます
NULL比較の扱い【午前2解説】
正解の理由
問のWHERE句は比較演算子が抜けた表記になっていますが、設問の正答がイ(2行)であることから、正しくは例えば次の形式で評価されると解釈します。
WHERE 価格設定年月日 <> '2011-12-01' もしくは WHERE 価格設定年月日 != '2011-12-01'。
この条件で各行を評価すると、S001(2009-12-31)と S002(2008-03-31)は比較結果が真(TRUE)になり選択されます。一方、S004(2011-12-01)は等しいため偽(FALSE)で除外、S003(NULL)はNULLとの比較は「未知(UNKNOWN)」となりWHEREでの真に該当しないため除外されます。したがって抽出される行数は2行となり、イが正解です。
WHERE 価格設定年月日 <> '2011-12-01' もしくは WHERE 価格設定年月日 != '2011-12-01'。
この条件で各行を評価すると、S001(2009-12-31)と S002(2008-03-31)は比較結果が真(TRUE)になり選択されます。一方、S004(2011-12-01)は等しいため偽(FALSE)で除外、S003(NULL)はNULLとの比較は「未知(UNKNOWN)」となりWHEREでの真に該当しないため除外されます。したがって抽出される行数は2行となり、イが正解です。
解法ステップ
- WHERE句の正しい比較形式を決める(本問では不等比較 <> または != と解釈)。
- 各行の「価格設定年月日」と指定値 '2011-12-01' を比較する。
- SQLの三値論理に基づき、比較がTRUEの行だけをカウントする(FALSE と UNKNOWN は除外)。
- TRUE となる行の数を数える(本問は2行)。
具体的な行ごとの判定:
- S001: '2009-12-31' <> '2011-12-01' → TRUE(選択される)
- S002: '2008-03-31' <> '2011-12-01' → TRUE(選択される)
- S003: NULL <> '2011-12-01' → UNKNOWN(WHEREでは除外)
- S004: '2011-12-01' <> '2011-12-01' → FALSE(除外)
選択肢別の誤答解説
- ア: 1
1行になると考える人は、NULL行を「異なる」とみなしてカウントしてしまった可能性があります。NULLは比較でTRUEにならないため誤りです。 - イ: 2(正解)
S001 と S002 が不等で TRUE、S003 は NULL 比較で UNKNOWN のため含まれず、S004 は等しいため除外されます。 - ウ: 3
3行とするのは S001, S002, S004 のいずれかを誤って含めたケース(例えば不等でなく <= と解釈した等)が考えられますが、条件の解釈として整合性がありません。 - エ: 4
全行が抽出されるとするのは、NULLを含めて全て比較がTRUEと誤認している場合です。SQLではNULL 比較はTRUEにならないため誤りです。
よくある誤解
- NULL は他の値と比較して「偽」ではなく「未知(UNKNOWN)」と評価される。WHERE句はTRUEの行だけを選ぶため、NULL を含む行は選ばれない。
- NULL と NULL の比較(NULL = NULL)も TRUE ではない。NULL を扱う場合は IS NULL / IS NOT NULL を使う必要がある。
- 不等演算子に
<>と!=の違いを気にする受験者がいるが、ほとんどのデータベースではどちらも不等を表す(SQL標準は<>)。
補足コラム
NULL を意図的に含めて抽出・除外したい場合の実用例:
- NULL を含む「不等」の意味で「NULL 以外かつ値が異なる」を抽出するには次のように書く:
SELECT 商品コード
FROM 商品
WHERE 価格設定年月日 IS NOT NULL
AND 価格設定年月日 <> '2011-12-01';
- NULL を「別扱い」で特定の値に置き換えて比較したい場合は COALESCE を使う:
SELECT 商品コード
FROM 商品
WHERE COALESCE(価格設定年月日, '1900-01-01') <> '2011-12-01';
(ただし置換値が実データと衝突しないよう注意)
簡単な実行例(SQLite や PostgreSQL などで同様の挙動):
-- テスト用データ挿入と比較
CREATE TABLE 商品(商品コード TEXT, 商品名 TEXT, 価格 INTEGER, 価格設定年月日 TEXT);
INSERT INTO 商品 VALUES ('S001','ボールペン',150,'2009-12-31');
INSERT INTO 商品 VALUES ('S002','消しゴム',80,'2008-03-31');
INSERT INTO 商品 VALUES ('S003','蛍光ペン',0,NULL);
INSERT INTO 商品 VALUES ('S004','定規',300,'2011-12-01');
-- 不等比較
SELECT 商品コード FROM 商品 WHERE 価格設定年月日 <> '2011-12-01';
-- 結果: S001, S002 の2行
FAQ
Q. NULL = NULL は TRUE になりますか?
A. いいえ。SQLでは NULL = NULL は UNKNOWN(TRUE ではない)です。NULL の有無を判定するには IS NULL / IS NOT NULL を使います。
A. いいえ。SQLでは NULL = NULL は UNKNOWN(TRUE ではない)です。NULL の有無を判定するには IS NULL / IS NOT NULL を使います。
Q. WHERE 句で NULL を含む行も選びたい場合は?
A. 明示的に IS NULL 条件を追加する(例: WHERE 価格設定年月日 IS NULL OR 価格設定年月日 <> '2011-12-01')か、COALESCEで代替値を用いる方法があります。
A. 明示的に IS NULL 条件を追加する(例: WHERE 価格設定年月日 IS NULL OR 価格設定年月日 <> '2011-12-01')か、COALESCEで代替値を用いる方法があります。
Q. データベースによってNULLの扱いは違いますか?
A. 三値論理(TRUE/ FALSE/ UNKNOWN)によるNULLの基本的な挙動はSQL標準で定義されています。細かな関数の挙動や暗黙の型変換などはDBMSにより差がありますが、NULL比較がTRUEとならない点は共通です。
A. 三値論理(TRUE/ FALSE/ UNKNOWN)によるNULLの基本的な挙動はSQL標準で定義されています。細かな関数の挙動や暗黙の型変換などはDBMSにより差がありますが、NULL比較がTRUEとならない点は共通です。
関連キーワード: NULL、三値論理、比較演算子、IS NULL、COALESCE、不等演算子

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

