正解:b
参考:「Oracleで使うSQLの基礎を学ぶ」
リレーショナルデータベースにおける「選択」とは、特定の行のみを取得することです。特定の行の取得を表しているのは正解bの図です。
不正解となる選択肢aは、特定の列のみの取得を表しています、これは「射影」という処理です。選択肢cは、選択と射影を組み合わせることで列と行の一部を取得しているといえます。選択肢dは、複数の表からの値の取得を表しています。これは「結合」の処理です。
正解:c
参考:「SQL問い合わせによる行の制限とソート」
IN演算子は、列の値が()内の値リストのいずれかと等しい行を取得します。IN演算子と同じ処理を行うには、正解cのように等価(=)条件をORで連結します。
不正解となる選択肢bは、次のようにNOT IN演算子を使用した場合と等しい結果になります。
SELECT * FROM emp WHERE deptno NOT IN (10,30);
選択肢dのようにANDで連結してしまうと、どの行も取得できないことになりますね。注意しましょう。
正解:a
参考:「SQLで使える関数の基礎知識」
文字データを小文字に変換するには、LOWER関数を使用します(正解a)。
不正解となる選択肢を見てみましょう。UPPERはすべて大文字(選択肢b)、INITCAPは先頭を大文字、残りを小文字に変換します(選択肢d)。INSTR関数は指定した文字が出現する位置を戻す関数です(選択肢c)。
正解:d
参考:「SQLで使える関数の基礎知識」
「SQLの関数を使いこなす」
日付データ型は、減算(?)して差分の日数を求めることはできますが(選択肢c)、加算(+)することはできません(正解d)。
正解dの文を実行すると、次のようにエラーとなります。
SQL> SELECT SYSDATE + hiredate FROM emp; SELECT SYSDATE + hiredate FROM emp * 行1でエラーが発生しました。: ORA-00975: 日付と日付の加算はできません。
選択肢aは日付データの表示書式をTO_CHAR関数で変換しているだけなので、エラーにはなりません。選択肢bは日付データから年度だけを取り出し、数値データ型に変換しています。
正解:a
参考:「SQLの関数でデータを集計する」
部門の数を求めるのですから、重複した部門を取り除くことで部門の種類数を求めればよいことになります。
正解aのようにCOUNT関数にDISTINCTを使用することで、重複した値を取り除いたカウント、つまり種類数を取得することができます。
選択肢bは、DISTINCTとCOUNTの記述が逆です。COUNT関数の後にカッコがないため構文エラーとなります。選択肢cはエラーにはなりませんが、deptnoの行数を調べて重複値を除くことになり、意味がありません。
選択肢dでは重複分もカウントされてしまい、部門数は求められません。
正解: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句を使用した結合条件の指定では、修飾子を使用することが可能です。
正解:b
参考:「SELECT文中のSELECT文、副問い合わせ」
「副問い合わせの構文を覚える」
データを見ると、SELECT文の副問い合わせで取得しているENAME列がSmithのレコードは2行あります。副問い合わせとの比較演算子に「=」を使用する場合、副問い合わせは1行のみを戻す必要があるため、実行時にエラーとなります(正解b)。
この問題で「=」の代わりにIN演算子を使用した場合、Smithと同じ給与(800または1250)を持つ1レコード(ENAMEがWardの行)が戻されることになります。
正解:c
参考:「SELECT文中のSELECT文、副問い合わせ」
「副問い合わせの構文を覚える」
複数行を戻す副問い合わせでは、=、!=などの単一行演算子を使用することはできません(正解c)。
IN、ANY、ALLを使用して、複数の値との比較を行う必要があります。
正解:b
参考:「SQLでデータを自在に操作する」
SAVEPOINTを指定しない「ROLLBACK;」コマンドでは、トランザクション全体がロールバックされます。一方、SAVEPOINTを指定したロールバックでは、そのSAVEPOINT以前のトランザクションは残ります。
この問題では「ROLLBACK a;」コマンドによってロールバックされるのは(3)のみです。(1)と(2)の処理は残っており、COMMITによって確定されます(正解b)。
正解: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も近日中に追加予定です。「無料お試し版」もありますので、記事と併せてご覧ください。
Copyright © ITmedia, Inc. All Rights Reserved.