コマンド道場
UPDATE難易度 ★★★☆☆

開発部の社員を 5% 昇給させる

開発部(busho_name が「開発」)に所属する社員の給与を 5% 引き上げてください。下位部署である基盤部の社員や、他の部署の社員の給与は変更しないでください。

主要 7 製品で通用 そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database / IBM Db2

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

  • UPDATE も WHERE を書き忘れると全行が変わります。先に同じ条件で SELECT して確かめてください。
  • 他の表の値を使って更新するときは、副問い合わせで書けばそのまま持ち運べます。UPDATE ... FROM(PostgreSQL・SQL Server)や UPDATE ... JOIN(MySQL)は製品ごとに書き方が違います。
● 起動中…

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

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

解説

結論

UPDATE の WHERE で対象を絞ります。副問い合わせで部署名から busho_id を引けば、ID をハードコードせずに済みます。

★端数はどうなるか(このデータで確かめられること): salary 列は numeric(10,0)、つまり小数点以下の桁を持たない型です。PostgreSQL は値をこの型に格納するときに自動で四捨五入します。小林の給与 445050 を 5% 増やすと 467302.5 ですが、格納された値は 467303 になります。したがって round() を明示的に書いても書かなくても結果は同じです。⚠️ これは列の型が numeric(10,0) だから成り立つ話です。numeric(10,2) や double precision の列なら端数が残るので、意図した丸めを保証したいなら round() を明示するのが安全です。

よくある間違い

①WHERE を書き忘れて全社員を昇給させてしまう。UPDATE / DELETE は WHERE の確認を習慣にしましょう。②このデータでは開発部の下に基盤部があります。parent_busho_id をたどって下位部署まで含めてしまうと、設問の指示(基盤部は変更しない)に反します。階層をたどる書き方は再帰 CTE のトピックで扱います。

根拠(一次情報)