連載
» 2014年03月31日 18時00分 公開

ORACLE MASTER Bronze Oracle Database 12c 「SQL基礎I」試験ポイント解説Oracle Master 12cの攻め方(2)(3/4 ページ)

[オラクルユニバーシティ 平賀博司,@IT]

 どうでしょうか。新機能ですのでキャッチアップしていないと、「何じゃこりゃ!?」という感じだと思います。SQL基礎Iといえども、このように新機能からも問題が出るのです。ちなみに、マニュアルをご覧になった方はお分かりかと思いますが、この設問は、マニュアル中で「LISTAGG()」の項に掲載されている例文そのままです。

 答えは「B」。ぜひOracle Database 12cになって追加された関数も確認しておきましょう。もちろん従来ある問題も出ますので、Oracle Database 11gまで使われていた関数もよく確認しておきましょう。

例題 次のSQLの実行結果はどれになりますか。

SELECT ROUND(TRUNC(156.25,-1),-2) FROM DUAL;

A 150

B 160

C 200

D エラーになる


 これは従来からある関数ですね。どの位置で切り捨てたり、四捨五入をするかを指定する引数が負の値のときにどう動作するかを理解しているか確認するものです。正解は「C」。

 最初に実行されるTRUNC関数で、1の位での切り捨てを行い、150になります。その後、外側のROUND関数が10の位で四捨五入するので、結果は200。怪しい方はぜひ試しておきましょう。

 この他、TO_CHAR関数を使った日付や数値の書式設定、NVL、NVL2、NULLIF、COALESCE関数、DECODEやCASE関数も微妙な違いをきちんと理解しておきましょう。これに関連して、NULL値の取り扱いや、ORDER BY句を付けているときにNULL値は先に出力されるのか、最後に出力されるのかの違い、さらに、それを逆転させるためのNULLS FIRSTやNULLS LASTというキーワードも出題対象になっていますので、確認しておきましょう。

複数の表の結合に関する理解

例題 全ての従業員の名前とその上司の名前を出力しようと考えています。

SELECT e.last_name "従業員名" || 'の上司は、' || m.last_name "上司名"
FROM   employees e ______________ employees m 
ON     e.manager_id = m.employee_id;

目的の出力を得るために下線部分にどれを記述しますか。


A JOIN

B RIGHT OUTER JOIN

C LEFT OUTER JOIN

D FULL OUTER JOIN


 結合に関する問題も頻出しますので、注意が必要です。ここでは、1999構文を活用して目的のデータを出力しようとしています。

 A〜Dまでの4つの違いは把握できていますか? どの表の該当データを全部出力するかについての違いですね。この問題では「全ての従業員の」と言っているので、従業員データを全て出力させる必要があります。FROMの後ろには同じ名前の表が並んでいますが、一方が「e」、もう一方が「m」です。どちらが従業員かは、SELECT句の別名から判断がつくので、e側を全部出力させましょう。

 というわけでここでは「C」が正解になります。同じ出力になるSELECT文をいわゆる「Oracle構文」でも記述できますので、書き変えてみてください。

 もう1つやってみましょう。

例題 従業員データ(employees表)と、部門データ(departments表)、拠点情報データ(locations表)を利用して、従業員番号(employee_id)、名前(last_name)、部門番号(department_id)、部門名(department_name)、拠点の町の名前(city)をリストしようと思います。正しいSQLを選択してください(全て選択してください)。


A

SELECT e.employee_id, 
       e.last_name, 
       d.department_id, 
       d.department_name, 
       l.city 
FROM   employees e JOIN departments d 
USING (department_id) JOIN locations l 
USING (location_id);

B

SELECT e.employee_id, 
       e.last_name, 
       d.department_id, 
       d.department_name, 
       l.city 
FROM employees e JOIN departments d JOIN locations l 
USING (department_id) 
USING (location_id);

C

SELECT e.employee_id, 
       e.last_name, 
       d.department_id, 
       d.department_name, 
       l.city 
FROM employees e JOIN departments d 
ON (e.department_id = d.department_id) 
JOIN locations l 
ON (d.location_id = l.location_id);

D

SELECT e.employee_id, 
       e.last_name, 
       d.department_id, 
       d.department_name, 
       l.city 
FROM employees e JOIN departments d 
ON (e.department_id = d.department_id) 
JOIN locations l 
USING (location_id);

 3つの表の結合もしっかり確認しておかないといけない部分ですね。またJOIN-USINGの利用とJOIN-ONの利用に関する注意事項も組み合わさるため、ややこしい問題になります。

 ここでは、JOIN−USINGを利用するときには「USING」に指定される列名に、表別名の修飾を付けてはいけないという注意があります。逆にJOIN-ONで記述する際には表明修飾が必要になることがあります。確認しておきましょう。

 ということで、この問題の正解は2つ。「C」「D」です。「D」はJOIN-ONとJOIN−USINGが混ざっていますが、これでも立派に動作します(普通は使いませんけどね)。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。