HOME > 受験対策 > サンプル問題/例題解説 > Silverの例題解説「開発/SQL」 > SQLコマンド(スキーマ)

Silverの例題解説「開発/SQL - SQLコマンド(スキーマ)」

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

例題

ユーザfooが以下のコマンドを順次実行した。最後のSELECT文が返す結果として正しいものを1つ選びなさい。なお、各CREATE TABLEやINSERTはエラーにならず、正常に実行されたものとする。

CREATE TABLE public.sample(val TEXT);
INSERT INTO public.sample(val) VALUES(‘This is public’);
CREATE TABLE foo.sample(val TEXT);
INSERT INTO foo.sample(val) VALUES(‘This is foo’);
CREATE TABLE bar.sample(val TEXR);
INSERT INTO bar.sample(val) VALUES(‘This is bar’);
SET search_path TO “$user”,bar,public;
SELECT * from sample;

  1. A. This is foo, This is bar, This is public の3行が返される。
  2. B. This is bar, This is public の2行が返される。
  3. C. This is bar の1行だけが返される。
  4. D. This is foo の1行だけが返される。
  5. E. 上記のいずれでもない。

※この例題は実際のOSS-DB技術者認定試験とは異なります。

解答と解説

PostgreSQLではテーブルをはじめ、ほとんどのオブジェクトは何らかのスキーマに所属しています。オブジェクト名の前にスキーマ名とピリオドを付けて明示的にスキーマを指定することもできますが、スキーマ名を省略した場合は、スキーマ検索パスを利用してオブジェクトを検索し、そこで見つかったオブジェクトを参照します。

スキーマ検索パスは
SHOW search_path;
とすることで調べられますが、デフォルトでは”$user”,publicとなっており、ユーザ名と同じスキーマ名が再優先、次いでpublicという順になっています。search_pathは例題にあるように、SETを使って変更することができます。この例では、”$user”,bar,publicに設定しましたが、ユーザ名がfooなので、スキーマ検索パスはfoo,bar,publicとなります。

sampleという名前のテーブルは、foo, bar, public いずれのスキーマにもありますが、スキーマ名を省略した場合は、最も優先度の高いfooスキーマのテーブルが参照され、他のテーブルは参照されません。つまり、
SELECT * FROM foo.sample;
を実行したのと同じことになります。

従って、正解はDです。

  • 今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
  • 採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
  • ご質問・ご意見はこちら
  • ※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。

ページトップへ