12c SQL 基礎[12c SQL]: (1Z0-061) サンプル問題

問題1:

次のうち2015/1/3 8:05:03 と表示されるのはどれですか。

1. select to_char(to_date(‘2015/01/03 08:05:03’,’YYYY/MM/DD HH24:MI/SS’, ‘YYYY/fmMM/DD HH24fm:MI:SS’) from dual;

2. select to_char(to_date(‘2015/01/03 08:05:03’,’YYYY/MM/DD HH24:MI/SS’, ‘fmYYYY/MM/DDfm HH24:MI:SS’) from dual;

3. select to_char(to_date(‘2015/01/03 08:05:03’,’YYYY/MM/DD HH24:MI/SS’, ‘YYYY/MM/DD fmHH24:MI:SSfm’) from dual;

4. select to_char(to_date(‘2015/01/03 08:05:03’,’YYYY/MM/DD HH24:MI/SS’, ‘fmYYYY/MM/DD HH24:MI:SSfm’) from dual;

解答:1

解説

日付書式の問題で、ポイントは先行0の有無を制御するfmの位置です。1月を01ではなく1のように0なしで表示していますので、MMの前にfmをつけます。8:05:03のように分以降は0ありで表示していますので、HH24の後ろにfmをつけています。

問題2:

関数についての説明として正しいものを3つ選択してください。

1. SUBSTR文字関数は、文字列の一部分を置換する。

2. NOWDATE関数は現在の日付と時刻を返す。

3. ROUND数値関数は、1の位で四捨五入された数値を返す。

4. TRUNC日付関数は、指定の単位に切り捨てられた日付を返す。

5. NVL関数は文字データに対して使用できる。

6. LENGTH文字関数は式の文字数を返す。

解答:4,5,6

解説

選択肢1について、SUBSTR文字関数は文字列の一部を切り出します。選択肢2について、現在の日付と時刻を返す関数はSYSDATEです。選択肢3について、ROUND数値関数での四捨五入の位置は引数で指定できます。

問題3:

姓(last_name)に"s"の文字を含み、給与(salary)が5000以上8000以下の社員の名前を表示するSQL文のWHERE句として正しいものを選択してください。

1. WHERE last_name = '%s%' AND salary IN(5000,8000)

2. WHERE last_name = '_s_' AND salary >= 5000 OR salary <=8000

3. WHERE last_name LIKE '%s%' AND salary BETWEEN 5000 AND 8000

4. WHERE last_name LIKE '_s%' AND salary >= 5000 AND salary <=8000

5. WHERE last_name LIKE '%s_' AND salary NOT BETWEEN 8000 AND 5000

解答:3

解説

姓(last_name)に"s"の文字を含むということなので、sの前後をワイルドカードで囲んだ %s% となります。なお、_(アンダースコア)はワイルドカードですが任意の一文字なので%の方が適しています。給与(salary)が5000以上8000以下ということから、BETWEENで記述できます。

問題4:

EMPLOYEES表から給与(salary)が全従業員の中で最も高い従業員の姓(last_name)と給与(salary)を検索するSQLとして正しいものを選択してください。

1. SELECT last_name, MAX(salary) FROM employees;

2. SELECT last_name, salary FROM employees WHERE salary = MAX(salary);

3. SELECT last_name, MAX(salary) FROM employees

GROUP BY last_name HAVING salary = MAX(salary);

4. SELECT last_name, MAX(salary) FROM employees GROUP BY MAX(salary);

5. SELECT last_name, salary FROM employees

WHERE salary = (SELECT MAX(salary) FROM employees);

解答:5

解説

この問題の結果を得るためには、副問合せを使用する必要があります。副問合せでsalaryの最大値を出し、それとsalaryが等しいデータを選択します。

問題5:

次のSQLのうち正しく動作するものはどれですか。

1. SELECT last_name,department_id,TO_CHAR(null) dept_name FROM employees

UNION

SELECT TO_CHAR(null) first_row ,department_id,department_name FROM departments

order by dept_name;

2. SELECT last_name,department_id,TO_CHAR(null) dept_name FROM employees

UNION

SELECT TO_CHAR(null) first_row ,department_id,department_name FROM departments

order by first_row;

3. SELECT last_name,department_id,TO_CHAR(null) dept_name FROM employees

UNION

SELECT TO_CHAR(null) first_row ,department_id,department_name FROM departments

order by department_name;

4. SELECT last_name,department_id,TO_CHAR(null) dept_name FROM employees

UNION

SELECT TO_CHAR(null) first_row ,department_id,department_nameFROM departments

order by 4;

解答:1

解説

UNION集合演算子を使用すると、複数のSELECT文をひとつに組み合わせることができます。それぞれのSELECTの列数、データ型のグループは揃っている必要があります。また、ORDRE BY句でソートする場合、列名指定する場合は、一つ目のSELECT文の列名で指定する必要があります。

問題6

次のSQL文のうち正しく動作するものはどれですか。

1. SELECT distinct first_name, last_name from employees;

2. SELECT distinct first_name, distinct last_name from employees;

3. SELECT first_name, distinct last_name from employees;

4. SELECT unique first_name, last_name from employees;

解答:1,4

解説

重複を省くDISTINCT句はSELECTの後、列リストの前に入れます。UNIQUEで置き換えることもできます。

問題7

ビューに関する説明で正しいものを2つ選択してください。

1. 元表との整合性を取るために定期的にリフレッシュする必要がある。

2. 同一の表を参照する複数のビューを作成できる。

3. グループ関数を使用しているビューを使って、行の削除はできない。

4. ビューを問い合わせる度に、新規に表が作成される。

5. ビューの列を実表の列と別の名前にすることはできない。

解答:2,3

解説

選択肢1について、通常のビューは、実データを持たないのでリフレッシュの必要はありません。定期的にリフレッシュするのは、マテリアライズド・ビューです。選択肢4について、ビューを使用するたびに表が作成されることはありません。選択肢5について、ビューの列名と表の列名を別の名前にすることは可能です。

問題8

department_idがNULL値の従業員のjob_id列をNULL値に更新するUPDATE文として、正しいものを選択してください。ただし、job_id列にNOT NULL 制約は無いとします。

1. UPDATE emp SET last_name = NULL WHERE department_id = NULL;

2. UPDATE emp SET last_name IS NULL WHERE department_id IS NULL;

3. UPDATE emp SET last_name = NULL WHERE department_id IS NULL;

4. UPDATE emp SET last_name = 'NULL' WHERE department_id = NULL;

5. UPDATE emp SET last_name IS NULL WHERE department_id = 'NULL';

解答:3

解説

選択肢1について、WHERE句の条件で列値がNULLかどうかを判別する場合、= NULL という書き方はできません。選択肢2について、UPDATE文で列にNULL値をセットするときは、= NULL と書きます。IS NULLではありません。選択肢4について、 SET last_name = 'NULL' という書き方だと、last_name列に NULL という文字列がセットされます。選択肢5について、WHERE department_id = 'NULL' という書き方だと、department_id列が NULL という文字列と一致しているかを判別します。 

問題9

以下のSELECT文を実行するとエラーになります。エラーの原因として考えられることを選択してください。

SELECT last_name, d.department_name

FROM employees e JOIN (select * from departments) d

USING (department_id)

WHERE d.department_id IN (10,20,30)

ORDER BY e.last_name?

1. SELECT句

2. FROM句

3. USING句

4. WHERE句

5. ORDER BY句

解答:4

解説

USING句で結合列として department_id を指定しているので、WHERE句を department_id IN (10,20,30) とする必要があります。

問題10

次のSQL文のうち6番目のデータのみ取り出すのは以下のどれですか?2つ選んでください。

1. select first_name, salary from employees

offset 5 rows fetch next 1 rows only;

2. select first_name, salary from employees

fetch 1 row offset 5 rows only;

3. select first_name, salary from employees

fetch first row offset 5 rows only;

4. select first_name, salary from employees

offset 5 rows fetch first row only;

解説:1,4

解答

Oracle Database 12cからの新しい書き方です。選択肢2,3は、キーワードの語順が間違っています。

問題11

制約に関して正しい記述を2つ選択してください。

1. 制約は複雑な問合せを簡単にする。

2. 制約名はSYS_Cで開始する名前で命名する必要がある。

3. 制約は、表の作成時および表を作成した後に作成できる。

4. Oracle Serverで定義できる制約は列レベルの制約のみである。

5. 外部キー制約が定義されている場合、参照されている表は削除できない。

解答:3,5

解説

選択肢1について、ビューの説明です。選択肢2について、制約名は命名規則の範囲で自由につけることができます。制約名を明示的に定義しなかった場合は、SYS_Cで開始する制約名が自動的につけられます。選択肢4について、表レベルでも制約を定義できます。

問題12

次のSQL文の実行結果として正しいものはどれですか?

SELECT TRUNC(45.923,-1) FROM DUAL;

1. 40

2. 45

3. 45.9

4. 45.92

解答:1

解説

TRUNCは切捨ての算術関数です。切捨ての位は-1と指定されているので、一の位で切捨て、40となります。

問題13

EMP表には次の列が含まれています。

EMP表

----------------------------------------------------

ENAME VARCHAR2(35) -- 社員名

HIRE_DATE DATE -- 入社日

EMP表に対する次の問合せのうち、数値を返すSQL文はどれですか。 2つ選びなさい。

1. SELECT TO_NUMBER(hire_date + 7) FROM emp;

2. SELECT SYSDATE-hire_date FROM emp;

3. SELECT ADD_MONTHS(MIN(hire_date), 6) FROM emp;

4. SELECT TRUNC(hire_date) FROM emp;

5. SELECT MONTHS_BETWEEN(SYSDATE,hire_date) FROM emp;

解答:2,5

解説

選択肢1について、エラーとなります。選択肢3について、日付が返ります。選択肢4について、日付が返ります。

問題14

従業員を管理するemployees表と部門を管理するdepartments表があります。従業員の中には部門に所属していない者もいます。また、従業員の存在しない部門もあります。すべての従業員について、first_name, last_name, department_nameを出力するレポートを作成したいと考えています。従業員のいない部門は表示する必要はありません。以下のSQL文のうち、目的を果たせるものはどれでしょうか。

1. SELECT e.first_name, e.last_name, d.department_name

FROM departments d

LEFT OUTER JOIN employees e USING (department_id);

2. SELECT e.first_name, e.last_name, d.department_name

FROM departments d

RIGHT OUTER JOIN employees e USING (department_id);

3. SELECT e.first_name, e.last_name, d.department_name, l.city

FROM departments d

FULL OUTER JOIN employees e USING (department_id);

4. SELECT e.first_name, e.last_name, d.department_name, l.city

FROM departments d

CROSS JOIN employees e;

解答:2

解説

部門に所属していない従業員も含めてすべての従業員を表示する、ということなので、外部結合で、かつ、EMPLOYEES表を全行表示するため、選択肢2が正解となります。

問題15

表の定義で1つしか設定できないデータ型は次のうちどれですか。

1. BLOB型

2. CLOB型

3. LONG型

4. TIMESTAMP型

5. BFILE型

解答:3

解説

LONG型は下位互換のために残っているデータ型のため、使用上、様々な制約があります。

問題16

SELECT文のFOR UPDATE句に関して正しい記述はどれですか。2つ選択してください。

1. ロックはCOMMITまたはROLLBACKコマンドを発行することではずれる。

2. SELECT句で指定しなかった列はロックがかからないため更新することができる

3. WHERE句の条件に当てはまらない行は更新することができる。

4. SELECT FOR UPDATEが行われている表に対してDROP TABLEをするにはCASCADE CONSTRAINTS句を指定する

5. SELECT FOR UPDATEを行ったセッション内であればデータを更新することができる。

解答:1,5

解説

ロックはCOMMITまたはROLLBACKコマンドを発行することではずれます。また、SELECT FOR UPDATEを行ったセッション内であればデータを更新することができます。

問題17

制約について間違っている記述はどれですか。

1. Primary key制約は一つの表に一つしか設定できない。

2. Not null 制約は列制約構文でしか記述できない。

3. Unique key 制約は一つの表に複数設定することができる。

4. Check制約は一つの表に一つしか設定できない。

5. Foreign key 制約が設定されている列にはNULL値を入れることができる。

解答:4

解説

選択肢4について、Check制約は、ひとつの表に複数設定することができます。

問題18

本日の日付は2015年4月10日です。日付書式が ‘DD-MON-RR’の時、日付の正しい解釈は次のどれですか。2つ選択してください。

1. ’10-APR-49’は、1949年4月10日である。

2. ’10-APR-49’は、2049年4月10日である。

3. ’10-APR-50’は、1950年4月10日である。

4. ’10-APR-50’は、2050年4月10日である。

解答:2,3

解説

RR日付書式は、現時点の年によって解釈が異なります。現在2015年ということなので、’10-APR-49’は、2049年4月10日、’10-APR-50’は、1950年4月10日と解釈されます。

問題19

TRUNCATE文に関して正しい記述はどれですか。選択してください。

1. DELETE文と同様にWHERE句を伴って行を削除することができるが、ROLLBACKすることができない。

2. 表に定義されている索引もあわせて削除する。

3. DELETE文よりも高速に削除できるため、特に表に大量のデータがある場合に利用すると効果的である。

4. 指定した列のデータを、一度にNULLに変更することができる。

解答:3

解説

選択肢1について、TRUNCATEでは、WHERE句を伴って行を削除することはできません。選択肢2について、索引エントリは切り捨てられますが、索引自体は表の定義同様、残ります。選択肢4について、誤りです。

問題20

暗黙のコミットが発生する状況は次のどれですか。2つ選択してください。

1. DDL文が発行された時

2. システム障害が発生し、データベースがダウンする直前

3. データベースがシステム障害から回復した直後

4. SQL*Plus等のツールを正常終了した時

5. 1時間(デフォルト)経過する間に、1度もトランザクション制御文が発行されない時

解答:1,4

解説

選択肢2について、システム障害が発生し、データベースがダウンする直前、暗黙のコミットは行われません。選択肢3について、データベースがシステム障害から回復した直後も暗黙のコミットは行われません。選択肢4についても誤りです。