PREPARATION
受験対策

Silverの例題解説「開発/SQL」(Ver.2.0)

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

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

[開発/SQL - データ型] から

3.20

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

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

[開発/SQL - トランザクション] から

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が取得した行ロックが解放されるまで待たされる。

[開発/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

[開発/SQL - 時間関数] から

3.17

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

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

  4. SELECT date();

  5. SELECT today();

[開発/SQL - 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);

[開発/SQL - トランザクション] から

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;

[開発/SQL - 時間関数] から

3.14

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

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

[開発/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 の列の名前が一致しないとエラーになる。

[開発/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;

[開発/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

[開発/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);

[開発/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;


[開発/SQL - 組み込み関数(集約関数)] から

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

[開発/SQL - トランザクション] から

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;


[開発/SQL - 文字列演算子 - 文字列関数] から

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;


[開発/SQL - 組み込み関数 - 文字列演算子] から

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';


[開発/SQL - 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';

[開発/SQL - 組み込み関数] から

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;

[開発/SQL - 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道場

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

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