HOME > 受験対策 > サンプル問題/例題解説 > Silverの例題解説「開発/SQL」

Silverの例題解説「開発/SQL」

Yahoo!ブックマークに登録

このページでは例題「開発/SQL」のアーカイブを試験ごとにまとめています。是非、OSS-DB技術者認定試験の学習にお役立てください。

[開発/SQL - トランザクションの概念(トランザクションの構文)] から
Q. 以下の一連の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;

[開発/SQL - 組込関数(時間関数)] から
Q. 現在時刻のうち、分の部分を取り出す(今が10時25分40秒だとして、25を返す)関数記述として、適切なものを2つ選びなさい。
  1. A. minute(now())
  2. B. to_char(current_timestamp, ‘MI’)
  3. C. extract(minute from current_time)
  4. D. current_minute()
  5. E. date_part(minute, now())

[開発/SQL - 組込関数(文字列演算子、述語)] から
Q. テーブルtblの列str1とstr2はいずれもTEXT型である。str1の先頭の1文字とstr2を結合する、例えばstr1が’ABC’、str2が’XYZ’なら’AXYZ’という文字列を取得するには、次のSQLの空欄に何を入れれば良いか。

SELECT ________ FROM tbl;

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

  1. A. substring(str1,1,1) + str2
  2. B. substring(str1,1) || str2
  3. C. concat(substring(str1 from 1 for 1), str2)
  4. D. substring(str1 from 1) + str2
  5. E. concat(substring(str1 for 1), str2)

[開発/SQL - SQLコマンド(テーブル定義)] から
Q. 人の名前が格納されたテーブルnamesから、姓をselectしたところ、以下のように大文字・小文字の表記が統一されていないデータが混在していた。

=> select last from names;

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

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

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

[開発/SQL - 組込関数(算術関数、演算子)] から
Q. 10を3で割り算した時の剰余(余り、この場合は1になる)を求めるものとして、適切なものをすべて選びなさい。
  1. A. select 10 mod 3;
  2. B. select mod(10, 3);
  3. C. select 10 % 3;
  4. D. select %(10, 3);

[開発/SQL - 組込関数(集約関数)] から
Q. 以下の一連のSQL文を実行した。

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

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

[開発/SQL - SQLコマンド(関数定義、PL/pgSQL)] から
Q. テーブル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. A. テーブルbankの列balanceの値を変更し、変更前のbalanceの値を返す。
  2. B. テーブルbankの列balanceの値を変更し、変更後のbalanceの値を返す。
  3. C. 指定したaccountnoがテーブルbankに存在しない場合はエラーが発生する。
  4. D. 指定したaccountnoがテーブルbankに存在しない場合は0(ゼロ)を返す。
  5. E. 指定したaccountnoがテーブルbankに存在しない場合はNULLを返す。

[開発/SQL - SQLコマンド(スキーマ)] から
Q. ユーザ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 TEXR);
INSERT INTO bar.sample(val) VALUES(‘This is bar’);
SET search_path TO “$user”,bar,public;
SELECT * from sample;

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

[開発/SQL - SQLコマンド(シーケンス)] から
Q. 次のコマンドで新しいシーケンスを作成した。

CREATE SEQUENCE seq_test MINVALUE 1;

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

SELECT * FROM seq_test;

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

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

[開発/SQL - SQLコマンド(ビュー)] から
Q. 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コマンド(ビュー)] から
Q. 更新可能ビューの説明として間違っているものを1つ選びなさい。
  1. A. 元となるSELECT文のFROM句に複数のテーブルが記述されているビューは更新できない。
  2. B. 元となるSELECT文のFROM句に記述されているテーブルに主キーが定義されていない場合、そのビューは更新できない。
  3. C. 元となるSELECT文がSUMなどの集約関数を使っているビューは更新できない。
  4. D. 元となるSELECT文が複数のSELECT文のUNIONになっているビューは更新できない。
  5. E. ビューにINSERTできた行が、SELECTで参照できるとは限らない。

[開発/SQL - SQLコマンド(インデックス)] から
Q. インデックスについて間違った説明を1つ選びなさい。
  1. A. 列にPRIMARY KEYの制約をつけると、自動的にインデックスが作成される。
  2. B. 列にUNIQUEの制約をつけると、自動的にインデックスが作成される。
  3. C. 列にNOT NULLの制約をつけると、自動的にインデックスが作成される。
  4. D. 列にUNIQUEの制約がなくても、インデックスをUNIQUEとして作成することができる。
  5. E. デフォルトではB-treeインデックスが作成される。

[開発/SQL - SQLコマンド(テーブル定義)] から
Q. 外部キー制約を含むテーブルを定義する以下のSQL文で、空欄に入るキーワードは何か。

CREATE TABLE test1 (
id INTEGER,
id2 INTEGER ______ test2 (id),
val TEXT);

  1. A. FOREIGN KEY
  2. B. EXTERNAL KEY
  3. C. REFERS TO
  4. D. REFERENCES
  5. E. MATCHES

[開発/SQL - SQLコマンド(データ型)] から
Q. 整数型データの処理について誤った記述を1つ選びなさい。
  1. A. 値が10桁を超える可能性がある場合は、INTEGER型を使用すべきではない。
  2. B. 値が20桁を超える可能性がある場合は、BIGINT型を使用すべきではない。
  3. C. NUMERIC型は30桁を超える整数を扱うことができる。
  4. D. NUMERIC型は整数、小数のどちらにも利用できる。
  5. E. 一般に、NUMERIC型の方がINTEGER型よりも演算が高速である。

[開発/SQL - SQLコマンド(SELECT文)] から
Q. 部門一覧の入ったdeptテーブルと従業員一覧の入ったempテーブルがある。

=> SELECT * FROM dept;

dept_id | dept_name
--------- + -----------
1 | 営業部
2 | 開発部

=> SELECT * FROM emp;

emp_id | dept_id | emp_name
-------- + --------- + --------------
1 | 1 | 鈴木イチロー
2 | 2 | 松井秀喜
3 | 1 | 松坂大輔
4 | 2 | 佐々木主浩

従業員一覧を表示するときに、部門IDの代わりに部門名を表示したい。
次のSQL文の空欄に入る文字列は何か。
=> SELECT emp_id, dept_name, emp_name FROM emp JOIN dept ___ (dept_id);

[開発/SQL - トランザクションの概念(ロック)] から
Q. 行やテーブルのロックに関して、適切な記述を1つ選びなさい。
  1. A. トランザクションブロック内でUPDATE文を実行すると、更新対象の行は自動的にロックされる。
  2. B. トランザクションブロック内で、テーブル内のすべての行を更新するUPDATE文を実行すると、自動的にテーブルロックがかかる。
  3. C. テーブルロックは行ロックより優先するので、別のユーザがテーブル内のデータに行ロックをしていても、LOCK TABLEでテーブル全体をロックすることができる。
  4. D. ACCESS EXCLUSIVEモード(LOCK TABLEのデフォルト)でテーブルロックが掛かっている場合、そのテーブルをUPDATE文で更新できるのは、データベースの管理者ユーザに限られる。
  5. E. 2人のユーザが同じテーブルの同じ行を同時に更新しようとすると、デッドロックが発生する。

[開発/SQL - トランザクションの概念(トランザクション分離レベル)] から
Q. PostgreSQLにおけるトランザクション分離レベルについて、誤った説明を2つ選びなさい。
  1. A. トランザクション分離レベルは、SET TRANSACTIONコマンドで設定することができる。
  2. B. トランザクション分離レベルは、BEGINとCOMMITの間の任意の箇所で指定できる。
  3. C. トランザクション分離レベルとしてREAD UNCOMMITTEDを指定しても、READ COMMITTEDを指定したのと同じ動作になる。
  4. D. 最上位の分離レベルであるSERIALIZABLEはまだ実装されていない。
  5. E. トランザクションの外側でトランザクション分離レベルを設定すると、警告が発生するが、エラーにはならない。

[開発/SQL - トランザクションの概念(トランザクションの構文)] から
Q. 以下の一連のSQL文を実行した。

CREATE TABLE test(id INTEGER, val VARCHAR(10));
BEGIN;
INSERT INTO test VALUES(1, \'a\'), (1, \'b\'), (2, \'a\');
SAVEPOINT x;
INSERT INTO test VALUES(3, \'b\'), (4, \'a\'), (4, \'b\'), (5, \'b\');
SAVEPOINT y;
DELETE FROM test WHERE id = 1;
ROLLBACK TO x;
DELETE FROM test where id = 4;
COMMIT;

終了後に、テーブルtestには何行のデータがあるか。

[開発/SQL - 組み込み関数(文字列関数、演算子)] から
Q. 社名がABCで始まる会社をすべて抽出したい。例えば、\'ABCD Inc.\'や\'ABC Corporation\'は抽出対象だが、\'XABC Company\'は抽出対象ではない。また、大文字と小文字は区別し、\'Abc Ltd.\'は抽出しないものとする。
以下のSQL文で適切なものを1つ選びなさい。
  1. A. SELECT * FROM company WHERE name = \'ABC%\';
  2. B. SELECT * FROM company WHERE lower(name) LIKE \'abc%\';
  3. C. SELECT * FROM company WHERE substring(name, 3) = \'ABC\';
  4. D. SELECT * FROM company WHERE substring(name, 1, 3) = \'ABC\';
  5. E. SELECT * FROM company WHERE substring(name, \'ABC\') = 1;

[開発/SQL - 組み込み関数(算術関数、演算子)] から
Q. テーブルhumanの列heightには身長、weightには体重がそれぞれNUMERIC型で入っている。 それぞれの行のデータについてBMIを求めるSELECT文として正しいものをすべて選びなさい。
なお、BMIは体重を身長の2乗で割ったものです。
  1. A. SELECT weight / height / height FROM human;
  2. B. SELECT weght / height * height FROM human;
  3. C. SELECT weight / height ^ 2 FROM human;
  4. D. SELECT weight / height ** 2 FROM human;
  5. E. SELECT weight / power(height, 2) FROM human;

[開発/SQL - 組み込み関数(集約関数)] から
Q. 次の一連のSQLを実行した。

CREATE TABLE test (id INTEGER, x INTEGER, y INTEGER);
INSERT INTO test VALUES(1, 1, 2);
INSERT INTO test VALUES(2, 1, 4);
INSERT INTO test VALUES(3, 1, 6);
INSERT INTO test VALUES(4, 1, 8);
INSERT INTO test VALUES(5, 2, 3);
INSERT INTO test VALUES(6, 2, 5);
INSERT INTO test VALUES(7, 2, 7);
INSERT INTO test VALUES(8, 2, null);
SELECT count(*), count(y), sum(y), avg(y) FROM test WHERE x > 1;
最後のSELECT文の結果として適切なものはどれか。

  1. A. 8, 7, 35, 5
  2. B. 8, 8, 35, 4.375
  3. C. 4, 3, 15, 5
  4. D. 4, 4, 15, 3.375
  5. E. 上記のいずれでもない。

[開発/SQL - SQLコマンド(関数定義、PL/pgSQL)] から
Q. 関数定義について適切な記述を2つ選びなさい。
  1. A. 値を返す関数のプログラムを定義する時はCREATE FUNCTION文を使う。
  2. B. 値を返さない関数のプログラムを定義する時はCREATE PROCEDURE文を使う。
  3. C. 定義済みの関数のプログラムを変更する時は、新しいプログラムをALTER FUNCTION文により設定する。
  4. D. 関数の名前はスキーマ内で一意でなければならない。
  5. E. 関数は必ずしもPL/pgSQLのような手続き言語で作成する必要はなく、SELECT文やUPDATE文などのSQLで記述することもできる。

[開発/SQL - SQLコマンド(スキーマ)] から
Q. PostgreSQLにおけるスキーマについて、適切な記述を2つ選びなさい。
  1. A. テーブル名の指定などでスキーマ名を省略すると、defaultという名前のスキーマを指定したものとみなされる。
  2. B. あるスキーマにテーブルを新規に作成するには、そのスキーマに対するCREATE権限が必要である。
  3. C. スキーマを新規に作成するには、データベースに対するCREATE権限が必要である。
  4. D. スキーマの所有者はそのスキーマと同じ名前のユーザである。
  5. E. スキーマの下にスキーマを作成することで、最大32階層までのスキーマを作成できる。

[開発/SQL - SQLコマンド(シーケンス)] から
Q. シーケンスmy_seqから次の値を取得する方法として適切なものを1つ選びなさい。
  1. A. SELECT my_seq->nextval;
  2. B. SELECT my_seq.nextval;
  3. C. SELECT nextval(my_seq);
  4. D. SELECT nextval('my_seq');
  5. E. SELECT nextval("my_seq");

[開発/SQL - SQLコマンド(トリガー)] から
Q. PostgreSQLのトリガー機能について、適切な記述を2つ選びなさい。
  1. A. SELECT文やINSERT文の実行の前に、トリガーとして定義したプログラムが実行される。
  2. B. CREATE TRIGGER文の中で、PL/pgSQLを使ってトリガーのコードを定義する。
  3. C. PL/pgSQLに限らず、PL/Perlなど、他の手続き言語でもトリガーを定義できる。
  4. D. ビューにトリガーを定義して、ビューを更新することができる。
  5. E. 1つのテーブルの1つのイベント(例えば、BEFORE INSERT FOR EACH ROW)に定義できるトリガーは1つだけである。

[開発/SQL - ビュー] から
Q. ビュー(view)に関する説明として最も適切なものを2つ選びなさい。
  1. A. ビューに対するSELECT権限があっても、そのビューを構成するテーブルに対するSELECT権限がなければ、ビューからデータをSELECTすることはできない。
  2. B. ビューを作成するには、そのビューを構成するテーブルあるいはテーブルの列に対するCREATE VIEW権限が必要である。
  3. C. 既存のテーブルと同じ名前のビューを作ることはできない。
  4. D. PostgreSQLの以前のバージョンでは、ビューの更新にはトリガー(trigger)あるいはルール(rule)を定義する必要があったが、バージョン9.3以降では、(ビューの定義によっては)トリガーやルールが定義されていないくても更新が可能である。
  5. E. ビューからの検索を高速にするために、ビューに対してインデックスを作成することができる。

[開発/SQL - インデックス] から
Q. 以下のSQL文でテーブルを作成した。

CREATE TABLE sample (id INTEGER, val TEXT);

このテーブルのid列に一意のインデックスを作成したい。以下のSQL文で適切なものを2つ選びなさい。

  1. A. ALTER TABLE sample ADD UNIQUE INDEX ON id;
  2. B. ALTER TABLE sample ALTER COLUMN id UNIQUE;
  3. C. ALTER TABLE sample ADD UNIQUE(id);
  4. D. CREATE UNIQUE INDEX ON sample(id);
  5. E. CREATE INDEX sample_id_unique ON sample(id);

[開発/SQL - テーブル定義] から
Q. 次のSQL文で新規にテーブルを作成した。

CREATE TABLE new_table (
id INTEGER PRIMAEY KEY,
fid INTEGER REFERENCES ftable(id),
val TEXT);

以下の記述から、適切なものを2つ選びなさい。

  1. A. ftableというテーブルが存在しないとCREATE TABLEがエラーになる。
  2. B. ftableというテーブルの列idが主キーでないとCREATE TABLEがエラーになる。
  3. C. new_tableの列idにNULLを入れることはできない。
  4. D. new_tableの列fidにNULLを入れることはできない。
  5. E. ftableの列idにNULLを入れることはできない。

[開発/SQL - データ型] から
Q. 論理値型(BOOLEAN型)に関する適切な記述を2つ選びなさい。
  1. A. 論理値型の列の値としては、キーワードのTRUEとFALSEの他に、文字列の’YES’と’NO’、整数の1と0などを設定することができる。
  2. B. FALSEとNULLは同等である。
  3. C. SELECT文で値を表示すると、INSERTやUPDATEでの設定で使った値に関わらず、tあるいはfと表示される。
  4. D. 実体は整数型の列で代用されているので、0以外の値は何を設定しても真であるとみなされる。
  5. E. bo が論理値型の列だとして、それが真である行を検索する場合、
    SELECT * FROM table_name WHERE bo;
    と書けば良い。

[開発/SQL - SQLコマンド(INSERT/UPDATE/DELETE文)] から
Q. 以下は2つのテーブルtablex, tableyを作成した時のDDLである。

CREATE TABLE tablex (id INTEGER, val VARCHAR(100));
CREATE TABLE tabley (foo INTEGER, bar VARCHAR(50));

tablexへのINSERT文の形式として適切なものを2つ選びなさい。

  1. A. INSERT INTO tablex id = foo, val = bar FROM tabley;
  2. B. INSERT INTO tablex SELECT * FROM tabley;
  3. C. INSERT INTO tablex (id, val) SELECT foo, bar FROM tabley;
  4. D. INSERT INTO tablex (id, val) VALUES SELECT foo, bar FROM tabley;
  5. E. INSERT INTO tablex FROM tabley WHERE id = foo AND val = bar;

[開発/SQL - SQLコマンド(SELECT文-JOIN)] から
Q. SELECT * FROM x, y WHERE x.id = y.id;
と等価なSELECT文をJOIN句を使って書いた。
SELECT * FROM x INNER JOIN y ____ (id);
空欄に入るキーワードは何か。

[開発/SQL - SQLコマンド(SELECT文-副問い合わせ)] から
Q. 次のような2つのテーブルtestとsubがある。いずれも、idはINTEGER型、valはTEXT型である。

=> select * from test;

id | val
---- + ----
1 | aaa
2 | BBB
2 | bbb
3 | ccc
(4 rows)

=> select * from sub;

id | val
---- + ----
1 | XXX
1 | xxx
2 | yyy
(3 rows)

次のSELECT文が返す行数を答えなさい。
=> select * from test where exists (select * from sub where id = id);

[開発/SQL - SQLコマンド(SELECT文)] から
Q. 次のようなテーブル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 行)

[開発/SQL - トランザクション概念] から
Q. あるユーザAが、次のトランザクションでテーブルtestを更新中である。

START TRANSACTION;
UPDATE test SET val = 123 WHERE id = 1;

別のユーザBが同じテーブルを更新しようとして
UPDATE test SET val = 456 WHERE id = 1;
を実行したところ、応答が返ってこなかった。
この状態に関する正しい説明を2つ選びなさい。

  1. A. データベースが異常な状態になっているので、再起動して復旧させる。
  2. B. ユーザBのクライアントが異常な状態になっているので、強制終了させる。
  3. C. ユーザBは、通常のUPDATEの代わりにUPDATE FORCEを使うべきだった。
  4. D. ユーザAが COMMIT; を実行すれば、自動的にユーザBのUPDATEが実行される。
  5. E. ユーザAが ROLLBACK; を実行すれば、自動的にユーザBのUPDATEが実行される。

[開発/SQL - トランザクション概念] から
Q. ダーティーリード(Dirty Read)について述べた説明から、誤っているものを2つ選びなさい。
  1. A. ダーティーリードとは、同時実行中の他のトランザクションがまだCOMMITしていない、更新中のデータが見えてしまう現象のことである。
  2. B. ダーティーリードが発生しなければ、同一トランザクション内で同じSELECT文を2回続けて実行した時の結果は必ず同じになる。
  3. C. PostgreSQLでダーティーリードを許容するには、
    SET TRANSACTION ISOLATION LEVEL DIRTY READ;
    を実行すれば良い。
  4. D. PostgreSQLのデフォルトの設定ではダーティーリードは発生しない。
  5. E. PostgreSQLでは、ダーティーリードを許容する設定にしても、ダーティーリードは発生しない。

[開発/SQL - 組み込み関数(文字列演算子)] から
Q. テーブル test には TEXT型の列 val1 と val2 がある。val1 と val2 を結合する(例えば、val1が’ABC’でval2が’123’なら’ABC123’を返す)にはどうしたら良いか。ただし、一方がNULLのときは、他方の値を返す(例えば、val1が’XYZ’でval2がNULLの時は’XYZ’を返す)ものとする。適切なものを2つ選びなさい。
  1. A. SELECT val1 || val2 FROM test;
  2. B. SELECT val1 + val2 FROM test;
  3. C. SELECT val1 . val2 FROM test;
  4. D. SELECT concat(val1, val2) FROM test;
  5. E. SELECT coalesce(val1, ‘’) || coalesce(val2, ‘’) FROM test;

[開発/SQL - 組み込み関数] から
Q. 文字列型の列xの値が、’ABCD’である(ただし、大文字と小文字を区別しない)行をすべて検索するSELECT文を2つ選びなさい。
  1. A. SELECT * FROM tbl WHERE x = ‘ABCD’;
  2. B. SELECT * FROM tbl WHERE x LIKE ‘ABCD’;
  3. C. SELECT * FROM tbl WHERE x ILIKE ‘abcd’;
  4. D. SELECT * FROM tbl WHERE x = upper(‘abcd’);
  5. E. SELECT * FROM tbl WHERE lower(x) = ‘abcd’;

[開発/SQL - 組み込み関数] から
Q. 次のテーブルがある。

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. A. 6, 4
  2. B. 5, 3
  3. C. 4, 4
  4. D. 4, 3.5
  5. E. 4, 3

[開発/SQL - テーブル定義] から
Q. ALTER TABLEコマンドで変更できないものを1つ選びなさい。
  1. A. テーブル名
  2. B. 列名
  3. C. テーブルが所属するスキーマ
  4. D. テーブルの所有者
  5. E. 列の値

[開発/SQL - データ型] から
Q. 次のDDLでテーブルtestを作成した。このテーブルのval列についての説明から適切なものを1つ選びなさい。
CREATE TABLE test(id INTEGER, val VARCHAR(10));
  1. A. INSERT INTO test(val) VALUES(‘ABCDEFG’);
    を実行したが、7文字しかないので空白3文字が自動的に追加され、val列には’ABCDEFG ‘という値が保存された。
  2. B. INSERT INTO test(val) VALUES(’ABCDEFGHIJKL’);
    を実行したが、11文字目以降は自動的に切り捨てられ、val列には’ABCDEFGHIJ’という値が保存された。
  3. C. INSERT INTO test(val) VALUES(’あいうえお’);
    を実行したが、サーバの文字コードがUTF8であり、これは15バイトの長さだったため、val列には’あいう’(9バイト)という値が保存された。
  4. D. INSERT INTO test(val) VALUES(123); を実行したら、val列には’123’という文字列が保存された。
  5. E. UPDATE test SET val = id; を実行したが、文法エラーとなった。

[開発/SQL - UPDATE文] から
Q. 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文を2つ選びなさい。

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

[開発/SQL - SELECT文] から
Q. 以下のテーブルがある。なお、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. A. 構文エラーとなる。
  2. B. 
    sum
    -----
    6
    1
    7
    4
    (4 行)
  3. C. 
    sum
    -----
    6
    7
    (2 行)
  4. D. 
    sum
    -----
    5
    7
    (2 行)
  5. E. 上記のいずれでもない。

[開発/SQL - トランザクション] から
Q. PostgreSQLでトランザクションを終了する命令として間違っているものを1つ選びなさい。
  1. A. COMMIT
  2. B. ROLLBACK
  3. C. END
  4. D. ABORT
  5. E. STOP

[開発/SQL - 組み込み関数(文字列関数)] から
Q. 以下の一連の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. A. 関数の使い方が正しくないのでエラーになる。
  2. B. WHERE条件にマッチする行がないので、何も返らない。
  3. C. char_length関数は文字数を返すので5が返る。
  4. D. char_length関数はサーバー側の文字列のバイト数を返すので、サーバーの文字セットがEUCであれば10が、UTF8であれば15が返る。
  5. E. char_length関数はクライアント側の文字列のバイト数を返すので、クライアントの文字セットがEUCやSJISであれば10が、UTF8であれば15が返る。

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

[開発/SQL - データ型] から
Q. PostgreSQLのデータ型について正しい説明を2つ選びなさい。
  1. A. 整数型には2バイトのSHORT、4バイトのINT、8バイトのLONGがある。
  2. B. 整数あるいは小数を10進数で表すには、NUMBER型あるいはNUMERIC型を利用できる。
  3. C. 可変長の文字列を表すVARCHAR型およびCHARACTER VARYING型では、その最大長をバイト単位で指定する。
  4. D. 日付を表すDATE型には時刻の情報が含まれない。時刻を表すTIME型には日付の情報が含まれない。TIMESTAMP型には日付と時刻の両方の情報が含まれる。
  5. E. 論理値型のBOOLEANでは真偽を表すのにTRUE、FALSEというキーワードを利用できるほか、'y', 'n', 't', 'f', '1', '0' といった文字列も利用できる。

[開発/SQL - 組み込み関数(算術演算子)] から
Q. PostgreSQLの算術演算子の利用について、誤った記述を1つ選びなさい。
  1. A. SELECT 5/2; の結果は 2 だが、SELECT 5/2.0; の結果は 2.5 となる。
  2. B. SELECT 5%2; の結果は 1 である。
  3. C. SELECT 5/NULL; を実行すると、0で除算のエラーとなる。
  4. D. SELECT 5/0; を実行すると、0で除算のエラーとなるが、SELECT NULL/0; なら結果は NULL となる。
  5. E. SELECT 5^2; の結果は 25 である。

[開発/SQL - SQLコマンド - スキーマ] から
Q. PostgreSQLのスキーマについて、最も適切な記述を2つ選びなさい。
  1. A. すべてのテーブルはいずれかのスキーマに所属する。
  2. B. スキーマは階層化できるので、
    SELECT * FROM schemax.subschema1.subschema2.tablename;
    のように深いスキーマのテーブルからSELECTすることもあり得る。
  3. C. SELECT * FROM tablename; のようにスキーマ名を指定せずにテーブル名を指定すると、publicスキーマを指定したものと見なされる。
  4. D. SELECT * FROM tablename; のようにスキーマ名を指定せずにテーブル名を指定すると、ユーザ名と同じ名前のスキーマを指定したものと見なされる。
  5. E. ALTER SCHEMA文でスキーマの名前や所有者を変更することができる。

[開発/SQL - SQLコマンド] から
Q. 次のような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. A. 1行
  2. B. 2行
  3. C. 3行
  4. D. 4行
  5. E. 5行

[開発/SQL - トランザクション] から
Q. 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. A. test表にはデータが1行もない
  2. B. test表にはデータが1行だけある
  3. C. test表にはデータが2行ある
  4. D. COMMITはエラーを起こす
  5. E. COMMITは正常終了する

[開発/SQL - SELECT文] から
Q. 以下のような表がある。

=> 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 - データ型] から
Q. PostgreSQLのVARCHAR型の説明として、正しいものを2つ選びなさい。
  1. A. 列の型をVARCHARと宣言してもCHARACTER VARYINGと宣言しても、全く同じである。
  2. B. 列の型をVARCHARと宣言してもCHARACTERと宣言しても、全く同じである。
  3. C. 列の型をVARCHAR(50)として宣言すると、この列には文字セットの種類に関らず、最大で50文字まで格納できる。
  4. D. 宣言した最大長を超える長さの文字列をVARCHAR列に格納しようとすると、最大長を超える部分が切り捨てられる。
  5. E. VARCHARは英文字の大文字と小文字を区別せず、値はすべて小文字に変換されて格納される。

[開発/SQL - データ型] から
Q. PostgreSQLで使われるデータ型について誤っているものを2つ選びなさい。
  1. A. VARCHAR型は、その最大長をバイト数で指定する。
  2. B. INTEGER型は4バイトなので、2の31乗より大きな数を格納できない。
  3. C. DATE型は、日付だけを格納しており、時刻の情報は入っていない。
  4. D. NUMERIC型は十進数で整数、小数のいずれも扱うことができる。
  5. E. データ型としての論理値型がないので、論理値を扱うには、整数型の列に1と0を入れる、あるいは文字列型の列にTとF、あるいはYとNを入れる、などの回避策を使う必要がある。

[開発/SQL - トランザクション] から
Q. 2つのクライアント(AとBとします)が同じテーブルTを更新するためにロックを取得しようとしています。
以下の記述から正しいものを2つ選択しなさい。
  1. A. クライアントAは行Xを更新するために行ロックを取得した。
    クライアントBも同じ行Xを更新したいが、行ロックを取得できないのでクライアントAの処理が終わるまで待たされる。
  2. B. クライアントAは行Xを更新するために行ロックを取得した。
    クライアントBはこれと異なる行Yを更新したいが、YがたまたまXと同じデータブロックにあったので、行ロックは取得できず、クライアントAの処理が終わるまで待たされた。
  3. C. クライアントAはテーブルTの50%の行を更新するために、それらの行のロックを取得したところ、ロックエスカレーションが発生して自動的にテーブルロックに移行した。
    このためクライアントBは同じテーブルTのどの行も更新できなくなった。
  4. D. クライアントAはテーブルTのすべての行を独占的に更新するため
         LOCK TABLE T;
    により、ACCESS EXCLUSIVEモードでのロックを取得した。
    このロックが解放されるまで、クライアントBはテーブルTを更新できないが、SELECTだけなら実行できる。
  5. E. クライアントAはテーブルTの行Xを更新するためにロックを取得した。
    クライアントBは同じテーブルTのテーブルロックを取得するために
         LOCK TABLE T;
    を実行したが、これはAが取得した行ロックが解放されるまで待たされる。

[開発/SQL - SELECT文] から
Q. 次のようなテーブルがある。

select * from test1;

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. A. 6, 6, 6
  2. B. 3, 5, 6
  3. C. 3, 4, 5
  4. D. 3, 4, 4
  5. E. 3, 4, 3

[開発/SQL - 時間関数] から
Q. 今日の日付を調べたい。最も適切な方法を1つ選択せよ。
  1. A. SELECT now;
  2. B. SELECT current_date;
  3. C. SELECT sysdate;
  4. D. SELECT date();
  5. E. SELECT today();

[開発/SQL - SQLコマンド] から
Q. psqlでデータベースに接続中だが、1日が何秒なのかを計算したい。
最も適切な方法を1つ選びなさい。
  1. A. compute 60 * 60 * 24;
  2. B. calculate 60 * 60 * 24;
  3. C. select 60 * 60 * 24;
  4. D. select 60 * 60 * 24 from dual;
  5. E. convert(1 day, second);

[開発/SQL - トランザクション] から
Q. あるクライアントで次の一連の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つ選択せよ。

A.
BEGIN;
INSERT INTO table2 (id2, val2) VALUES (4, 40);
UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
COMMIT;

B.
BEGIN;
UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
UPDATE table2 SET val2 = 3000 WHERE id2 = 3;
COMMIT;

C.
BEGIN;
UPDATE table2 SET val2 = 3000 WHERE id2 = 3;
UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
COMMIT;

D.
BEGIN;
UPDATE table1 SET val1 = 1000 WHERE id1 = 1;
UPDATE table1 SET val1 = 2000 WHERE id1 = 2;
COMMIT;

E.
BEGIN;
UPDATE table1 SET val1 = 2000 WHERE id1 = 2;
DELETE FROM table1 WHERE id1 = 1;
COMMIT;

[開発/SQL - 時間関数] から
Q. 次の SQL 文のうち、エラーにならないものを2つ選びなさい。
  1. A. SELECT current_date();
  2. B. SELECT current_time();
  3. C. SELECT current_time(2);
  4. D. SELECT current_timestamp();
  5. E. SELECT now();

[開発/SQL - SELECT文] から
Q. UNION 演算子を使った次の SELECT 文について正しいものをすべて選びなさい。

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

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

[開発/SQL - テーブル定義] から
Q. 以下の一連の 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. A. INSERT INTO sample VALUES (4, NULL, 'abc');
  2. B. INSERT INTO sample (id) VALUES (5);
  3. C. INSERT INTO sample (val2) VALUES ('def');
  4. D. UPDATE sample SET val2 = 'zzz' WHERE id = 1;
  5. E. UPDATE sample SET val1 = 'ccc' WHERE id = 2;

[開発/SQL - SELECT 文] から
Q. 以下のような行を持つテーブル 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. A. 1
  2. B. 2
  3. C. 3
  4. D. 4
  5. E. 5

[開発/SQL - テーブル定義] から
Q. 次の 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. A. INSERT INTO sample VALUES (-1, 'zzz', 100);
  2. B. INSERT INTO sample VALUES (3, 'ccc', -100);
  3. C. UPDATE sample SET id = 1 WHERE id = 2;
  4. D. DELETE FROM sample WHERE id = 3;
  5. E. INSERT INTO sample (id, val) VALUES (3, 30);

[開発/SQL - UPDATE文] から
Q. 以下の 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 - 組み込み関数(集約関数)] から
Q. 次の一連の 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. A. 5, 5, 2
  2. B. 5, 4, 2
  3. C. 5, 4, 2.5
  4. D. 4, 4, 2.5
  5. E. 5, 4, NULL

[開発/SQL - トランザクション] から
Q. 次の一連の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 - 文字列演算子 - 文字列関数] から
Q. 次の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 - 組み込み関数 - 文字列演算子] から
Q. 次の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コマンド - テーブル定義] から
Q. 次の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 - SQLコマンド] から
Q. PostgreSQLにおけるビュー(VIEW)の更新(UPDATE)について、適切なものをすべて選びなさい。
  1. どんなビューに対しても、表とまったく同様に更新が可能である。
  2. ビューが1つの表だけから作られている、などビューの定義が特定の条件を満たす場合には、表とまったく同様に更新が可能である。
  3. ビューに対してトリガーを定義すれば、更新が可能になる。
  4. ビューに対してルールを定義すれば、更新が可能になる。
  5. ビューの更新はサポートされておらず、UPDATE文は必ずエラーになる。

[開発/SQL - 組み込み関数] から
Q. 以下のようなデータを持つテーブル 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コマンド] から
Q. 以下のようなテーブル 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;

ページトップへ