PREPARATION
受験対策

Silverの例題解説「開発/SQL - SQLコマンド(DELETE文)」

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

例題

3.97

テーブルxxxの主キー列はinteger型のid、テーブルyyyの主キー列はinteger型のidである。
xxxとyyyの両方に同じidの行がある場合に、それらの行をすべてxxxから削除したい。
例えば、select id from xxx が1と2と3、select id from yyy が2と3と4を返したとして、idが2の行と3の行をxxxから削除する。
これを実現するSQLはどれか。

  1. DELETE FROM xxx, yyy WHERE xxx.id = yyy.id;
  2. DELETE FROM xxx, yyy WHERE xxx.id IN (yyy.id);
  3. DELETE FROM xxx JOIN yyy USING xxx.id = yyy.id;
  4. DELETE FROM xxx WHERE id IN (SELECT id FROM yyy);
  5. DELETE FROM xxx WHERE EXISTS (SELECT id FROM yyy);

※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2019年3月28日

解答と解説

DELETE文の基本的な形式は、
DELETE FROM テーブル名 WHERE 条件式
です。WHERE句の条件に合致した行のみが削除されますが、WHERE句を省略するとすべての行が削除されるので注意してください。
削除対象となる行を決定するために他のテーブルを参照したい場合もよくありますが、その場合も通常はWHERE句にその条件を記述します。
SELECT文とは違い、他のテーブルを参照したいからといって、FROM句に複数のテーブルを列挙することはできません。選択肢AやBはFROM句に複数のテーブルがあるため構文エラーになりますが、このような記述が許されるとしたら、どちらのテーブルから行を削除すれば良いのかわかりませんよね。また、選択肢CのようなJOINを使ったテーブル結合もできません。
WHERE句で他のテーブルを参照する場合、よく使われるのがINとEXISTSです。
INは
列名 IN (値リスト)
の形式で指定しますが、値リストとして、列を1つだけSELECTするSELECT文を書くと、そこで返される値が展開されたリストになります。つまり、選択肢DのWHERE句は
WHERE id IN (2, 3, 4)
のように展開されて実行されます。これは期待する結果が得られる正しい選択肢です。
選択肢Eは構文エラーにはならずに実行されますが、テーブルxxxのid列が参照されていません。このため、xxxのどの行に対しても、
EXISTS (SELECT id FROM yyy)
の部分は真となり、テーブルxxxのすべての行が削除されます。例えば
EXISTS (SELECT * FROM yyy WHERE xxx.id = yyy.id)
のように記述すれば期待する結果が得られます。
従って正解はDです。


なお、PostgreSQLのDELETE文ではUSING句で参照先のテーブルを指定してテーブル結合することができます。例えば、
DELETE FROM xxx USING yyy WHERE xxx.id = yyy.id;
としても、期待する結果を得ることができます。

今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。

※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。

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

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

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

サンプル問題/例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

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

LPI-Japan
Platinum Sponsors