コマンド道場
スカラー副問い合わせ難易度 ★★★☆☆

最高額の社員を取る

shain テーブルから、給与が最も高い社員を取り出してください。列は「name, salary」の順にしてください。

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

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

  • 最大値そのものを副問い合わせで求め、その値と等しい行を探します。
  • ⚠️ WHERE に集約関数を直接書くことはできません。WHERE は集約より先に評価されるためです。
● 起動中…

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

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

解説

結論

「最大の行」は、最大値を副問い合わせで求めてから比較します。

なぜ

WHERE は集約より先に評価されるため、WHERE salary = max(salary) と書くとエラーになります。副問い合わせにすれば、外側から見れば単なる 1 つの値なので比較できます。

この書き方には、最大値が同じ社員が複数いれば全員返るという性質があります。ORDER BY ... LIMIT 1 で書くと 1 人しか返らないため、同率をどう扱いたいかで選び分けてください。

よくある間違い

①WHERE に集約関数を直接書く ②副問い合わせ側に余計な条件を入れて母集団がずれる。

根拠(一次情報)