今回は、Silverの「開発/SQL - SQLコマンド(UPDATE文)」からの出題です。
empテーブルの内容が更新されたので、dept_salテーブルの給与の合計額(sum_salary列)を更新したい。これを実現する適切なSQL文を選びなさい。なお、dept_salテーブルのdept_id, dept_nameには必要なデータが既に入っているものとします。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2019年2月26日
テーブルを更新するUPDATEの基本的な形式は、
UPDATE テーブル名 SET 列名 = (式 または sub-SELECT)
です。更新対象となる行を制限するため、この後に WHERE 句をつけることができます。また、PostgreSQLの拡張として、FROM句をつけてテーブルを結合し、更新後の値を指定する式あるいは更新対象の行を制限するWHEREで参照することもできます。では、個々の選択肢を調べてみましょう。
Aは正しいUPDATEです。カッコ内のSELECT文はempテーブルのdept_idがdept_salテーブルの更新対象行と同じ行についてsalaryの合計を求めています。
BはAと似ていますが、カッコの付け方が違います。カッコ内のSELECTはdept_idの値と無関係にempテーブルのsalaryの合計を求めてしまいます。WHERE句はUPDATEの対象となる行を制限するために使われるのですが、e.dept_idはSELECT文のempテーブルを参照するものとは見なされないため、エラーになります。
Cでは、カッコ内のSELECTはdept_idごとに分類したsalaryの合計値を返します。例えばdept_idが5種類あったとして、このSELECTはdept_salテーブルと紐付けられることなく、5行のデータを返します。sub-SELECTは更新対象の各行に対して1行しかデータを返してはいけない、という制約があるため、エラーになります。
UPDATEでsub-SELECTを使う場合、更新対象の各行に対して別々にSELECTが実行されるものとして、どうなるかを考えるとわかりやすいでしょう。
DとEはPostgreSQLの拡張のFROM句を使ったものですが、sumなどの集約関数はこの構文では使えないという制約があります。Eの += はCやJavaなど多くのプログラミング言語にある代入演算子ですが、SQLでは使用できませんので、やはりエラーになります。
実際に選択肢のUPDATEを試してみると、B、D、Eは構文エラー、Cは実行時エラーになります。
従って、正解はAです。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.