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

問題1:

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

  1. 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. 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. 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. 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

解説
2015/1/3 8:05:03のように、月、日、時間の十の位の0がないので、fm指定していることが分かります。fmがMM/DD HH24の部分に対して有効な書き方になっているのは正解の選択肢のみです。

問題2:

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

  1. 1. SUBSTR文字関数は、文字列の一部分を置換する。
  2. 2. NOWDATE関数は現在の日付と時刻を返す。
  3. 3. ROUND数値関数は、1の位で四捨五入された数値を返す。
  4. 4. TRUNC日付関数は、指定の単位に切り捨てられた日付を返す。
  5. 5. NVL関数は文字データに対して使用できる。
  6. 6. LENGTH文字関数は式の文字数を返す。

解答: 4,5,6

解説
TRUNCを日付に対して使用すると、指定の単位で切り捨てた日付を返します。
NVL関数はNULLを指定の値に置き換える関数ですが、文字列データに対しても使用できます。
LENGTH関数は式の文字数を返します。LENGTHB関数だと、式のバイト数を返します。
SUBSTR関数は文字列の一部の置換ではなく、文字列の一部の切り出しです。文字列の置換はREPLACE文字関数です。
Oracleで現在の日付と時刻を返す関数は、sysdateです。
ROUND数値関数は四捨五入する関数ですが、四捨五入を行う位については第二引数で指定できます。
第二引数を省略した場合は、小数点以下第一位で四捨五入します。

問題3:

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

  1. 1. WHERE last_name = '%s%' AND salary IN(5000,8000)
  2. 2. WHERE last_name = '_s_' AND salary >= 5000 OR salary <=8000
  3. 3. WHERE last_name LIKE '%s%' AND salary BETWEEN 5000 AND 8000
  4. 4. WHERE last_name LIKE '_s%' AND salary >= 5000 AND salary <=8000
  5. 5. WHERE last_name LIKE '%s_' AND salary NOT BETWEEN 8000 AND 5000

解答:3

解説
姓(last_name)に"s"の文字を含む、という条件は、last_name LIKE ‘%s%’となります。%は0文字以上の任意の文字列ですが、_を使用すると任意の1文字という意味になります。たとえば、last_name LIKE '_s%'ですと二文字目が”s”という意味になります。また給与(salary)が5000以上8000以下の条件は、salary BETWEEN 5000 AND 8000と記述するか、もしくは salary >=5000 AND salary<=8000という記述になります。

問題4:

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

  1. 1. SELECT last_name, MAX(salary) FROM employees;
  2. 2. SELECT last_name, salary FROM employees WHERE salary = MAX(salary);
  3. 3. SELECT last_name, MAX(salary) FROM employees
       GROUP BY last_name HAVING salary = MAX(salary);
  4. 4. SELECT last_name, MAX(salary) FROM employees GROUP BY MAX(salary);
  5. 5. SELECT last_name, salary FROM employees
    WHERE salary = (SELECT MAX(salary) FROM employees);

解答:5

解説
給与(salary)が全従業員の中で最も高い従業員のデータを出すのですが、これは副問合せを使用する必要があります。WHERE句に直接グループ関数であるMAX関数を記述することはできないのでWHERE salary = MAX(salary)はエラーとなります。

問題5:

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

  1. 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. 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. 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. 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で二つの問合せを連結するときの規則として、列数、データ型を揃えること、ORDER BY句で指定する列別名は一つ目の問合せで指定した列別名であること、ORDER BYは最後に一回だけ書くこと、といった規則があります。

問題6:

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

  1. 1. SELECT distinct first_name, last_name from employees;
  2. 2. SELECT distinct first_name, distinct last_name from employees;
  3. 3. SELECT first_name, distinct last_name from employees;
  4. 4. SELECT unique first_name, last_name from employees;

解答:1,4

解説
問合せ結果から重複を排除するには、DISTINCTキーワードもしくはUNIQUEキーワードを使います。DISTINCT, UNIQUEは置き換え可能です。DISTINCT, UNIQUEはSELECTキーワードの直後に記述することを押さえておくとよいでしょう。

問題7:

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

  1. 1. 元表との整合性を取るために定期的にリフレッシュする必要がある。
  2. 2. 同一の表を参照する複数のビューを作成できる。
  3. 3. グループ関数を使用しているビューを使って、行の削除はできない。
  4. 4. ビューを問い合わせる度に、新規に表が作成される。
  5. 5. ビューの列を実表の列と別の名前にすることはできない。

解答:2,3

解説
同一の表を参照するビューを複数作成することができます。また、グループ関数を使用しているビュー(複合ビューと言います)を使って行の削除をすることはできません。定期的にリフレッシュする必要があるのは、マテリアライズド・ビューというオブジェクトです。ビューの実態は問合せですので、ビューを問い合わせるたびにオブジェクトが作られることはありません。ビューの列名と実表の列名は揃える必要はありません。

問題8:

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

  1. 1. UPDATE emp SET last_name = NULL WHERE department_id = NULL;
  2. 2. UPDATE emp SET last_name IS NULL WHERE department_id IS NULL;
  3. 3. UPDATE emp SET last_name = NULL WHERE department_id IS NULL;
  4. 4. UPDATE emp SET last_name = 'NULL' WHERE department_id = NULL;
  5. 5. UPDATE emp SET last_name IS NULL WHERE department_id = 'NULL';

解答:3

解説
job_id列をNULLにセットするので、SET job_id=NULL となります。一方、WHERE句では、department_idがNULLの従業員を選択するので、department_id IS NULLという記述になります。WHERE 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. 1. SELECT句
  2. 2. FROM句
  3. 3. USING句
  4. 4. WHERE句
  5. 5. ORDER BY句

解答:4

解説
USINGを使ってdepartment_id列で結合しているので、この場合、WHERE句でdepartment_id列に表修飾(d.)を付けることはできません。そのためWHERE句でエラーとなります。

問題10:

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

  1. 1. select first_name, salary from employees
       offset 5 rows fetch next 1 rows only;
  2. 2. select first_name, salary from employees
       fetch 1 row offset 5 rows only;
  3. 3. select first_name, salary from employees
       fetch first row offset 5 rows only;
  4. 4. select first_name, salary from employees
       offset 5 rows fetch first row only;

解答:1,4

解説
Oracle Database 12cからの新しい書き方となります。
(必要に応じてORDER BY句、)OFFSET句、FETCH句の語順になります。

問題11:

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

  1. 1. 制約は複雑な問合せを簡単にする。
  2. 2. 制約名はSYS_Cで開始する名前で命名する必要がある。
  3. 3. 制約は、表の作成時および表を作成した後に作成できる。
  4. 4. Oracle Serverで定義できる制約は列レベルの制約のみである。
  5. 5. 外部キー制約が定義されている場合、参照されている表は削除できない。

解答:3,5

解説
制約は、CREATE TABLE文の中で定義することもできますし、ALTER TABLE文で既存の表に対して後から制約を追加することもできます。
外部キー制約が定義されている場合、参照されている親表は外部キー制約が削除されない限り削除できません。
複雑な問合せを簡単にするのはビューです。制約名は命名規則さえ満たせば、自由に指定できます。
Oracleでは表レベルの制約も指定できます。例えば複合主キーなどは表レベルでのみ定義できます。

問題12:

次のSQL文の実行結果として正しいものはどれですか?
SELECT TRUNC(45.923,-1) FROM DUAL;

  1. 1. 40
  2. 2. 45
  3. 3. 45.9
  4. 4. 45.92

解答:1

解説
TRUNC関数は切り捨ての関数です。切り捨ての位置が-1と指定されているので、一の位で切り捨てます。なお、TRUNC(45.923)の場合は、45となります。

問題13:

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

EMP表
----------------------------------------------------
ENAME VARCHAR2(35) -- 社員名
HIRE_DATE DATE -- 入社日

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

  1. 1. SELECT TO_NUMBER(hire_date + 7) FROM emp;
  2. 2. SELECT SYSDATE-hire_date FROM emp;
  3. 3. SELECT ADD_MONTHS(MIN(hire_date), 6) FROM emp;
  4. 4. SELECT TRUNC(hire_date) FROM emp;
  5. 5. SELECT MONTHS_BETWEEN(SYSDATE,hire_date) FROM emp;

解答:2,5

解説
日付から日付を引くと、その間の日数が数値で返されます。
MONTHS_BETWEEN日付関数は経過月数を数値で返します。

問題14:

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

  1. 1. SELECT e.first_name, e.last_name, d.department_name
       FROM departments d
       LEFT OUTER JOIN employees e USING (department_id);
  2. 2. SELECT e.first_name, e.last_name, d.department_name
       FROM departments d
       RIGHT OUTER JOIN employees e USING (department_id);
  3. 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. 4. SELECT e.first_name, e.last_name, d.department_name, l.city
       FROM departments d
       CROSS JOIN employees e;

解答:2

解説
部門に所属していない従業員も表示する、従業員のいない部門は表示しないということなので、片側外部結合となります。従業員側(employees)を全行表示することから、FROM departments d RIGHT OUTER JOIN employees eとなります。

問題15:

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

  1. 1. BLOB型
  2. 2. CLOB型
  3. 3. LONG型
  4. 4. TIMESTAMP型
  5. 5. BFILEP型

解答:3

解説
LONG型は下位互換のデータ型なので使用に当たりいくつかの制限があります。一つの表につきLONG型の列は一列までしか定義できません。

問題16:

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

  1. 1. ロックはCOMMITまたはROLLBACKコマンドを発行することではずれる。
  2. 2. SELECT句で指定しなかった列はロックがかからないため更新することができる。
  3. 3. WHERE句の条件に当てはまらない行は更新することができる。
  4. 4. SELECT FOR UPDATEが行われている表に対してDROP TABLEをするにはCASCADE CONSTRAINTS句を指定する。
  5. 5. SELECT FOR UPDATEを行ったセッション内であればデータを更新することができる。

解答:1,5

解説
SELECT FOR UPDATEを行うとロックが掛かります。そのロックはトランザクションの終了により解放されます。

問題17:

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

  1. 1. Primary key制約は一つの表に一つしか設定できない
  2. 2. Not null 制約は列制約構文でしか記述できない。
  3. 3. Unique key 制約は一つの表に複数設定することができる。
  4. 4. Check制約は一つの表に一つしか設定できない。
  5. 5. Foreign key 制約が設定されている列にはNULL値を入れることができる。

解答:4

解説
Check制約は一つの表につき、複数設定することが可能です。これ以外の選択肢はすべて正しい記述です。

問題18:

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

  1. 1. '10-APR-49'は、1949年4月10日である。
  2. 2. '10-APR-49'は、2049年4月10日である。
  3. 3. '10-APR-50'は、1950年4月10日である。
  4. 4. '10-APR-50'は、2050年4月10日である。

解答:2,3

解説
日付書式がDD-MON-RRの場合、RRは0~49の場合、20XX年を、50~99の場合、19XX年として解釈されます。

問題19:

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

  1. 1. DELETE文と同様にWHERE句を伴って行を削除することができるが、ROLLBACKすることができない。
  2. 2. 表に定義されている索引もあわせて削除する。
  3. 3. DELETE文よりも高速に削除できるため、特に表に大量のデータがある場合に利用すると効果的である。
  4. 4. 指定した列のデータを、一度にNULLに変更することができる。

解答:3

解説
TRUNCATE文はDDLのためUNDOデータを作りませんので、大量のデータ切り捨てのときに効果的です。
表をTRUNCATEすると、索引も合わせて切り捨てられます。削除されるわけではありません。
TRUNCATEはWHERE句を伴って使用することはできません。全行の切り捨てとなります。

問題20:

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

  1. 1. DDL文が発行された時
  2. 2. システム障害が発生し、データベースがダウンする直前
  3. 3. データベースがシステム障害から回復した直後
  4. 4. SQL*Plus等のツールを正常終了した時
  5. 5. 1時間(デフォルト)経過する間に、1度もトランザクション制御文が発行されない時

解答:1,4

解説
DDLが発行されたとき、暗黙的にコミットされます。また、SQL*Plusが正常に終了するとコミットされます。