←ホームへ戻る




問1 ..................................................................................................

ロックに関する説明として正しいものを全て選びなさい。

a. ロックは、明示的に行うことが可能
b. データのINSERT/UPDATE/DELETEを行うと、暗黙的にロックがかかる
c. Oracleはデフォルトで、表ロックを行う
d. トランザクションをCOMMIT/ROLLBACKするとロックは解除される
      

→回答と解説



問2 ..................................................................................................

下記の EMP表にデータをINSERTする為に使用できる文として正しいものをすべて選びなさい。

SQL> DESC EMP
名前   NULL?     型
-----  --------  ------------
EMPNO  NOT NULL  NUMBER(4)
ENAME            VARCHAR2(10)
SAL              NUMBER(7)


a. INSERT INTO EMP(empno) VALUES(1111,'JOHN',2000);
b. INSERT INTO EMP(empno,ename,sal) VALUES(1111,'JOHN',2000);
c. INSERT INTO EMP(*) VALUES(1111,'JOHN',2000);
d. INSERT INTO EMP VALUES(1111,2000);
e. INSERT INTO EMP VALUES(1111,'JOHN',2000,10);
      

→回答と解説



問3 ..................................................................................................

VIEWに対してSELECT文を発行した場合の動作として、正しいものを選びなさい。
ただし、不要な動作が1つ含まれて居ます。

1. VIEWの元になる表のアクセス権限を確認する
2. VIEWへのSELECT文を、VIEW定義のSELECT文に変換する
3. VIEWの元になる表が存在するか確認する
4. データディクショナリから、VIEWの定義情報を確認する
5. VIEWの元になる表からデータを検索する

a. 3-1-2-5
b. 4-3-2-5
c. 3-4-1-5
d. 4-2-1-5
e. 4-1-2-5
      

→回答と解説



問4 ..................................................................................................

下記の WHERE句の条件と同じものを1つ選びなさい。

WHERE ename IN ('SMITH','ADAMS')

a. WHERE ename = ('SMITH','ADAMS')
b. WHERE ename like ('SMITH','ADAMS')
c. WHERE ename = 'SMITH' and ename = 'ADAMS'
d. WHERE ename = 'SMITH' or ename = 'ADAMS'
      

→回答と解説



問5 ..................................................................................................

EMP 表を検索する SQL文について、 DEPTNO列を昇順、 EMPNO列を昇順にソート
しているSELECT文を2つ選びなさい。

a. SELECT deptno,empno,ename FROM emp ORDER BY deptno,empno DESC;
b. SELECT ename,job FROM emp ORDER BY empno,deptno;
c. SELECT deptno,empno,ename FROM emp ORDER BY 1,2,3;
d. SELECT ename,job FROM emp ORDER BY deptno,empno;
e. SELECT deptno,empno,ename FROM emp ORDER BY 1,2;
      

→回答と解説



問6 ..................................................................................................

ビューを通した更新について、データを変更できないのは、ビューにどのような
要素が含まれている場合か。下記の中から、当てはまるものを4つ選びなさい。

a. WHERE句
b. GROUP BY句
c. NOT NULL制約付の列をビューに定義していない
d. DISTINCTキーワード
e. 式によって定義された列
f. グループ関数
      

→回答と解説



問7 ..................................................................................................

従業員(EMP)表を検索するための下記の SQL文がエラーとなる場合、
考えられる理由として正しいものを選びなさい。

SELECT empno,ename,sal FROM emp
 WHERE deptno = (SELECT deptno FROM emp WHERE sal = (select max(sal) from emp));

a. 給与(sal)がNULLの社員がいる
b. 給与(sal)が一番高いユーザが配属(deptno)が決まっていない
c. 給与(sal)が一番高いユーザが2人以上いる
d. 副問合せの階層が深すぎる
      

→回答と解説



問8 ..................................................................................................

システム権限が必要ない操作を、下記から選びなさい。

a. 自分のスキーマへの表作成
b. 他スキーマへの表作成
c. 自分のスキーマの表へのDELETE操作
d. ユーザの作成
e. ロールの作成
      

→回答と解説



問9 ..................................................................................................

新規にユーザSCOTT を作成するための SQL文として正しいものを選びなさい。
パスワードはTIGERとし、表領域TBS01に 100MBのクォータを設定するものとします。

a. CREATE USER scott/tiger QUOTA 100m ON TBS01;
b. CREATE USER tiger IDENTIFIED scott QUOTA 100m ON TBS01;
c. CREATE USER scott IDENTIFIED tiger QUOTA 100m ON TBS01;
d. CREATE USER scott IDENTIFIED BY tiger QUOTA 100m ON TBS01;
      

→回答と解説



問10 ................................................................................................

EMP 表より、下記の条件に合う社員を求めるSQL 文を選びなさい。
・全社員平均以上の給与である
・SMITH・ALLEN・JONESのいづれかと同じ部門に所属する

a. SELECT empno,ename FROM emp WHERE sal >= avg(sal) AND
   deptno IN (SELECT deptno FROM emp WHERE ename IN ('SMITH','ALLEN','JONES'));
b. SELECT empno,ename FROM emp WHERE sal >= (SELECT avg(sal) FROM emp) AND
   deptno IN (SELECT deptno FROM emp WHERE ename IN ('SMITH','ALLEN','JONES'));
c. SELECT empno,ename FROM emp WHERE sal >= (SELECT avg(sal) FROM emp) AND
   deptno = (SELECT deptno FROM emp WHERE ename IN ('SMITH','ALLEN','JONES'));
d. SELECT empno,ename FROM emp WHERE  >= avg(sal) OR
   deptno = (SELECT deptno FROM emp WHERE ename IN ('SMITH','ALLEN','JONES'));
e. SELECT empno,ename FROM emp WHERE sal <= (SELECT avg(sal) FROM emp) AND
   deptno IN (SELECT deptno FROM emp WHERE ename IN ('SMITH','ALLEN','JONES'));
      

→回答と解説



回答と解説(問1)・・・答え:a,b,d
ロックは、複数のユーザによる更新があった場合、同時に更新させないことで、データの
整合性を保障するメカニズムです。
ロック中に問合せがあった場合、更新前データを問合せ結果として戻します。これは、ロ
ールバックセグメントのUNDOレコードを使用した読み取り一貫性により実現されます。

また、Oracleでは、デフォルトで行レベルロックを採用しています。
通常、 DML文(INSERT/UPDATE/DELETE)を実行すると、暗黙的に行ロックが取得されます。
また、SELECT文はロックを行いませんが、明示的にロックを行うSELECT...FOR UPDATE の
場合は、行ロックが取得されます。
表自体のロック(表ロック)を明示的に行うには、LOCK TABLE文を使用します。

トランザクションがCOMMIT/ROLLBACKされると、取得されていたロックは解除されます。
      



回答と解説(問2)・・・答え:b
INSERT文:
INSERT INTO 表名 [(列名,列名…)] VALUES (値,値…);

・全列に値を指定する場合、[列名]を省略できる(表の列定義の順序に従って、値を記述)
・列名を使用する場合、列名の数と VALUES句の値の数・指定順序を一致させる

選択肢「a」は、列名と値の数が一致しません。
また、選択肢「d」「e」 は、値が足りないor多いため、エラーになります。
選択肢「c」は、全列を選択したい場合は、列指定「(*)」自体を省略します。

従って、正解は「b」となります。
      



回答と解説(問3)・・・答え:e
一つまたは複数の表をもとにした仮想的な表をビュー(VIEW)と呼びます。実際のデータは
含まず、元表へのSELECT文のみ定義します。よって、ユーザはビューに定義された表の列や
データといった、限られた範囲でのみデータにアクセスすることが可能であり、元表に存在
する列であっても、ビューに定義されていなければ、アクセスすることはできません。

また、複数の表を結合して1つのビューとすることもできます。ビューを通してアクセスし
た場合、ユーザはビューの元になる表構造を意識せずに使用することができます。ただし、
ビューに対してインデックスを作成することはできません(実データを持っていませんので)。

※単一ビュー
・1つの表から構成される
・関数を含まない
・グループを含まない
・ビューからの挿入・更新・削除が可能

※複合ビュー
・複数の表から構成される
・関数を含む
・グループを含む
・条件付で、ビューからの挿入・更新・削除が可能
      



回答と解説(問4)・・・答え:d
比較条件には、下記のようなものがあります。
=		等しい
!=		等しくない
<>		等しくない
^=		等しくない
>=		以上
<=		以下
>		より大きい
<		より小さい 
BETWEEN a AND b			a以上b以下
NOT BETWEEN a AND b		a以上b以下の範囲外
IN (list1,list2…)		(リスト)のいずれかと等しい
NOT IN (list1,list2…)	(リスト)のいずれとも等しくない
IS NULL		ヌル値である
IS NOT NULL	ヌル値でない
LIKE		文字パターンと一致する
NOT LIKE	文字パターンと一致しない 


問題の「WHERE ename IN ('SMITH','ADAMS')」は、「enameがSMITHかADAMS」である
という条件の為、「WHERE ename = 'SMITH' or ename = 'ADAMS'」が正解となります。
      



回答と解説(問5)・・・答え:d,e
検索結果をソートするには、ORDER BY句を使用します。デフォルトでは、昇順にソート
されますが、 ASCを明示的に記述することもできます。また、降順に並べ替えるには、
DESCを使用します。

ORDER BY 列,列 [ASC|DESC] [,列[ASC|DESC],・・・]

・ORDER BY句は、複数列を指定することができます
・ORDER BY句は、SELECT文の最後に記述します
・選択していない列を、ORDER BY句で指定することもできます
・列名・式・列別名で指定します
・列番号で指定することもできます
・NULL値は、無限大として扱われます

よって、解答の「d」「e」は上記にあてはまります。
選択肢「a」は、降順にソートしているので正解ではありません。
選択肢「b」は、列の順番が逆になっていますので正解ではありません。
選択肢「c」は、ENAME列でのソートが入っていますので正解ではありません。
      



回答と解説(問6)・・・答え:b,d,e,f
ビューに対する更新(UPDATE)・挿入(INSERT)は、下記のようになっています。

◆ビューを通した更新
ビューに下記のいずれかが含まれていなければ、ビューから行の値を更新可能
・グループ関数
・GROUP BY句
・DISTINCTキーワード
・ROWNUM擬似列
・式によって定義された列

◆ビューに対する挿入
ビューに下記のいずれかが含まれていなければ、ビューから行の値を挿入可能
・グループ関数
・GROUP BY句
・DISTINCTキーワード
・ROWNUM擬似列
・式によって定義された列
・NOT NULL制約付の列をビューに定義していない

分かりにくいかもしれませんが、ビューは実データを持たないので、
ビューのデータを変更するということは、元表のデータを変更することになります。

例えば、元表に5つのカラムがあり、ビューには3つのカラムしか定義されていない
場合、ビューに対してINSERT文を発行すると、元表にはNOT NULL制約付のカラムがあ
っても、ビューにそのカラムがない場合は、元表のカラムにデータを入れられず、エ
ラーになります。

そのように考えれば、上記の制約は当然といえば当然の動作ですね。
      



回答と解説(問7)・・・答え:c
上記の SQLは、給与(sal)が一番高いユーザの所属(deptno)と一致するデータを
検索しています。
選択肢「a」「b」「d」は、エラーとはなりません。
選択肢「c」は、「sal = (給与が一番高いユーザ)」であり、「=」を使用している
ことから、単一行副問合せです。よって、(給与が一番高いユーザ)は1人である
必要があります。2人以上いた場合は複数行が返されるため、エラーとなります。
      



回答と解説(問8)・・・答え:c
「c.自分のスキーマの表へのDELETE操作」にはシステム権限は必要ありません。
オブジェクトの所有者は、オブジェクト権限により DML操作が可能です。

その他の選択肢については、下記のシステム権限が必要になります。
a. 自分のスキーマへの表作成:CREATE TABLEシステム権限
b. 他スキーマへの表作成:CREATE ANY TABLEシステム権限
d. ユーザの作成:CREATE USERシステム権限
e. ロールの作成:CREATE ROLEシステム権限
      



回答と解説(問9)・・・答え:d
ユーザの作成は、下記の SQL文にて行います。

CREATE USER ユーザ名 IDENTIFIED {BY パスワード | EXTERNALLY | GLOBAL AS '認証名'}
[DEFAULT TABLESPACE デフォルト表領域名]
[TEMPORARY TABLESPACE 一時表領域名]
[QUOTA {領域割当サイズ[K|M] | UNLIMITED} ON 表領域名
[PASSWORD EXPIPE]
[ACCOUNT {LOCK | UNLOCK}]
[PROFILE {プロファイル名 | DEFAULT}];

よって、正解は「d」になります。
      



回答と解説(問10)・・・答え:b
それぞれの条件について見てみます。

「全社員平均以上の給与である」は次のようになります。
sal >= (SELECT avg(sal) FROM emp)

「SMITH・ALLEN・JONESのいづれかと同じ部門に所属する」は次のようになります。
deptno in (SELECT deptno FROM emp WHERE ename in ('SMITH','ALLEN','JONES'));

上記二つの条件を満たすため、「AND」で条件をつなぎます。
よって正解は「b」になります。

尚、選択肢「a」「d」は「sal >= avg(sal)」となっているので間違いです。
また、選択肢「c」「d」は複数行副問合せのため、「=」ではなく「IN」を使用する
必要があります。(「d」については、ORではなくANDでつなぐ必要もあります)
最後に、選択肢「e」は、「sal <= (SELECT avg(sal) FROM emp)」の「<=」部分が間
違っています。正しくは、「>=」となります。
      












Copyright © 2006 mari. All rights reserved.