助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26571
問題を開く
EMPLOYEES表の構造を確認して下さい。
EMPLOYEES表のEMPLOYEE_ID列にはPRIMARY KEY制約だけが定義されています。



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

 CREATE TABLE employees2 (id, name, hiredate DEFAULT SYSDATE, sal CHECK (sal > 100000))
  AS
 SELECT employee_id, employee_name, hiredate, salary
 FROM employees;

正解

表が作成されるが、ID列にはPRIMARY KEY制約は定義されない

解説

副問合せによる表の作成時、データ型とNOT NULL制約は問合せた表から新たに作成する表へとコピーされますが、NOT NULL制約以外の制約やデフォルト値はコピーされません。
ただし、副問合せによる表の作成時にデフォルト値を設定したり、制約を定義することはできます。

設問のSQL文では、HIREDATE列にデフォルト値を、SAL列にCHECK制約を定義しています。
また、ID列は、EMPLOYEES表のPRIMARY KEYであるEMPLOYEE_ID列をコピーしていますが、PRIMARY KEY制約はコピーされないため、ID列にはPRIMARY KEY制約は定義されません。

以上より、
・表が作成されるが、ID列にはPRIMARY KEY制約は定義されない
が正解となります。

その他の選択肢については次のとおりです。

・副問合せを使用した表の作成では、CREATE TABLE文でDEFAULT値を設定できないため、エラーとなる
・副問合せを使用した表の作成では、CREATE TABLE文で制約を定義できないため、エラーとなる
副問合せによる表の作成時、列のデフォルト値を設定したり、制約を定義したりすることができます。

・表が作成され、ID列にはNOT NULL制約が定義される
EMPLOYEES表のEMPLOYEE_ID列にはPRIMARY KEY制約が定義されていますが、明示的なNOT NULL制約は定義されていません。PRIMARY KEY制約の定義により暗黙的に作成されたNOT NULL制約は、副問合せによって新たに作成される表にコピーされません。明示的に定義されたNOT NULL制約だけが、副問合せによって新たに作成された表にコピーされます。

・列のデータ型が指定されていないため、エラーとなる
副問合せを使用した表の作成では、列のデータ型は指定できません。

参考

CREATE TABLE文と副問合せを使用して、既存の表から新しい表を作成することができます。この時、表構造をコピーして新しい表を作成するだけでなく、副問合せで取り出したデータも同時にコピーすることができます。
副問合せを使用して新しい表を作成するには、次のように記述します。

 CREATE TABLE 表名[(列名 [, 列名 …])]
  AS
  副問合せ

 
 
SQLを表示
CREATE TABLE employees2 (id, name, hiredate, job, dept)
 AS
SELECT employee_id, employee_name, hiredate, job_id, department_id
FROM employees;

SELECT * FROM employees2;


CREATE TABLE文に指定する列名の数と、副問合せのSELECT句に指定する列名(列別名)の数は、同数にしなければなりません。

CREATE TABLE文の列名を省略すると、副問合せのSELECT句に指定された列名または列別名と同名の列が定義されます。


 
SQLを表示
CREATE TABLE employees2
 AS
SELECT employee_id, employee_name, hiredate, job_id, department_id
FROM employees;

SELECT * FROM employees2;


なお、副問合せのSELECT句に計算式や関数を指定する場合は、計算式や関数に列別名を指定するか、CREATE TABLE文で列名を指定しなければなりません。


 
SQLを表示
CREATE TABLE employees2
 AS
SELECT employee_id, employee_name, salary*12+commission
FROM employees;



 
SQLを表示
CREATE TABLE employees2
 AS
SELECT employee_id, employee_name, salary*12+commission sal
FROM employees;



 
SQLを表示
CREATE TABLE employees2
(emp_id, emp_name, sal)
 AS
SELECT employee_id, employee_name, salary*12+commission
FROM employees;


また、副問合せによる表の作成では、制約やデフォルト値に関する次の規則があります。

[データ型の指定はできない]
データ型は副問合せのSELECT句に指定した列のデータ型、または式の値のデータ型から自動的に定義されるため、CREATE TABLE文にデータ型を指定するとエラーとなります。


 
SQLを表示
CREATE TABLE employees2 (id NUMBER(2))
 AS
SELECT employee_id FROM employees;


[デフォルト値を設定できる]
副問合せによる表の作成時、新たに作成する表にデフォルト値を設定できます。


 
SQLを表示
CREATE TABLE employees2
(id, name, hiredate DEFAULT SYSDATE)
 AS
SELECT employee_id, employee_name, hiredate
FROM employees;

INSERT INTO employees2 (id, name) VALUES (1, 'Tanaka');

SELECT * FROM employees2
WHERE id = 1;


[制約を定義できる]
副問合せによる表の作成時、新たに作成する表に制約を定義することができます。


 
SQLを表示
CREATE TABLE employees2 (id PRIMARY KEY)
 AS
SELECT employee_id FROM employees;

INSERT INTO employees2 VALUES (1);

INSERT INTO employees2 VALUES (1);


[NOT NULL制約のみ引継がれる]
列に定義されているデフォルト値や制約のうち、明示的に定義されたNOT NULL制約だけが、副問合せによって新たに作成された表にコピーされます。
PRIMARY KEY制約、UNIQUE制約、FOREGIN KEY制約、CHECK制約、デフォルト値はコピーされません。


 
SQLを表示
CREATE TABLE employees2
(id NUMBER(2) PRIMARY KEY,
name VARCHAR2(10) NOT NULL
);

CREATE TABLE employees3
 AS
SELECT * FROM employees2;

DESC employees3;
上に戻る

NOT NULL制約

投稿日 2023/08/06

以下の解説について

EMPLOYEES表のEMPLOYEE_ID列にはPRIMARY KEY制約が定義されていますが、NOT NULL制約は定義されていないため

画像では、EMPLOYEES表のEMPLOYEE_ID列にNOT NULL制約は定義されているように見えるのですが、気のせいでしょうか?

2023/08/08 13:52

問題文の冒頭に「EMPLOYEE_ID列にはPRIMARY KEY制約だけが定義されています」とあるので、画像の「NOT NULL」は、明示的に付与したNOT NULL制約というわけではなく、PRIMARY KEY制約を付与した際に暗黙的に作成されたものだと判断できると思います。

運営さんに修正してもらうとしたら、明示的か暗黙的かを明記してもらうぐらいでしょうか。
実際の試験において、どの程度明確な問題文が提示されるかはわかりませんが...。


コメント

k k23szk

2023/08/08 19:30

>PRIMARY KEY制約を付与した際に暗黙的に作成されたものだと判断できると思います。 →そうですね。この点を意識していませんでした。

この返信に対して
コメントを記入できます

スタッフからの返信

s staff_ishii

2023/08/08 14:08

k23szk さん ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

この投稿に対して返信しませんか?