ここまで,「ORACLE MASTER Bronze SQL基礎I」の学習をしてきました。実際の試験を受験する前に,ここで8問の模擬問題に挑戦してみましょう。

問題1
次の中から,SQL*Plusコマンドをすべて選びなさい。

a.DESCRIBE
b.CREATE
c.UNIQUE

 正解はaです。

 「SQL*Plusコマンドなんて学習したかな?」と思った人もいらっしゃるかもしれません。しかし,SQLコマンドは学習しましたね。ということは,消去法で考えていけばよいのです。

 選択肢bの「CREATE」は,表や索引,順序などのデータベースオブジェクトを作成するときに使用するSQLコマンドでした(第9回参照)。

 また,選択肢cの「UNIQUE」は,一意制約を宣言するときのキーワードでした(第9回参照)。

 ということは,選択肢aが残ります。選択肢aの「DESCRIBE」は,表の列定義を確認するときに使用するSQL*Plusコマンドです。「DESC」と略して使用することが多いので,間違えてしまった人は,第2回を見直してください。試験テクニックとして,消去法を使うのは良い方法ですが,できれば正統法(これが正解!とわかる)で解答したいですものね。

問題2
次の結果になるのはどれですか?

SAL DEPTNO
---------- ----------
5000 10
3000 30
3000 20
2850 30
2450 10

a. ORDER BY SAL,DEPTNO DESC;
b. ORDER BY SAL DESC,DEPTNO DESC;
c. ORDER BY SAL DESC,DEPTNO ASC;

 正解はbです。

 問題1の「DESCRIBE」は,「DESC」と略すことができましたが,この問題の「DESC」とは,関係ありません。この問題の「DESC」は「DESCENDING」の略で,値を降順に並べ替えるときに使用します。ORDER BY句は複数の列を指定することができますが,1列ずつ昇順(ASC:ASCENDING),降順(DESC:DESCENDING)を指定することができます。省略した場合は,昇順です。

 問題文中の検索結果は,SAL列の値の降順に並んでいます。従って,この時点で選択肢aは間違っていることがわかります。選択肢aのDESCは,直前のDEPTNO列のみを修飾し,SAL列には影響を与えません。

 次に,SAL列の値が同じ(SALが3000)の行を見てみると,DEPTNO列の値も降順に並んでいます。従って,選択肢bが正解であることがわかります。ORDER BYについて復習したい人は,第2回をご覧ください。

問題3
emp表は社員表です。empno列は社員番号,mgr列は直属の上司の社員番号,ename列は社員名を表します。部下のいる社員を出すSQLとして,正しいものを選びなさい。

a.
SELECT m.ename FROM emp m
WHERE m.empno in (SELECT s.mgr FROM emp s);
b.
SELECT m.ename FROM emp m
WHERE m.mgr in (SELECT s.empno FROM emp s);
c.
SELECT m.ename FROM emp m
WHERE (m.mgr,m.empno) in (SELECT s.empno,s.mgr FROM emp s);

 正解はaです。

 こういう問題は,副問合せ(第7回参照)から解読していきましょう。

 選択肢aは,副問合せで社員表から上司の社員番号を求めています。つまり,社員の誰かに,「私の上司です」と言ってもらっている人の社員番号です。それを,主問合せで自分の社員番号かどうか判断しているのですから,この選択肢が正解です。なお,emp表に「s」(部下表)と「m」(上司表)という別名を付けていることに注意してください。

 選択肢bの副問合せは,社員表から社員番号を求めているだけです。それを主問合せで上司の社員番号と比較していますが,これでは,自分の上司が社員表に存在しているかどうかを評価しているだけです。上司は全員社員でしょうから,MGR列がNULLでないすべての社員が検索されるだけなので,正解ではありません。

 選択肢cのように,2列以上を戻す副問合せを,「複数列副問合せ」と言います。副問合せから戻される列の値の組み合わせが,主問合せの列の組み合わせと一致するかどうかを比較します。「上司の社員番号(mgr)と社員番号(empno)」の組み合わせが「社員番号(empno)と上司の社員番号(mgr)」の組み合わせと一致するかどうかを評価するわけですから,一致する行があるとしたら,「私の上司は私の部下」である行を探しているようなものです。

 次の問題は,問題3と同じ内容を副問合せではなく,結合(第5回を参照)で考えてみてください。