PREPARATION
受験対策

Silverの例題解説
「S3.1 SQL コマンド(UPDATE文)」

今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド(UPDATE文)」からの出題です。

例題

3.96

社員の所属部署、給与を記録したempテーブルと、部署ごとの社員の給与の合計額を記録したdept_salテーブルがある。

empテーブルの内容が更新されたので、dept_salテーブルの給与の合計額(sum_salary列)を更新したい。これを実現する適切なSQL文を選びなさい。なお、dept_salテーブルのdept_id, dept_nameには必要なデータが既に入っているものとします。

  1. UPDATE dept_sal d SET sum_salary = (SELECT sum(salary) FROM emp e WHERE d.dept_id = e.dept_id);
  2. UPDATE dept_sal d SET sum_salary = (SELECT sum(salary) FROM emp e) WHERE d.dept_id = e.dept_id;
  3. UPDATE dept_sal d SET sum_salary = (SELECT sum(salary) FROM emp e GROUP BY dept_id);
  4. UPDATE dept_sal d SET sum_salary = sum(salary) FROM emp e WHERE d.dept_id = e.dept_id;
  5. UPDATE dept_sal d SET sum_salary += salary FROM emp e WHERE d.dept_id = e.dept_id; 

※この例題は実際の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事務局ではお応えできませんのでご了解ください。

企業の基幹システムや業務システムでの
OSS-DBの採用がますます拡大している中、
昇格・昇給・就職・転職に必ず役立つ認定資格になります

OSS-DBの受験対策について

受験の学習をサポートする情報や対策に役立つ情報をご紹介

サンプル問題/例題解説

例題 のアーカイブを試験ごとにまとめています。OSS-DB技術者認定試験の学習にお役立てください

学習教材・教育機関のご紹介

OSS-DB認定教材や教育機関について詳しくご説明いたします。

無料技術解説セミナー

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

OSS-DB道場

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

LPI-Japan
Platinum Sponsors