PREPARATION
受験対策

Silverの例題解説 - S3 開発/SQL(Ver.3.0)

このページではメルマガで紹介した例題のアーカイブを試験のレベルごとにまとめています。
是非、OSS-DBの学習にお役立てください。

修正等により、例題番号が連番ではない場合がございます。あらかじめご了承ください。

S3.1 SQL コマンド(ビュー)

3.80

ビュー(VIEW)に関する説明として適切なものを1つ選びなさい。

  1. 検索を高速化するため、ビューにインデックスを作成することができる。
  2. ビューから検索する方が、その元となるテーブルから検索するより高速である。
  3. CREATE OR REPLACE VIEWコマンドでビューの定義を変更するとき、ビューに列を追加することはできるが、減らすことはできない。
  4. ビューを定義するSELECT文のFROM句にはテーブルのみを記述することができ、ビューを含めることはできない。
  5. ビューとテーブルをJOINにより表結合することはできるが、ビューとビューを表結合することはできない。

S3.1 SQL コマンド(テーブル定義)

3.79

id列を主キーとするテーブルを作成する正しい方法を2つ選びなさい。

  1. CREATE TABLE test (PRIMARY KEY id INTEGER, value TEXT);
  2. CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT);
  3. CREATE TABLE test (id INTEGER, value TEXT, PRIMARY KEY=id);
  4. CREATE TABLE test (id INTEGER, value TEXT, PRIMARY KEY id);
  5.  CREATE TABLE test (id INTEGER, value TEXT, PRIMARY KEY (id));

S3.1 SQL コマンド(データ型)

3.78

PostgreSQLのデータ型の説明として適切なものを1つ選びなさい。

  1. INTEGERは10桁までの整数を扱うことができるので、NUMERIC(10)と宣言しても同じである。
  2. REALは6桁精度の小数を扱うことができるので、NUMERIC(10, 6)と宣言しても同じである。
  3. DOUBLE PRECISIONは15桁精度の小数を扱うことができるので、NUMERIC(10, 15)と宣言しても同じである。
  4. INTEGERの演算はNUMERICより高速なので、値が必ず整数になるなら、NUMERICではなくINTEGERを使うべきである。
  5. REAL型の0.1とNUMERIC型の0.1について同値比較(a=bという形式の比較)をしたとき、その結果がtrueになるとは期待できない。

S3.1 SQL コマンド(UPDATE文)

3.77

テーブル定義に関わらず、必ずエラーになる文を2つ選びなさい。

  1. DELETE FROM t1.table1 t2 WHERE a = b;
  2. DELETE table1 WHERE column1 = 100;
  3. DELETE FROM table1 t1, table2 t2 WHERE t1.a = t2.b;
  4. DELETE FROM table1;
  5. DELETE FROM table1 WHERE a IN (SELECT x FROM table2);

S3.1 SQL コマンド(UPDATE文)

3.76

以下の一連のSQL文でテーブルを作成し、データを挿入、更新した。
create table sample (id integer, vali integer, vals text);
insert into sample (id, vali, vals) values (1, null, 'a'), (2, 2, 'b'), (3, 3, 'c'), (4, 4, 'd'), (5, 5, null);
update sample set vali = vali -1;
update sample set vals = 'x' where vali <= 2;
update sample set vali = 10 where vals <> 'x';
select sum(vali) from sample;

最後のSELECT文が返す値は何か。


S3.1 SQL コマンド(INSERT文)

3.75

例えば、CREATE TABLE test(id INTEGER, vali INTEGER, vals TEXT);
として作成されたテーブルにデータを挿入するときに、
INSERT INTO test VALUES (1, 10, 'XXX');
INSERT INTO test(id, vali, vals) VALUES (1, 10, 'XXX');
の2つの方法があるが、一般的には2番目の方法が良い習慣であるとされる。その理由としてもっとも適切なものを2つ選びなさい。なお、PostgreSQL以外の一般的なリレーショナルデータベースにおけるSQLも考慮に入れて解答すること。

  1. 複数行のデータを挿入する場合、2番目の方法でないと正常に実行できない。
  2. 列のデータ型が変更された時、2番目の方法でないと正常に実行できない。
  3. テーブルに列が追加された時、2番目の方法でないと正常に実行できない。
  4. テーブルの列の順序が変更された時、2番目の方法でないと正常に実行できない。
  5. テーブルに制約が追加された時、2番目の方法でないと正常に実行できない。

S3.1 SQL コマンド(SELECT文)

3.74

次のSQL文でテーブルを作成し、10行のデータを挿入した。
CREATE TABLE test(id INTEGER PRIMARY KEY, val INTEGER);
ここで、次のSELECT文を実行したが、9行しか返されなかった。
SELECT * FROM test WHERE val >= 0 OR val < 0;
10行を挿入したはずなのに、合わせて9行しかないのはなぜか。以下の空欄に入る言葉を答えよ。

valの値が_____である行があるから。


S3.3 トランザクションの概念(トランザクション分離レベル)

3.73

PostgreSQLのトランザクション分離レベルの説明として、適切なものを2つ選びなさい。

  1. Read Uncommittedでは、他のトランザクションが更新した後、まだcommitしていないデータを読めてしまう。
  2. Read Committedでは、トランザクション内で同じSELECT文を2回続けて実行しても、異なる結果が返されることがある。
  3. Repeatable Readでは、トランザクション内で同じSELECT文を2回続けて実行したら、必ず同じ結果が返される。
  4. Serializableは読み取りトランザクション専用の分離レベルである。

S3.3 トランザクションの概念(トランザクションの構文)

3.72

以下の一連のSQL文を実行した後、テーブルtestには何行のデータがあるか。行数を答えよ。

CREATE TABLE test (id INTEGER, val TEXT);
INSERT INTO test(id, val) VALUES (1, 'aaa'), (2, 'bbb');
BEGIN;
INSERT INTO test(id, val) VALUES (3, 'ccc'), (4, 'ddd'), (5, 'eee');
SAVEPOINT S1;
UPDATE test SET val = 'CCC' WHERE id = 3;
SAVEPOINT S2;
DELETE FROM test WHERE id IN (2, 4);
ROLLBACK TO S2;
INSERT INTO test(id, val) VALUES(6, 'fff'), (7, 'ggg');
COMMIT;


S3.2 組み込み関数(時間関数)

3.71

現在時刻のうち、分の部分を取り出す(今が10時25分40秒だとして、25を返す)関数記述として、適切なものを2つ選びなさい。

  1. minute(now())
  2. to_char(current_timestamp, ‘MI’)
  3. extract(minute from current_time)
  4. current_minute()
  5. date_part(minute, now())

S3.2 組み込み関数(文字列演算子、述語)

3.70

テーブルtblの列str1とstr2はいずれもTEXT型である。str1の先頭の1文字とstr2を結合する、例えばstr1が’ABC’、str2が’XYZ’なら’AXYZ’という文字列を取得するには、次のSQLの空欄に何を入れれば良いか。

SELECT ________ FROM tbl;

適切なものを2つ選びなさい。

  1. substring(str1,1,1) + str2
  2. substring(str1,1) || str2
  3. concat(substring(str1 from 1 for 1), str2)
  4. substring(str1 from 1) + str2
  5. concat(substring(str1 for 1), str2)

S3.1 SQL コマンド(テーブル定義)

3.69

人の名前が格納されたテーブルnamesから、姓をselectしたところ、以下のように大文字・小文字の表記が統一されていないデータが混在していた。

=> select last from names;

last
---------
smith
RICE
Johnson

Johnsonのように、先頭は大文字、他の文字を小文字にするにはどうしたら良いか。
以下のSELECT文の空欄2箇所に入る関数名を答えよ。

SELECT _____(substring(last, 1, 1)) || _____(substring(last, 2)) FROM names;


S3.2 組み込み関数(算術関数、演算子)

3.68

10を3で割り算した時の剰余(余り、この場合は1になる)を求めるものとして、適切なものをすべて選びなさい。

  1. select 10 mod 3;
  2. select mod(10, 3);
  3. select 10 % 3;
  4. select %(10, 3);

S3.2 組み込み関数(集約関数)

3.67

以下の一連のSQL文を実行した。

CREATE TABLE test (x INTEGER);
INSERT INTO test(x) VALUES (null), (1), (2), (3);
SELECT sum(2) FROM test;

最後のSELECT文が返す値は何か。数値を答えよ。


S3.1 SQL コマンド(関数定義、PL/pgSQL)

3.66

テーブルbankと関数tf1を定義した。

CREATE TABLE bank (accountno integer primary key, balance numeric);
CREATE FUNCTION tf1 (accountno integer, debit numeric) RETURNS numeric AS $$
UPDATE bank
SET balance = balance - debit
WHERE accountno = tf1.accountno
RETURNING balance;
$$ LANGUAGE SQL;

関数tf1について、以下の説明から適切なものを2つ選びなさい。

  1. テーブルbankの列balanceの値を変更し、変更前のbalanceの値を返す。
  2. テーブルbankの列balanceの値を変更し、変更後のbalanceの値を返す。
  3. 指定したaccountnoがテーブルbankに存在しない場合はエラーが発生する。
  4. 指定したaccountnoがテーブルbankに存在しない場合は0(ゼロ)を返す。
  5. 指定したaccountnoがテーブルbankに存在しない場合はNULLを返す。

S3.1 SQL コマンド(スキーマ)

3.65

ユーザ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 TEXT);
INSERT INTO bar.sample(val) VALUES(‘This is bar’);
SET search_path TO “$user”,bar,public;
SELECT * from sample;

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

[開発/SQL - SQLコマンド(シーケンス)] から

3.64

次のコマンドで新しいシーケンスを作成した。

CREATE SEQUENCE seq_test MINVALUE 1;

ここで、次のSELECT文を実行したら何が起きるか。

SELECT * FROM seq_test;

適切なものを1つ選びなさい。

  1. seq_testはテーブルではなくてシーケンスなので、エラーとなる。
  2. 既存のテーブルseq_testが存在すればその内容が表示され、なければテーブルが見つからないというエラーになる。
  3. シーケンスseq_testの現在値である1が返される。
  4. シーケンスseq_testに関する様々な属性値が返される。

[開発/SQL - SQLコマンド(ビュー)] から

3.63

INSERT INTO foo (n) VALUES (3);
というINSERT文が実行された時に、テーブルfooではなく、テーブルbarにINSERTされる、つまり内部的に
INSERT INTO bar (n) VALUES (3);
が実行されるようにしたい。
CREATE RULE foobar AS ON INSERT TO foo DO INSTEAD INSERT INTO bar (n) VALUES (___.n);
というルールを作成することで、これが実現できるが、下線部に入る文字列は何か。


[開発/SQL - SQLコマンド(インデックス)] から

3.61

インデックスについて間違った説明を1つ選びなさい。

  1. 列にPRIMARY KEYの制約をつけると、自動的にインデックスが作成される。
  2. 列にUNIQUEの制約をつけると、自動的にインデックスが作成される。
  3. 列にNOT NULLの制約をつけると、自動的にインデックスが作成される。
  4. 列にUNIQUEの制約がなくても、インデックスをUNIQUEとして作成することができる。
  5. デフォルトではB-treeインデックスが作成される。

企業の基幹システムや業務システム、AIなどの
新領域での「PostgreSQL」の採用が拡大している中、
昇格・昇給・就職・転職に必ず役立つ認定です

OSS-DBの受験対策

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

例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

OSS-DBやPostgreSQLの知識、技術を得るために役立つ情報の紹介やコラムを公開しています。

応募者全員プレゼント!
オープンソース データベース標準教科書 -PostgreSQL-