PREPARATION
受験対策

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

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

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

S3.1 SQL コマンド(パーティション)

3.100

テーブルのパーティショニングを使うことで得られる可能性のある利点として、適切なものをすべて選びなさい。

  1. データが占めるディスク容量を削減する。
  2. 問い合わせの性能を大幅に向上させる。
  3. 頻繁にアクセスする行と、そうでない行を、別のディスク領域に配置する。
  4. 頻繁にアクセスする列と、そうでない列を、別のディスク領域に配置する。
  5. DELETEの代わりにDROP TABLEを実行して、大量データの一括削除を高速化する。

S3.1 SQL コマンド(テーブルスペース)

3.99

テーブルスペース(tablespace)の使用方法として正しいものを3つ選びなさい。

  1. CREATE DATABASE で作成する新しいデータベースを、デフォルトとは異なるテーブルスペースに配置する。
  2. CREATE SCHEMA で作成する新しいスキーマを、デフォルトとは異なるテーブルスペースに配置する。
  3. CREATE TABLE で作成する新しいテーブルを、デフォルトとは異なるテーブルスペースに配置する。
  4. CREATE VIEW で作成する新しいビューを、元となるテーブルとは異なるテーブルスペースに配置する。
  5. CREATE INDEX で作成する新しいインデックスを、元となるテーブルとは異なるテーブルスペースに配置する。

S3.1 SQL コマンド(マテリアライズド・ビュー)

3.98

マテリアライズド・ビューと通常のビューに関する説明として、正しいものを2つ選びなさい。

  1. どちらも CREATE VIEW コマンドで作成する。
  2. ビューの定義が同じなら、一般的に、マテリアライズド・ビューからの検索の方が高速である。
  3. ビューの定義が同じなら、どちらからSELECTしても、必ず同じ結果が返される。
  4. マテリアライズド・ビューは、それに含まれるデータの量に従ってディスク容量を必要とするが、通常のビューはディスク容量を必要としない。
  5. ビューを定義する問い合わせを変更する場合、通常のビューは CREATE OR REPLACE VIEW コマンドを使うのに対し、マテリアライズド・ビューでは REFRESH MATERIALIZED VIEW という特殊なコマンドを使用する。

S3.1 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);

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; 

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

3.95

以下のSQLを順次実行した。

CREATE TABLE foo (id INTEGER PRIMARY KEY, val VARCHAR);
INSERT INTO foo (id, val) VALUES (1, 'a'), (2, 'b'), (3, 'c');
INSERT INTO foo (id, val) VALUES (3, 'x'), (4, 'y'), (5, 'z');
このとき、テーブルfooには何行のデータが含まれるか。


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

3.94

次のSELECT文がエラーにならずに実行できるものとする。
SELECT * FROM x, y WHERE x.a = y.a;
これと必ず同じ行を返すSELECT文をすべて選びなさい。

  1. SELECT * FROM x JOIN y ON a;
  2. SELECT * FROM x JOIN y USING a;
  3. SELECT * FROM x JOIN y USING (a);
  4. SELECT * FROM x NATURAL JOIN y;
  5. SELECT * FROM x NATURAL JOIN y ON a;

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

3.93

以下の一連のSQL文を実行した。
create table sample (id integer primary key, val varchar(10));
insert into sample (id, val) values (1, 'ABC'), (2, 'abc'), (3, 'ABCDE'), (4, 'abcde'), (5, null);
select count(*) from sample where val <> 'abc';
最後のSELECT文がcountとして返す値は何か。値を答えよ。


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

3.92

テーブルsampleにおいて、列idは整数型の主キー、列valはtext型である。
あるトランザクションから
SELECT * FROM sample WHERE id = 1 FOR UPDATE;
を実行した。
別のトランザクションから実行したときにロック待ちになるSQL文をすべて選びなさい。

  1. SELECT * FROM sample;
  2. SELECT * FROM sample WHERE id = 1 FOR UPDATE;
  3. UPDATE sample SET val = 'x';
  4. UPDATE sample SET val = 'x' WHERE id = 2;
  5. LOCK TABLE sample;

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

3.91

トランザクション内でLOCK TABLE sample;
を実行し、テーブルsampleの排他ロックを取得した。このロックが解放されるのはどういう場合か。正しいものを3つ選びなさい。

  1. COMMIT; を実行したとき。
  2. RELEASE TABLE sample; を実行したとき。
  3. ROLLBACK; を実行したとき。
  4. UNLOCK TABLE sample; を実行したとき。
  5. Ctrl+Dあるいは \q を入力して psql のセッションを終了したとき。

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

3.90

反復不能読み取り(nonrepeatable read)の説明として適切なものを2つ選びなさい。

  1. 他のトランザクションがまだコミットしていないデータを読み取る。
  2. 同じ問い合わせを繰り返し実行したときに、返される行の数が前と異なる。
  3. 同じデータを繰り返し読んだときに、データの内容が前と異なる。
  4. トランザクション分離レベルをシリアライザブル(serializable)にしたら発生しない。
  5. トランザクション分離レベルをリードコミッティド(read committed)にしたら発生しない。

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

3.89

トランザクションの開始、終了に使用される文として間違っているものを1つ選びなさい。

  1. BEGIN
  2. COMMIT
  3. ROLLBACK
  4. START TRANSACTION
  5. STOP TRANSACTION

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

3.88

テーブルxの列aとbはいずれも文字列型である。aとbを連結した文字列を返すSELECT文はどれか。1つ選びなさい。

  1. SELECT a + b FROM x;
  2. SELECT a b FROM x;
  3. SELECT a || b FROM x;
  4. SELECT a, b FROM x;
  5. SELECT a & b FROM x;

S3.2 組み込み関数(文字列関数)

3.87

テーブルxxの文字列型の列aaの3文字目から6文字目までの4文字を取得するSQL文として適切なものをすべて選びなさい。

  1. SELECT substring(aa, 3, 4) FROM xx;
  2. SELECT substring(aa, 3, 6) FROM xx;
  3. SELECT substring(aa from 3 to 6) FROM xx;
  4. SELECT substring(aa from 3 for 4) FROM xx;
  5. SELECT substring(aa, 4 from 3) FROM xx;

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

3.86

テーブルfooには数値型の列barがある。barの絶対値を求めるSELECT文として正しいものを2つ選びなさい。

  1. SELECT @bar FROM foo;
  2. SELECT |bar| FROM foo;
  3. SELECT )bar( FROM foo;
  4. SELECT /bar/ FROM foo;
  5. SELECT abs(bar) FROM foo;

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

3.85

テーブルtestには整数型の列aがある。
SELECT count(*), count(a) FROM test;
を実行したところ、count(*)とcount(a)の値が異なっていた。この理由の説明として適切なものを1つ選びなさい。

  1. count(*)はテーブルtestの行数、count(a)はa列の値の合計値なので、異なる値が返るのが普通である。
  2. a列には値が重複するデータがあるため、count(a)はcount(*)より小さくなる。
  3. count(a)はa列の値が0の行が無視されるため、count(*)より小さくなる。
  4. count(a)はa列の値がNULLの行が無視されるため、count(*)より小さくなる。
  5. データベースシステムの異常が考えられるので、システム管理者に連絡する。

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

3.84

次のPL/pgSQLの関数は、テーブルtestのsome_columnの値が引数valより大きい行の数を返すものである。空欄( _____ )に入るキーワードは何か。

CREATE FUNCTION count_test(val INTEGER) RETURNS INTEGER AS
DECLARE
rtest RECORD;
cnt INTEGER;
BEGIN
cnt := 0;
FOR rtest IN SELECT * FROM test WHERE some_column > val LOOP
cnt := cnt + 1;
( ________ );
RETURN cnt;
END;
LANGUAGE plpgsql;


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

3.83

DROP SCHEMA foo の結果として適切なものを1つ選びなさい。

  1. PostgreSQLには DROP SCHEMA コマンドが存在しないのでエラーになる。スキーマを削除するにはDROP USER foo を実行する。
  2. ユーザ foo が存在していたらエラーになる。
  3. スキーマ foo 内にオブジェクトが存在していたら、エラーになる。
  4. スキーマ foo 内にオブジェクトが存在していたら、自動的に publicに移動される。
  5. スキーマ foo と、その中に存在するオブジェクトすべてが削除される。

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

3.82

以下のSQL文を実行した。

CREATE TABLE test (id SERIAL, val TEXT);

これについて正しい説明をすべて選びなさい。

  1. id列には自動的にNOT NULL制約が付与される。
  2. id列には自動的にUNIQUE制約が付与される。
  3. id列には自動的にインデックスが作成される。
  4. id列の値をUPDATE文で更新することはできない。
  5. INSERT文でid列の値をNULLと指定するとエラーになる。

S3.1 SQL コマンド(トリガー)

3.81

あるテーブルに、文レベルのBEFORE INSERTトリガーを2つ定義した。この場合の動作について正しいものを選びなさい。

  1. 1つ目のトリガーのみが実行される。
  2. 2つ目のトリガーのみが実行される。
  3. 1つ目のトリガー、2つ目のトリガーの順で両方が実行される。
  4. 2つ目のトリガー、1つ目のトリガーの順で両方が実行される。
  5. 両方のトリガーが実行されるが、どちらが先かは場合による。

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

OSS-DBの受験対策

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

例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

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

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