PREPARATION
受験対策

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

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

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

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

3.20

PostgreSQLで使われるデータ型について誤っているものを2つ選びなさい。

  1. VARCHAR型は、その最大長をバイト数で指定する。
  2. INTEGER型は4バイトなので、2の31乗より大きな数を格納できない。
  3. DATE型は、日付だけを格納しており、時刻の情報は入っていない。
  4. NUMERIC型は十進数で整数、小数のいずれも扱うことができる。
  5. データ型としての論理値型がないので、論理値を扱うには、整数型の列に1と0を入れる、あるいは文字列型の列にTとF、あるいはYとNを入れる、などの回避策を使う必要がある。

S3.3 トランザクションの概念

3.19

2つのクライアント(AとBとします)が同じテーブルTを更新するためにロックを取得しようとしています。
以下の記述から正しいものを2つ選択しなさい。

  1. クライアントAは行Xを更新するために行ロックを取得した。
    クライアントBも同じ行Xを更新したいが、行ロックを取得できないのでクライアントAの処理が終わるまで待たされる。

  2. クライアントAは行Xを更新するために行ロックを取得した。
    クライアントBはこれと異なる行Yを更新したいが、YがたまたまXと同じデータブロックにあったので、行ロックは取得できず、クライアントAの処理が終わるまで待たされた。log_connections を on にすることで、クライアントからサーバへの接続試行がログに出力される。
  3. クライアントAはテーブルTの50%の行を更新するために、それらの行のロックを取得したところ、ロックエスカレーションが発生して自動的にテーブルロックに移行した。
    このためクライアントBは同じテーブルTのどの行も更新できなくなった。
  4. クライアントAはテーブルTのすべての行を独占的に更新するため
         LOCK TABLE T;
    により、ACCESS EXCLUSIVEモードでのロックを取得した。
    このロックが解放されるまで、クライアントBはテーブルTを更新できないが、SELECTだけなら実行できる。
  5.  クライアントAはテーブルTの行Xを更新するためにロックを取得した。
    クライアントBは同じテーブルTのテーブルロックを取得するために
         LOCK TABLE T;
    を実行したが、これはAが取得した行ロックが解放されるまで待たされる。

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

3.18

次のようなテーブルがある。

select * from test;

col1   | col2
------ + ------
1      |   2
1      |   3
2      |   4
2      |   4
2      |   5
3      |   4
(6 行)

ここで、以下のSELECT文を順次実行した。

SELECT DISTINCT col1 FROM test;
SELECT DISTINCT col2 FROM test;
SELECT DISTINCT col1, col2 FROM test;

それぞれが返す行数の組み合わせとして適切なものを選びなさい。


  1. 6, 6, 6
  2. 3, 5, 6
  3. 3, 4, 5
  4. 3, 4, 4
  5. 3, 4, 3

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

3.17

今日の日付を調べたい。最も適切な方法を1つ選択せよ。

  1. SELECT now;
  2. SELECT current_date;
  3. SELECT sysdate; 

  4. SELECT date();

  5. SELECT today();

S3.1 SQL コマンド

3.16

psqlでデータベースに接続中だが、1日が何秒なのかを計算したい。
最も適切な方法を1つ選びなさい。

  1. compute 60 * 60 * 24;
  2. calculate 60 * 60 * 24;
  3. select 60 * 60 * 24;
  4. select 60 * 60 * 24 from dual;
  5.  convert(1 day, second);

S3.3 トランザクションの概念

3.15

あるクライアントで次の一連のSQLを実行する。

BEGIN;
UPDATE table1 SET val1 = 100 WHERE id1 = 1;
UPDATE table1 SET val1 = 200 WHERE id1 = 2;
UPDATE table2 SET val2 = 300 WHERE id2 = 3;
COMMIT;

別のクライアントから、これとほぼ同時に実行したときに、デッドロックが発生する可能性のあるトランザクションはどれか。A~Eの選択肢から2つ選択せよ。

  1. BEGIN;
    INSERT INTO table2 (id2, val2) VALUES (4, 40);
    UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
    COMMIT;
  2. BEGIN;
    UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
    UPDATE table2 SET val2 = 3000 WHERE id2 = 3;
    COMMIT;
  3. BEGIN;
    UPDATE table2 SET val2 = 3000 WHERE id2 = 3;
    UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
    COMMIT;
  4. BEGIN;
    UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
    UPDATE table1 SET val1 = 2000 WHERE id1 = 2;
    COMMIT;
  5. BEGIN;
    UPDATE table1 SET val1 = 2000 WHERE id1 = 2;
    DELETE FROM table1 WHERE id1 = 1;
    COMMIT;

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

3.14

次の SQL 文のうち、エラーにならないものを2つ選びなさい。

  1.  SELECT current_date();
  2. SELECT current_time();
  3. SELECT current_time(2);
  4. SELECT current_timestamp();
  5. SELECT now();

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

3.13

UNION 演算子を使った次の SELECT 文について正しいものをすべて選びなさい。

SELECT * FROM foo UNION SELECT * FROM bar ORDER BY 1;

  1. 返される行の数は、テーブル foo の行数とテーブル bar の行数の合計になる。
  2. テーブル foo のデータがランダムな順番で出力され、続いてテーブル bar のデータが第1カラムのデータに従って昇順にソートされて出力される。
  3. テーブル foo の列の数とテーブル bar の列の数が異なるとエラーになる。
  4. テーブル foo の列のデータ型とテーブル bar の列のデータ型が完全に一致しないとエラーになる。
  5. テーブル foo の列の名前とテーブル bar の列の名前が一致しないとエラーになる。

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

3.12

以下の一連の SQL 文により、テーブルを定義し、データを挿入した。

CREATE TABLE sample (id INTEGER PRIMARY KEY,
val1 VARCHAR(10) DEFAULT 'abc' NOT NULL,
val2 VARCHAR(10) UNIQUE);
INSERT INTO sample VALUES (1, 'aaa', 'xxx');
INSERT INTO sample VALUES (2, 'bbb', NULL);
INSERT INTO sample VALUES (3, 'ccc', 'zzz');

続いて実行したときにエラーとなる SQL 文をすべて選びなさい。

  1. INSERT INTO sample VALUES (4, NULL, 'abc');
  2. INSERT INTO sample (id) VALUES (5);
  3. INSERT INTO sample (val2) VALUES ('def');
  4. UPDATE sample SET val2 = 'zzz' WHERE id = 1;
  5. UPDATE sample SET val1 = 'ccc' WHERE id = 2;

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

3.11

以下のような行を持つテーブル test1 がある。

=> select * from test1;
id | num1 | num2
--- + ------- + ------
1 | 1 | 10
2 | 1 | 30
3 | 2 | 20
4 | 2 | 50
5 | 3 | 40
(5 行)
このテーブルに対して次の問い合わせをする。

SELECT id FROM test1 ORDER BY num1, num2 DESC LIMIT 1 OFFSET 2;

結果の値として適切なものはどれか。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

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

3.10

次の SQL 文でテーブルを作成し、データを挿入した。

CREATE TABLE sample (id INTEGER, name VARCHAR(10), val INTEGER,
UNIQUE(id), CHECK(val >= 0));
INSERT INTO sample VALUES (1, 'aaa', 10), (2, 'bbb', 20);

ここで、次の SQL 文を順次実行した時、エラーになるものをすべて選びなさい。

  1. INSERT INTO sample VALUES (-1, 'zzz', 100);
  2. INSERT INTO sample VALUES (3, 'ccc', -100);
  3. UPDATE sample SET id = 1 WHERE id = 2;
  4. DELETE FROM sample WHERE id = 3;
  5. INSERT INTO sample (id, val) VALUES (3, 30);

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

3.09

以下の SQL 文でテーブルを作成し、多数の行を挿入した。

CREATE TABLE table1 (id INTEGER, name VARCHAR(20), sales INTEGER);

ここで、id が 30 以下のすべてのデータについて、sales の値を NULL にしたい。
正しい SQL 文を選びなさい。

  1. SELECT sales = NULL FROM table1 WHERE id <= 30;
  2. UPDATE sales = NULL FROM table1 WHERE id < 31;
  3. DELETE sales FROM table1 WHERE id <= 30;
  4. UPDATE table1 SET sales = NULL WHERE id < 31;

  5. UPDATE table1.sales = NULL WHERE id <= 30;


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

3.08

次の一連の SQL 文によりテーブルを作成し、データを挿入した。

CREATE TABLE sample1 (val INTEGER);
INSERT INTO sample1 (val) VALUES (1), (2), (3), (4), (NULL);

ここで、次の SELECT 文を実行した。

SELECT count(*), count(val), avg(val) FROM sample1;

返される値の組み合わせとして適切なのはどれか。

  1. 5, 5, 2
  2. 5, 4, 2
  3. 5, 4, 2.5
  4. 4, 4, 2.5
  5. 5, 4, NULL

S3.3 トランザクションの概念

3.07

次の一連のSQL文を実行した。

CREATE TABLE t1 (val VARCHAR(10));
INSERT INTO t1 VALUES ('aaa'), ('bbb');
BEGIN;
INSERT INTO t1 VALUES ('ccc');
CREATE TABLE t2 (val VARCHAR(10));
INSERT INTO t2 VALUES ('ddd');
ROLLBACK;
INSERT INTO t1 VALUES ('eee'), ('fff');
ROLLBACK;

ここで、次のSELECT文を実行したとき、返される行数はいくつか。

SELECT * FROM t1;


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

3.06

次のSQL文で表を作成した後、多数の行をINSERTした。

CREATE TABLE foo (id INTEGER, val VARCHAR(50));

この表で val 列の2文字目と3文字目がいずれも A である行をすべて検索したい。
誤っているものを1つ選びなさい。

  1. SELECT * FROM foo WHERE val LIKE '_AA%';
  2. SELECT * FROM foo WHERE val ~ '^.AA';
  3. SELECT * FROM foo WHERE substring(val, 2, 2) = 'AA';
  4. SELECT * FROM foo WHERE substring(val from 2 for 2) = 'AA';

  5. SELECT * FROM foo WHERE position('AA' in val) = 2;


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

3.05

次のSQL文で表を作成した後、多数の行をINSERTした。

CREATE TABLE foo (id INTEGER, val VARCHAR(50));

この表で val 列の値が A で始まる行をすべて検索したい。
適切な SELECT 文を2つ選択しなさい。

  1. SELECT * FROM foo WHERE val = 'A%';

  2. SELECT * FROM foo WHERE val LIKE 'A%';

  3. SELECT * FROM foo WHERE val ~ 'A';

  4. SELECT * FROM foo WHERE val ~ '^A';

  5. SELECT * FROM foo WHERE val SIMILAR TO '^A';


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

3.04

次のSQL文を順次実行した。

CREATE TABLE dept (did INTEGER PRIMARY KEY, dname VARCHAR(50));
CREATE TABLE emp (eid INTEGER PRIMARY KEY, did INTEGER REFERENCES
dept(did), ename VARCHAR(50));
INSERT INTO dept VALUES (10, 'HR'), (20, 'FIN');
INSERT INTO emp VALUES (1, 10, 'Mary'), (2, 20, 'John');

続いて実行したときにエラーにならないSQL文を2つ選びなさい。

  1. INSERT INTO dept VALUES (20, 'Sales');
  2. INSERT INTO emp VALUES (3, 20, 'Mike');
  3. UPDATE dept SET did = 20 WHERE dname = 'HR';
  4. UPDATE emp SET did = 40 WHERE eid = 1;
  5. UPDATE emp SET eid = 4 WHERE ename = 'Mary';

S3.2 組み込み関数

3.02

以下のようなデータを持つテーブル emp がある。

id | firstname  |  lastname
-- + -----------+ -----------
1  | Sadaharu   | Oh
2  | Shigeo     | Nagashima
3  | Ichiro     | Suzuki

すべての行について firstname と lastname を連結して出力する適切な SQL 文を以下からすべて選びなさい。


  1. SELECT firstname, lastname FROM emp;
  2. SELECT firstname + lastname FROM emp;
  3. SELECT firstname . lastname FROM emp;
  4. SELECT firstname || lastname FROM emp;
  5. SELECT concat(firstname, lastname) FROM emp;

S3.1 SQL コマンド

3.01

以下のようなテーブル t1, t2 がある。

t1

num | name
----- + ------
1 | a
2 | b
3 | c
t2

id | value
----- + ------
1 | xxx
2 | yyy

ここで、以下の一連のSQL文を実行したとき、最後のSELECT文で返る行数はいくつか。

INSERT INTO t2 VALUES (3, 'zzz');
UPDATE t2 SET id=3 WHERE value='yyy';
SELECT * FROM t1 LEFT JOIN t2 ON t1.num=t2.id;

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

OSS-DBの受験対策

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

例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

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

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