コマンド道場
IN / EXISTS難易度 ★★★☆☆

2026 年に受注が無い顧客

2026-01-01 以降に、取消されていない受注(status が 'done')が 1 件も無い顧客を取り出してください。列は「顧客名, 都道府県」の順、顧客番号(kokyaku_id)の小さい順に並べてください。受注が 1 件も無い顧客も対象に含みます。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database

未確認: IBM Db2

製品ごとの対応表(実測)を見る

  • NOT IN でも同じことを書けますが、右側に NULL が 1 つでもあると 1 行も返らなくなります。NOT EXISTS にはこの落とし穴がありません。
  • 標準 SQL の三値論理によるもので、実際に測った製品ではすべて同じ挙動でした。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

10

NULL
🔑int不可
int不可
date不可
text不可
データを見る(先頭 5 行)
juchu_idkokyaku_idjuchu_onstatus
100112025-11-05done
100222025-11-18done
100312025-12-02done
100432025-12-09cancel
100542025-12-24done

17

NULL
🔑int不可
🔑int不可
int不可
int不可
numeric(10,0)不可
データを見る(先頭 5 行)
juchu_idgyo_noshohin_idsuryotanka
10011120180
10012230120
100214223800
100225118500
10031644200

5

NULL
🔑int不可
text不可
text
date不可
データを見る(先頭 5 行)
kokyaku_idkokyaku_nameprefcreated_on
1青葉工業東京都2024-05-10
2白樺物産大阪府2024-08-01
3黒松システム東京都2025-01-15
4赤坂商会NULL2025-03-20
5三田商事愛知県2025-06-01

7

NULL
🔑int不可
text不可
text不可
numeric(10,0)不可
データを見る(先頭 5 行)
shohin_idshohin_namecategoryprice
1ノート文具180
2ボールペン文具120
3付箋文具250
4デスクチェア家具24800
5書棚家具18500

解説

結論

「〜が 1 件も無い」は NOT EXISTS で書きます。括弧の中で、外側の行と結びつける条件を書くのが要点です。

なぜ

NOT EXISTS は「括弧の中が 1 行も返さないこと」を各行について判定します。行の中身は見ないので、SELECT の後ろは 1 でも * でも構いません。

★「無いもの」を探すときに一番やりがちな間違いは、条件をひっくり返して「別のものがあるもの」を探してしまうことです。「2026 年に受注が無い顧客」と「2025 年に受注がある顧客」は違います。前者には、そもそも受注が 1 件も無い顧客が含まれますが、後者には含まれません。このデータには受注が 1 件も無い顧客がいるので、その違いが結果に現れます。

⚠️ NOT IN との違い: NOT IN (SELECT ...) でも同じことを書けますが、副問い合わせの結果に NULL が 1 つでも混ざると、結果は「該当なし」になります。SQL の三値論理では「NULL と等しくない」が真にならないためです。NOT EXISTS ならこの罠はありません。迷ったら NOT EXISTS を選んでください。

よくある間違い

①括弧の中に外側との結びつけ条件を書き忘れ、どの顧客でも同じ判定になってしまう。②NOT を付け忘れる。③条件の一部(取消・期間)を括弧の外に書いてしまう。

根拠(一次情報)