PREPARATION
受験対策

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

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

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

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

3.40

次のようなテーブルtestがある。なお、id1、id2はいずれもINTEGER型、valはTEXT型である。

=> select * from test;

id1 | id2 | val
----- + ----- + -----
1 | 1 | aaa
1 | 2 | bbb
1 | 3 | ccc
2 | 1 | ddd
3 | 2 | eee
(5 行)
ここで、次のSELECT文を実行した。

=> select val from test order by id2, id1 desc limit 1 offset 2;

以下の結果の空欄に入るのは何か。

val
-----
___
(1 行)


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

1.38

ダーティーリード(Dirty Read)について述べた説明から、誤っているものを2つ選びなさい。

  1. ダーティーリードとは、同時実行中の他のトランザクションがまだCOMMITしていない、更新中のデータが見えてしまう現象のことである。
  2. ダーティーリードが発生しなければ、同一トランザクション内で同じSELECT文を2回続けて実行した時の結果は必ず同じになる。
  3. PostgreSQLでダーティーリードを許容するには、
    SET TRANSACTION ISOLATION LEVEL DIRTY READ;
    を実行すれば良い。
  4. PostgreSQLのデフォルトの設定ではダーティーリードは発生しない。
  5. PostgreSQLでは、ダーティーリードを許容する設定にしても、ダーティーリードは発生しない。

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

3.37

テーブル test には TEXT型の列 val1 と val2 がある。val1 と val2 を結合する(例えば、val1が’ABC’でval2が’123’なら’ABC123’を返す)にはどうしたら良いか。ただし、一方がNULLのときは、他方の値を返す(例えば、val1が’XYZ’でval2がNULLの時は’XYZ’を返す)ものとする。適切なものを2つ選びなさい。

  1. SELECT val1 || val2 FROM test;
  2. SELECT val1 + val2 FROM test;
  3. SELECT val1 . val2 FROM test;
  4. SELECT concat(val1, val2) FROM test;
  5. SELECT coalesce(val1, ‘’) || coalesce(val2, ‘’) FROM test;

S3.2 組み込み関数

3.36

文字列型の列xの値が、’ABCD’である(ただし、大文字と小文字を区別しない)行をすべて検索するSELECT文を2つ選びなさい。

  1. SELECT * FROM tbl WHERE x = ‘ABCD’;
  2. SELECT * FROM tbl WHERE x LIKE ‘ABCD’;
  3. SELECT * FROM tbl WHERE x ILIKE ‘abcd’;
  4. SELECT * FROM tbl WHERE x = upper(‘abcd’);
  5. SELECT * FROM tbl WHERE lower(x) = ‘abcd’;

S3.2 組み込み関数

3.35

次のテーブルがある。

select * from test;

val
---
1
2
3
4
5
6
(6 rows)

なお、val列はINTEGER型である。
次のSELECT文の結果として最も適切なものを選びなさい。

select count(*), avg(val) from test where val > 1 and val < 6;

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

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

3.34

ALTER TABLEコマンドで変更できないものを1つ選びなさい。

  1. テーブル名
  2. 列名
  3. テーブルが所属するスキーマ
  4. テーブルの所有者
  5. 列の値

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

3.33

次のDDLでテーブルtestを作成した。このテーブルのval列についての説明から適切なものを1つ選びなさい。
CREATE TABLE test(id INTEGER, val VARCHAR(10));

  1. INSERT INTO test(val) VALUES(‘ABCDEFG’);
    を実行したが、7文字しかないので空白3文字が自動的に追加され、val列には’ABCDEFG ‘という値が保存された。
  2. INSERT INTO test(val) VALUES(’ABCDEFGHIJKL’);
    を実行したが、11文字目以降は自動的に切り捨てられ、val列には’ABCDEFGHIJ’という値が保存された。
  3. INSERT INTO test(val) VALUES(’あいうえお’);
    を実行したが、サーバの文字コードがUTF8であり、これは15バイトの長さだったため、val列には’あいう’(9バイト)という値が保存された。
  4. INSERT INTO test(val) VALUES(123); を実行したら、val列には’123’という文字列が保存された。
  5. UPDATE test SET val = id; を実行したが、文法エラーとなった。

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

3.32

2つのテーブルmainとrefがある。

=> select * from main;

id | v1 | v2
---- + ---- + ----
1 | |
2 | |
(2 行)
=> select * from ref;

id | r1 | r2
---- + ---- + ----
1 | A | B
2 | X | Y
(2 行)
いずれのテーブルもid列はINTEGER型、v1, v2, r1, r2はTEXT型である。
mainテーブルを更新して、次のようなデータになるようにしたい。

=> select * from main;

id | v1 | v2
---- + ---- + ----
1 | A | B
2 | X | Y
(2 行)
これを実現する適切なSQL文を3つ選びなさい。

  1. UPDATE main SET
    (v1, v2) = (SELECT r1, r2 FROM ref WHERE main.id = ref.id);
  2. UPDATE main SET
    v1 = (SELECT r1 FROM ref WHERE main.id = ref.id),
    v2 = (SELECT r2 FROM ref WHERE main.id = ref.id);
  3. UPDATE main
    FROM ref
    SET (v1, v2) = (r1, r2)
    WHERE main.id = ref.id;
  4. UPDATE main
    SET (v1, v2) = (r1, r2)
    FROM ref
    WHERE main.id = ref.id;
  5.  UPDATE main
    SET (v1, v2) = (‘A’, ‘B’), (‘X’, ‘Y’);

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

3.31

以下のテーブルがある。なお、a, b列はいずれもINTEGER型である。

select * from test;

a | b
--- + ---
1 | 1
1 | 2
1 | 3
2 | 1
3 | 3
3 | 4
4 | 4
(7 行)
ここで、次のSELECT文を実行した時の結果として、適切なものを選びなさい。

select sum(b) from test where b>1 group by a having count(a)>1 order by a;

  1. 構文エラーとなる。
  2. sum

    -----

    6

    1

    7

    4

    (4 行)

  3.  sum

    -----

    6

    7

    (2 行)

  4. sum

    -----

    5

    7

    (2 行)

  5. 上記のいずれでもない。

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

3.30

PostgreSQLでトランザクションを終了する命令として間違っているものを1つ選びなさい。

  1. COMMIT
  2. ROLLBACK
  3. END
  4. ABORT
  5. STOP

[開発/SQL - 組み込み関数(文字列関数)] から

3.29

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

CREATE TABLE test(id INTEGER, val TEXT);
INSERT INTO test VALUES (1, ‘あいうえお’);
SELECT char_length(val) FROM test WHERE id = 1;

最後のSELECT文が返すデータについて、以下の説明から正しいものを1つ選びなさい。

  1. 関数の使い方が正しくないのでエラーになる。
  2. WHERE条件にマッチする行がないので、何も返らない。
  3. char_length関数は文字数を返すので5が返る。
  4. char_length関数はサーバー側の文字列のバイト数を返すので、サーバーの文字セットがEUCであれば10が、UTF8であれば15が返る。
  5. char_length関数はクライアント側の文字列のバイト数を返すので、クライアントの文字セットがEUCやSJISであれば10が、UTF8であれば15が返る。

[開発/SQL - テーブル定義] から

3.28

テーブルに関する以下の説明について正しいものを2つ選びなさい。

  1. テーブルを新しく作成するにはCREATETABLE権限が必要である。
  2. ALTER TABLEでテーブルにUNIQUE制約を追加することはできるが、PRIMARY KEY制約を追加することはできない。
  3. ALTER TABLEでテーブルの列にデフォルト値(DEFAULT)を設定あるいは変更することができるが、これにより既存のデータの列の値が変更されることはない。
  4. テーブルの作成先のスキーマが何であろうと、テーブルを作成したユーザ、つまりCREATE TABLEを実行したユーザが、そのテーブルの所有者となる。
  5. テーブルの所有者はそのテーブルに関するすべての権限を有しているので、自分自身についてテーブルのSELECT権を剥奪(REVOKE)しても、引き続き、そのテーブルからSELECTすることができる。

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

3.27

PostgreSQLのデータ型について正しい説明を2つ選びなさい。

  1. 整数型には2バイトのSHORT、4バイトのINT、8バイトのLONGがある。
  2. 整数あるいは小数を10進数で表すには、NUMBER型あるいはNUMERIC型を利用できる。
  3. 可変長の文字列を表すVARCHAR型およびCHARACTER VARYING型では、その最大長をバイト単位で指定する。
  4. 日付を表すDATE型には時刻の情報が含まれない。時刻を表すTIME型には日付の情報が含まれない。TIMESTAMP型には日付と時刻の両方の情報が含まれる。
  5.  論理値型のBOOLEANでは真偽を表すのにTRUE、FALSEというキーワードを利用できるほか、'y', 'n', 't', 'f', '1', '0' といった文字列も利用できる。

[開発/SQL - 組み込み関数(算術演算子)] から

3.26

PostgreSQLの算術演算子の利用について、誤った記述を1つ選びなさい。

  1. SELECT 5/2; の結果は 2 だが、SELECT 5/2.0; の結果は 2.5 となる。
  2. SELECT 5%2; の結果は 1 である。
  3. SELECT 5/NULL; を実行すると、0で除算のエラーとなる。
  4. SELECT 5/0; を実行すると、0で除算のエラーとなるが、SELECT NULL/0; なら結果は NULL となる。
  5. SELECT 5^2; の結果は 25 である。

[開発/SQL - SQLコマンド - スキーマ] から

3.25

PostgreSQLのスキーマについて、最も適切な記述を2つ選びなさい。

  1. すべてのテーブルはいずれかのスキーマに所属する。
  2. スキーマは階層化できるので、
    SELECT * FROM schemax.subschema1.subschema2.tablename;
    のように深いスキーマのテーブルからSELECTすることもあり得る。
  3. SELECT * FROM tablename; のようにスキーマ名を指定せずにテーブル名を指定すると、publicスキーマを指定したものと見なされる。
  4. SELECT * FROM tablename; のようにスキーマ名を指定せずにテーブル名を指定すると、ユーザ名と同じ名前のスキーマを指定したものと見なされる。
  5. ALTER SCHEMA文でスキーマの名前や所有者を変更することができる。

[開発/SQL - SQLコマンド] から

3.24

次のような2つのテーブル t1 と t2 がある。

=> select * from t1;

id | val
---- + -----
1 | aaa
2 | bbb
(2 行)
=> select * from t2;

id | val
---- + -----
1 | xxx
1 | yyy
3 | zzz
(3 行)
いずれも、id列はINTEGER型、val列はTEXT型である。
次のSELECT文を実行した時に返される行数はいくつか。

select * from t1 full join t2 using (id);

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

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

3.23

psqlでデータベースに接続し、次の一連のSQLを実行した。

CREATE TABLE test (id INTEGER, val TEXT);
START TRANSACTION;
INSERT INTO test (id, val) VALUES (1, ‘abc’);
INSERT INTO test (idd, val) VALUES (2, ‘pqr’);
INSERT INTO test (id, val) VALUES (3, ‘xyz’);
COMMIT;

2つ目のINSERTで、id とすべきところを間違って idd としてしまったため、エラーになった。最後のCOMMITを実行した後の状態について正しく述べているものを2つ選びなさい。

  1. test表にはデータが1行もない
  2. test表にはデータが1行だけある
  3. test表にはデータが2行ある
  4. COMMITはエラーを起こす
  5. COMMITは正常終了する

[開発/SQL - SELECT文] から

3.22

以下のような表がある。

=> SELECT * FROM table1;

id | val1 | val2
---- + ------ + ------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 2 | 1
5 | 2 | 3
6 | 3 | 3
7 | 4 | 1
8 | 4 | 5
(8 行)
なお、id、val1、val2 いずれもINTEGER型である。

次のSQL文を実行した時に返されるidの値は何か?

SELECT id FROM table1
ORDER BY val2 DESC, val1
LIMIT 1 OFFSET 3;


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

3.21

PostgreSQLのVARCHAR型の説明として、正しいものを2つ選びなさい。

  1. 列の型をVARCHARと宣言してもCHARACTER VARYINGと宣言しても、全く同じである。
  2. 列の型をVARCHARと宣言してもCHARACTERと宣言しても、全く同じである。
  3. 列の型をVARCHAR(50)として宣言すると、この列には文字セットの種類に関らず、最大で50文字まで格納できる。
  4. 宣言した最大長を超える長さの文字列をVARCHAR列に格納しようとすると、最大長を超える部分が切り捨てられる。
  5. VARCHARは英文字の大文字と小文字を区別せず、値はすべて小文字に変換されて格納される。

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

OSS-DBの受験対策

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

例題解説

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

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

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

無料技術解説セミナー

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

OSS-DB道場

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

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