今回は、Silverの「S3 開発/SQL - S3.1 SQL コマンド(DELETE文)」からの出題です。
※この例題は実際の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事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.