ORACLE MASTER Bronze SQL基礎I 編春のBronze実力試験(2/2 ページ)

» 2006年05月12日 00時00分 公開
前のページへ 1|2       

解説1

正解:b

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

 リレーショナルデータベースにおける「選択」とは、特定の行のみを取得することです。特定の行の取得を表しているのは正解bの図です。

 不正解となる選択肢aは、特定の列のみの取得を表しています、これは「射影」という処理です。選択肢cは、選択と射影を組み合わせることで列と行の一部を取得しているといえます。選択肢dは、複数の表からの値の取得を表しています。これは「結合」の処理です。

解説2

正解:c

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

 IN演算子は、列の値が()内の値リストのいずれかと等しい行を取得します。IN演算子と同じ処理を行うには、正解cのように等価(=)条件をORで連結します。

 不正解となる選択肢bは、次のようにNOT IN演算子を使用した場合と等しい結果になります。

SELECT * FROM emp WHERE deptno NOT IN (10,30);

 選択肢dのようにANDで連結してしまうと、どの行も取得できないことになりますね。注意しましょう。

解説3

正解:a

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

 文字データを小文字に変換するには、LOWER関数を使用します(正解a)。

 不正解となる選択肢を見てみましょう。UPPERはすべて大文字(選択肢b)、INITCAPは先頭を大文字、残りを小文字に変換します(選択肢d)。INSTR関数は指定した文字が出現する位置を戻す関数です(選択肢c)。

解説4

正解:d

参考:SQLで使える関数の基礎知識
   「SQLの関数を使いこなす

 日付データ型は、減算(?)して差分の日数を求めることはできますが(選択肢c)、加算(+)することはできません(正解d)。

 正解dの文を実行すると、次のようにエラーとなります。

SQL> SELECT SYSDATE + hiredate FROM emp;
SELECT SYSDATE + hiredate FROM emp
*
行1でエラーが発生しました。:
ORA-00975: 日付と日付の加算はできません。

 選択肢aは日付データの表示書式をTO_CHAR関数で変換しているだけなので、エラーにはなりません。選択肢bは日付データから年度だけを取り出し、数値データ型に変換しています。

解説5

正解:a

参考:SQLの関数でデータを集計する

 部門の数を求めるのですから、重複した部門を取り除くことで部門の種類数を求めればよいことになります。

 正解aのようにCOUNT関数にDISTINCTを使用することで、重複した値を取り除いたカウント、つまり種類数を取得することができます。

 選択肢bは、DISTINCTとCOUNTの記述が逆です。COUNT関数の後にカッコがないため構文エラーとなります。選択肢cはエラーにはなりませんが、deptnoの行数を調べて重複値を除くことになり、意味がありません。

 選択肢dでは重複分もカウントされてしまい、部門数は求められません。

解説6

正解:d

参考:SQLで複数の表からデータを取り出す
   「SQLの外部結合でデータを取り出す

 USING句を使用して結合する場合、結合条件の指定に修飾子(どの表の列であるかを表す)を使うことはできません(正解d)。

SQL> SELECT empno,ename,dname FROM emp JOIN dept USING(d.deptno);
SELECT empno,ename,dname FROM emp JOIN dept USING(d.deptno)
*
行1でエラーが発生しました。:
ORA-01748: ここでは修飾された列名は使用できません。

 修飾子は結合条件だけでなく、選択列リストでも指定することができませんので注意しましょう。選択肢cのようなNATURAL JOIN句による結合時にも、指定することはできません。

 選択肢aの右側外部結合や、選択肢bのON句を使用した結合条件の指定では、修飾子を使用することが可能です。

解説7

正解:b

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

 データを見ると、SELECT文の副問い合わせで取得しているENAME列がSmithのレコードは2行あります。副問い合わせとの比較演算子に「=」を使用する場合、副問い合わせは1行のみを戻す必要があるため、実行時にエラーとなります(正解b)。

 この問題で「=」の代わりにIN演算子を使用した場合、Smithと同じ給与(800または1250)を持つ1レコード(ENAMEがWardの行)が戻されることになります。

解説8

正解:c

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

 複数行を戻す副問い合わせでは、=、!=などの単一行演算子を使用することはできません(正解c)。

 IN、ANY、ALLを使用して、複数の値との比較を行う必要があります。

解説9

正解:b

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

 SAVEPOINTを指定しない「ROLLBACK;」コマンドでは、トランザクション全体がロールバックされます。一方、SAVEPOINTを指定したロールバックでは、そのSAVEPOINT以前のトランザクションは残ります。

 この問題では「ROLLBACK a;」コマンドによってロールバックされるのは(3)のみです。(1)と(2)の処理は残っており、COMMITによって確定されます(正解b)。

解説10

正解:a、c

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

 表の列にNOT NULL制約を定義すると、値の存在が必須となり、NULL値の格納を禁止します。NULL値を格納しようとすると制約違反となります(正解a)。

 ゼロ(0)は数値として存在する値であり、NULL値ではありません(選択肢b)。なお、値ゼロ(空文字列)は、現在のOracleではNULL値と等しい扱いですが、一般的には異なる扱いとされるため注意しましょう。

 NOT NULL制約は列定義の一部として宣言する必要があります。主キー制約、一意キー制約などの制約と異なり、列制約構文でしか指定できないことに注意しましょう(正解c選択肢d)。

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


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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