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

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

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

 どうですか? このように、選択肢側に並んだSQLの中から正答を選ばせる方式も多く出題されます。

 この問題では選択個数を指定しませんでしたが、正しく選べましたか?

 正解は「C」ですね。列に別名(表示名)を付けるときには、列名の後ろに「スペース」または「AS」というキーワードを挟んで列別名を指定します。ただし、列別名は原則1単語で、どう書いたとしても全部大文字で表示されることになっていますので、出題のように、スペースが含まれる(2単語以上になる)場合や、大文字小文字も区別して出力したい場合には選択肢「C」のように、" "(ダブルクォーテーション)で囲みます。

 また、ダブルクォーテーションで囲んだ表記は大文字小文字、スペースも含めて、その通りに出力されます。なお、選択肢「D」のように関数を利用する必要はありません(できません)。

 では、もう一問やってみましょう。

例題 次のSQLを実行するとどうなりますか?

SELECT cust_name  AS "CUST_NAME", 
       cust_credit_limit/2 AS MID_AMOUNT, 
       MID_AMOUNT+300 AS "MAX LOWER LIMIT" 
FROM customers;

A SELECT句の列名の指定に別名が使用できないのでエラーになる

B SELECT句で指定している列名を別名に使用する場合(CUST_NAME)は、二重引用符で囲んではいけないのでエラーになる

C SELECT句で指定する列別名は二重引用符で囲まないといけないのでエラーになる

D 正常に処理されて結果が出力される


 これはいかがでしょうか。こちらの場合は、SQLが提示されて、結果がどうなるかを尋ねる問題です。やや難解で、複雑な印象を受けるSQLを提示する問題もよく出題されます。

 この場合の正解は「A」です。1つ前の例題と同様に列別名を指定しているケースですが、列別名が使える場所はORDER BY句のみ。従って、SELECT句の中で別の列を使用したいときには別名ではなく列名または計算式を再度書く必要がありますね。

 その他、この基本的構文、SQL関数の利用では、重複行の排除の仕方(DISTINCT)や、代替引用符「q'[ ... ]'」の使い方をはじめとするSELECT句の書き方や、WHERE句を利用した条件文の書き方などの問題が多数出力されます。組み合わせも多く、注意が必要なポイントです。

 こんなパターンの問題も出ます。

例題 次の2つの問い合わせについて正しいものを選択してください。

SQL> SELECT last_name, 
            department_id
      FROM  employees
     WHERE  department_id IN (50, 60, 70);
SQL> SELECT last_name, 
            department_id
       FROM employees
      WHERE department_id = 50 
         OR department_id = 60 
         OR department_id = 70;

A 2番目の問い合わせの方がパフォーマンスが高い

B 2番目の問い合わせの方がパフォーマンスが低い

C パフォーマンスは変わらない

D DEPARTMENT_ID列にNULL値がある場合のみ、2番目の問い合わせの方がパフォーマンスが高い


 SQLの書き方の違いによる性能に関する理解を問うものですね。ここではIN演算子で記述する場合と、OR演算子でつなげる場合の違いを確認していますが、答えは「C」です。

 INとORは内部的な処理の違いはないので、性能に差は出ません。書く量が少ない分INで記述した方がすっきりしていますね。このように、記述によるSQLの内部動作の差について出題しています。基本的なことばかりですが確認しておきましょう。

SQL関数の使い方に関する理解

 Oracle Database 12cになって、SQL関数が幾つか増えています。

例題 部門番号(department_id)が30番の部門の従業員名(last_name)を以下のように一行で表示させようと思います。どのSQLを利用すればいいでしょうか。

Emp_list                                                     Earliest
--------------------------------------------------------------- ---------
Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares              07-DEC-02

A

SELECT LISTAGG(last_name) 
       WITHIN GROUP ORDER BY (hire_date) "Emp_list",
       MIN(hire_date) "Earliest" 
FROM   employees 
WHERE  department_id = 30;

B

SELECT LISTAGG(last_name, '; ') 
       WITHIN GROUP (ORDER BY hire_date) "Emp_list", 
       MIN(hire_date) "Earliest" 
FROM   employees 
WHERE  department_id = 30;

C

SELECT LISTAGG(last_name, '; ') "Emp_list", 
       MIN(hire_date) "Earliest" 
FROM   employees 
WHERE  department_id = 30 
WITHIN GROUP ORDER BY hire_date;

D

SELECT LISTAGG(last_name, '; ') "EMP_LIST", 
       MIN(hire_date) "Earliest" 
FROM   employees 
WHERE  department_id = 30 
ORDER BY hire_date;

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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