コマンド道場
BETWEEN 述語難易度 ★★★☆☆

範囲から外れるものを取る

shain テーブルから、入社日が 2016-01-01 から 2022-12-31 までの範囲に入らない社員を取り出してください。列は「name, hired_on」の順、入社日の古い順に並べてください。

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

未確認: IBM Db2

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

  • NOT BETWEEN で範囲の外を表せます。両端は範囲に含まれるので、外には入りません。
  • 日付にも BETWEEN を使えます。文字列で書いた日付は、比較する相手が日付列であれば日付として解釈されます。
● 起動中…

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

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 BETWEEN です。展開するときは OR になります。

なぜ

NOT BETWEEN a AND b は 列 < a OR 列 > b と同じです。ここを AND でつなぐと同時に成り立たないため 0 行になります。範囲の内側は AND、外側は OR、と覚えてください。

日付も同じように扱えます。'2016-01-01' のような文字列は、比較する相手が日付列であれば日付として解釈されます。日付は「新しいほど大きい」ので、範囲の指定も数値と同じ向きです。

よくある間違い

①外側の条件を AND でつないで 0 行になる ②境界を含むかどうかを取り違える。

根拠(一次情報)