コマンド道場
AND / OR / NOT難易度 ★★☆☆☆

NOT で条件を打ち消す

shain テーブルから、給与が 45 万円以上 65 万円以下の範囲に「入らない」社員を取り出してください。列は「name, salary」の順、給与の高い順に並べてください。

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

未確認: IBM Db2

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

  • NOT は条件全体を打ち消します。括弧で囲んだ範囲にかかることを意識してください。
  • ⚠️ NOT (A AND B) は「A でない または B でない」です。「A でない かつ B でない」ではありません(ド・モルガンの法則)。
● 起動中…

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

7

NULL
🔑int不可
text不可
int
データを見る(先頭 5 行)
busho_idbusho_nameparent_busho_id
1経営NULL
2開発1
3営業1
4管理1
5基盤2

18

NULL
🔑int不可
text不可
int
int
numeric(10,0)不可
date不可
date
データを見る(先頭 5 行)
shain_idnamebusho_idjoushi_idsalaryhired_ontaishoku_on
1鈴木1NULL9800002014-04-01NULL
2佐藤217200002016-10-01NULL
3田中225200002019-04-01NULL
4中村225300002020-04-01NULL
5小林224450502024-04-01NULL

解説

結論

「範囲に入らない」は、入る条件を書いてから NOT で囲むのが確実です。

なぜ

NOT は直後の 1 つの条件にしかかかりません。括弧を書かないと NOT salary >= 450000 AND salary <= 650000 は「(給与が 45 万未満)かつ(65 万以下)」という別の意味になります。打ち消したい範囲は必ず括弧で囲んでください。

手で展開するなら、NOT (A AND B) は「A でない または B でない」になります。AND が OR に変わる点がよく間違えるところです(ド・モルガンの法則)。実際 salary < 450000 AND salary > 650000 は同時に成り立たないので 1 行も返りません。

よくある間違い

①括弧を書かず NOT のかかる範囲を誤る ②展開したときに AND のままにして 0 行になる。

根拠(一次情報)