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

AND と OR を混ぜるときの括弧

開発部または営業部に所属する在籍社員のうち、給与が 450000 円以上の人を取り出してください。列は「名前, 給与」の順、給与の高い順に並べ、同額のときは社員番号(shain_id)の小さい順にしてください。部署は busho テーブルの busho_name で判断してください(下位部署である基盤部・マーケ部は含めません)。

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

未確認: IBM Db2

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

  • AND は OR より強く結びつきます。「A または B」かつ「C」を表したいときは、OR を括弧で囲みます。
  • IN は OR の連なりと同じ意味になります。同じ列を何度も比べるときは IN の方が読みやすくなります。
● 起動中…

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

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

解説

結論

AND は OR より強く結びつきます。「A または B」に別の条件をかけたいときは、必ず括弧で囲むか IN を使います。

なぜ

WHERE b.busho_name = '開発' OR b.busho_name = '営業' AND salary >= 450000 は、SQL としては 「開発 である」 または 「営業 かつ 450000 以上」 と読まれます。つまり開発部だけ給与の条件がかからず、条件を書いたつもりが効いていない状態になります。画面に出る行数は増えるので気づきやすそうに見えますが、条件が複数あると見落とします。

IN を使うと、値の並びが 1 つの条件としてまとまるため、この事故が起きません。読みやすさの面でも OR の連なりより優れています。

よくある間違い

①括弧を書かずに AND と OR を混ぜる。②在籍条件を忘れる。③「開発部」と言われて下位部署の基盤部まで含めてしまう。部署の階層をたどるかどうかは設問が指示している内容で判断します。

根拠(一次情報)