戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

応用情報技術者 2011年 秋期 午前229


問題文

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

選択肢

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行となり、が正解です。

解法ステップ

  1. WHERE句の正しい比較形式を決める(本問では不等比較 <> または != と解釈)。
  2. 各行の「価格設定年月日」と指定値 '2011-12-01' を比較する。
  3. SQLの三値論理に基づき、比較がTRUEの行だけをカウントする(FALSE と UNKNOWN は除外)。
  4. 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 を使います。
Q. WHERE 句で NULL を含む行も選びたい場合は?
A. 明示的に IS NULL 条件を追加する(例: WHERE 価格設定年月日 IS NULL OR 価格設定年月日 <> '2011-12-01')か、COALESCEで代替値を用いる方法があります。
Q. データベースによってNULLの扱いは違いますか?
A. 三値論理(TRUE/ FALSE/ UNKNOWN)によるNULLの基本的な挙動はSQL標準で定義されています。細かな関数の挙動や暗黙の型変換などはDBMSにより差がありますが、NULL比較がTRUEとならない点は共通です。

関連キーワード: NULL、三値論理、比較演算子、IS NULL、COALESCE、不等演算子
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について