実力試験・2006年秋編! ORACLE MASTER Bronze SQL基礎I

実力試験・2006年秋編!
ORACLE MASTER Bronze SQL基礎I

有限会社 G.F.インフィニティ (Project - ∞)
2006/10/21

  解説1

正解:4

参考:Oracleで使うSQLの基礎を学ぶ

 列見出しを変更する列別名は、「列名 列別名」のように列名の後にスペースで区切って、または「列名 AS 列別名」とASキーワードを使用して記述します。

 ここで注意が必要なのは、「TABLE」がデータベースの予約語であることです。そのままでは使用できません。

SQL> SELECT col1 TABLE FROM tab1;
SELECT col1 TABLE FROM tab1
            *
行1でエラーが発生しました。: ORA-00923: FROMキーワードが指定の位置にありません。

SQL> SELECT col1 AS TABLE FROM tab1;
SELECT col1 AS TABLE FROM tab1
                    *
行1でエラーが発生しました。: ORA-00923: FROMキーワードが指定の位置にありません。

 列別名に予約語を使用したり、大文字/小文字を区別したり、スペースや特殊記号(#や$など)を使用したりする場合は、二重引用符(")で囲む必要があります(正解4)。

   問題ページへ


  解説2

正解:3

参考:SQL問い合わせによる行の制限とソート

 条件式に複数の条件があるときは、優先順位に従って処理が行われます。AND、ORではANDが優先されます。OR条件を優先して使用するには「()」で囲む必要があります。

 正解3のように「()」で囲むことにより、「部門番号10の部署に所属し、かつ入社日が1982年以降または職種がCLERKである」という条件になり、1行のみが取り出されます。

 不正解となる選択肢1、2、4の方法ではAND条件が先に処理されてしまうため、「部門番号10の部署に所属し入社日が1982年以降。もしくは職種がCLERKである」という条件になります。

   問題ページへ


  解説3

正解:2

参考:SQLで使える関数の基礎知識

 データに任意の値を埋め込むには、文字関数RPADまたはLPADを使用します。この問題では左側に値xが埋め込まれているため、LPADを使用していることになります(正解2)。

 LPADは文字データを右ぞろえにします。LPAD('str1', m, 'str2')のように3つの引数を取り、文字列str1がmで指定した文字数になるように文字列str2を左側に埋め込みます。

 ほかの選択肢の不正解の理由は次のとおりです。

選択肢1
RPADは、文字データを左ぞろえにします。RPAD('str1', m, 'str2')のように3つの引数を取り、文字列str1がmで指定した文字数になるように文字列str2を右側に埋め込みます。

選択肢3
RTRIMは、文字データの末尾(右)のみ切り捨てます。TRIM(文字データの前後の文字を切り捨てる)の一部を実行できる関数です。RTRIM('str1','str2')のように2つの引数を取り、文字列str1の中から末尾に出現したstr2を切り捨てます。

選択肢4
LTRIMは、文字データの先頭(左)のみ切り捨てます。TRIM(文字データの前後の文字を切り捨てる)の一部を実行できる関数です。LTRIM('str1','str2')のように2つの引数を取り、文字列str1の中から先頭に出現したstr2を切り捨てます。

   問題ページへ


  解説4

正解:1

参考:SQLで使える関数の基礎知識

 指定した曜日となる次の最も近い日付を求めるには、日付関数NEXT_DAYを使用します。また、表示書式を変更するにはTO_CHARを使用します(正解1)。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢2
NEXT_DAYによる戻り値をTO_DATEにて日付データ型に変換するという文になってしまい、戻り値が「MM"月"DD"日"」という書式でないため、エラーとなります。

選択肢3、4
LAST_DAYは、指定した日付が含まれる月の月末の日付を求めます。引数として曜日を指定するものではないため、エラーとなります。

   問題ページへ


  解説5

正解:3

参考:SQLで複数の表からデータを取り出す

 NATURAL JOIN句による結合では、2つの表の同じ名前の列すべてが結合条件として使用されます。この問題では、DEPTNOとMGR_ID列が結合条件となり、一致する行を結果として戻します(正解3)。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢1
次の文を実行した結果です。
SELECT * FROM emp JOIN dept USING (deptno);
USING句を使用することで、同じ名前の列のうち一部のみを結合条件にすることができます。

選択肢2
次の文を実行した結果です。
SELECT * FROM emp JOIN dept USING (mgr_id);
USING句を使用することで、同じ名前の列のうち一部のみを結合条件にすることができます。

選択肢4
次の文を実行した結果です。
SELECT * FROM emp CROSS JOIN dept;
クロス結合では、すべての組み合わせを結果として表示します。

   問題ページへ


  解説6

正解:4

参考副問い合わせの構文を覚える

 FROM句に副問い合わせを使用し、副問い合わせ内でORDER BY句を使用することで、ソート済みの結果の集合を作成することができます。主問い合わせ側でROWNUM疑似列を使用して取得したい行を限定すれば、上位N個だけを戻すことができます(正解4)。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢1
副問い合わせでソートを行わないと、ROWNUM疑似列は表内の現在の格納順序どおりに行に連番を振ってしまいます。従って最初の3行のみが昇順にソートされ、次のような結果が表示されます。

 EMPNO ENAME      SALARY MGR_ID DEPTNO
------ ---------- ------ ------ ------
   200 Jennifer     4400    101     10
   202 Pat          6000    201     20
   201 Michael     13000    100     20

選択肢2
選択肢1同様、最初の3行のみに対して降順にソートが行われ、次のような結果が表示されます。

 EMPNO ENAME      SALARY MGR_ID DEPTNO
------ ---------- ------ ------ ------
   201 Michael     13000    100     20
   202 Pat          6000    201     20
   200 Jennifer     4400    101     10

選択肢3
ORDER BY句でDESCを省略すると、昇順にソートが行われます。そのため、次のような結果が表示されます。

 EMPNO ENAME      SALARY MGR_ID DEPTNO
------ ---------- ------ ------ ------
   200 Jennifer     4400    101     10
   202 Pat          6000    201     20
   203 Susan        6500    101     40

   問題ページへ


  解説7

正解:3

参考:副問い合わせの構文を覚える

 UNIONは、集合演算子の1つです。各問い合わせで選択されたすべての行を戻すために使用されます。重複する値は排除して戻されます(正解3)。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢1
MINUSを使用した場合の結果です。MINUSは、1つ目の問い合わせで選択された行から、2つ目の問い合わせで選択された行を取り除いた結果を戻します。

SELECT col1, col2 FROM tab1
MINUS
SELECT col1, col2 FROM tab2;

選択肢2
INTERSECTを使用した場合の結果です。INTERSECTは、両方の問い合わせで選択された行を戻します。

SELECT col1, col2 FROM tab1
INTERSECT
SELECT col1, col2 FROM tab2;

選択肢4
UNION ALLを使用した場合の結果です。UNION ALLは、UNIONと同じく各問い合わせで選択されたすべての行を戻しますが、重複した値もそのまま戻される点が異なります。

SELECT col1, col2 FROM tab1
UNION ALL
SELECT col1, col2 FROM tab2;

   問題ページへ


  解説8

正解:3

参考:SQLでデータを自在に操作する

 トランザクションのロールバックでは、事前にセーブポイントを設定しておくことで、全体でなくセーブポイントまでをロールバックすることもできます(正解3)。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢1
あるトランザクションで変更中のデータをほかのトランザクションから参照することはできません。読み取り一貫性により、変更前の値が戻されます。

選択肢2
データを変更すると「UNDOブロック」と呼ばれる変更前のイメージが保存されます。REDOレコードも作成されますが、こちらは変更前後の情報を保存し、回復処理に使用されます。

選択肢4
トランザクションは、COMMIT、ROLLBACKだけでなく、DDLやDCLによる暗黙コミットで完了することもできます。また、ユーザーがSQL*Plus、iSQL*Plusを切断したときやシステムがクラッシュしたときもトランザクションが終了します。

   問題ページへ


  解説9

正解:2、3

参考:SQLで表のデータを制限する
         「SQLで便利なオブジェクトを使いこなす

 Oracleデータベースにおけるオブジェクトにはさまざまな種類がありますが、基本的なものとして以下があります。

・表 データを格納する基本となるオブジェクト。定義として列を持ち、行を格納する
・ビュー 1つ以上の表データの問い合わせ結果を表示するための論理的な定義。SELECT文に名前を付けたもの
・シノニム オブジェクトの別名
・索引 問い合わせのパフォーマンスを向上させるため、列値と行へのポインタを格納したもの
・順序 一意的な番号を生成する

 選択肢のうち、正しいものは2と3です。そのほかの選択肢の不正解の理由は次のとおりです。

選択肢1
問い合わせのパフォーマンスを向上できるのは索引の特徴です。シノニムはオブジェクトの別名であり、便宜性を提供します。

選択肢4
ビューの作成時に「FORCE」オプションを使用することで、基礎表が存在しない場合でもビューを作成することが可能です。

選択肢5
順序は一意な番号を生成することができますが、連番であることは保証しません。メモリのクラッシュ時やロールバックされた場合は空番ができることになります。

   問題ページへ


  解説10

正解:1

参考:SQLで便利なオブジェクトを使いこなす

 ビューを作成するには、CREATE VIEW ... AS SELECT文を使用します。ビューの作成SELECT文で列別名を使用しない場合は、元の列名がビューにおける列名になります。そのため、列の計算や関数を使用した列が含まれる場合は、列別名(ここではyeas_sal)を使用する必要があります。

   問題ページへ


IT資格試験の模擬問題をWebベースで学習できる@IT自分戦略研究所の新サービス「@IT資格攻略」では、Bronze SQL 基礎 IをはじめOracle関連の資格をテーマとして取り上げています。Bronze DBA 10gも近日中に追加予定です。「無料お試し版」もありますので、記事と併せてご覧ください。

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。