Oracleデータベースエンジニアとしての実力を証明するORACLE MASTER資格。その入り口であるBronze資格の取得は難しくない。本連載と、同時掲載中の連載「Bronze DBA講座」(5/20開始予定)で合格を目指そう!
「ORACLE MASTER Bronze Oracle Database 10g」(以下Bronze)は、ORACLE MASTERの最も入門的な資格です。この資格の目的は、「SQL言語によってデータの操作や基本的なオブジェクトが作成でき、かつOracleDatabase 10gをデータベース管理者の指導の下で管理操作が可能な知識を持つ技術者を認定する」ことにあります(参考記事:「Oracle 10g対応のORACLE MASTERとは?」)。
Bronzeを取得するには、2つの試験に合格する必要があります。
今回より12回で構成される本連載で、1つ目の試験「Bronze SQL 基礎 I」の合格に必要な知識を身に付けましょう。同時に、2つ目の試験「Bronze DBA 10g」合格のための連載「BronzeDBA講座」も開始しますので、併せて読むことにより、Bronze資格の取得に役立ちます。
「Bronze SQL 基礎 I」試験の問題数、合格点と範囲は次のとおりです(☆の数は出題数を5段階で表示)。
問題数 | 40問 |
---|---|
合格点 | 28点(70%) |
試験時間 | 90分 |
1. 基本的なSELECT文の作成 | ☆☆☆☆☆ |
---|---|
2. データの制限とソート | ☆☆☆☆☆ |
3. 単一行関数 | ☆☆☆ |
4. グループ関数を使用したデータの集計 | ☆☆☆ |
5. 複数の表からのデータの表示 | ☆☆☆☆ |
6. 副問い合わせを使用した問い合わせの解決 | ☆☆☆ |
7. データ操作 | ☆☆☆☆☆ |
8. オブジェクトの作成および管理 | ☆☆☆☆☆ |
2005年3月16日からは試験時間と問題数が変更されました。以前は120分で56問でしたが、問題数が少なくなり90分で40問になりました。ただし以前は71%だった合格点の割合は、変更後も70%ですので難易度は変わりません。問題数が少なくなった分、いかに各設問に正解するかが重要です。また、以前はオブジェクトの作成関連はほとんど出題されていませんでしたが、試験が変更されてからはかなりの問題数が出題されています。
ではBronze SQL 基礎 Iの範囲に沿って各種問題を解きながら解説していきましょう。
1. 確認しておきたい内容
2. SQL文の区分
SQL(Structured Query Language:構造化問い合わせ言語)は、RDBMS(Relational Database Management System:リレーショナルデータベース管理システム)を経由してデータベースの操作を行うための言語です。大きく分けると、DML(Data Manipulation Language:データ操作言語)、DDL(Data Definition Language:データ定義言語)、DCL(Data Control Language:データ制御言語)に分かれます。
|
このほか、トランザクションを制御するCOMMIT(確定)、ROLLBACK(取り消し)、SAVEPOINT(トランザクション中のポインタ)などもあります。
DMLを3つ選択しなさい。
a. DESCRIBE...
b. MERGE...
c. UPDATE...
d. DELETE...
e. CREATE...
f. DROP...
正解:b、c、d
選択肢aは、SQL*Plusコマンドですので、SQLではありません。選択肢eと選択肢fはDDLです。このような問題は簡単ですのでラッキー問題といえます。「2.SQLの区分」を確実に理解し覚えておきましょう。
3. 基本のSELECT文
SELECT文の基本構造は次のとおりです。
SELECT {* | [DISTINCT] 列名 | 式} [列別名] [,...] FROM 表名; |
SELECT | 必須の要素。この後に、どの列を取得したいかのリストが続く |
---|---|
* | すべての列を選択する |
DISTINCT | 重複を排除する |
列名 | 特定の列を選択する |
式 | 計算や関数などを使用した式を選択する |
列別名 | 列名や式に異なる列見出しをつける |
FROM | 表名取得したい列を含む表を指定 |
SELECT文を使用することで、リレーショナルデータベースでは射影、選択、結合という処理が可能になります。
「SAL*12」の結果が「Annual Salary」という見出しで戻される、問い合わせ文を選択しなさい。
a. SELECT ename, sal*12 "Annual Salary" FROM emp;
b. SELECT ename, sal*12 'Annual Salary' FROM emp;
c. SELECT ename, sal*12 INITCAP('ANNUAL SALARY') FROM emp;
d. SELECT ename, sal*12 Annual Salary FROM emp;
正解:a
列見出しの名前を変更するのが「列別名」です。列別名を指定するには、次の2つの方法があります。
SELECT ename NAME FROM emp; |
SELECT ename AS NAME FROM emp; |
列別名はデフォルトでは大文字で表現されます。大文字/小文字を区別したり、スペースや特殊記号(#や$など)を使用したりする場合は、二重引用符(")で列別名の前後を囲む必要があります(正解a)。
不正解となる選択肢のように一重引用符(')で囲む(選択肢b)場合や、空白があるのに何も記述なし(選択肢d)はエラーとなります。また、INITCAP関数(先頭大文字、後小文字に変換)などの関数を使用して列別名を変更する(選択肢c)ことはできません。
給与(「sal」列)から100を引いた値を12倍にした結果を求めるために次の文を実行しました。
SELECT ename, sal - 100 * 12 FROM emp; |
この文の結果の説明として正しいものを選択しなさい。
a. このままで期待した結果となる
b. salaryという別名を指定することで期待した結果となる
c. 「(sal - 100) * 12」とすることで期待した結果となる
d. 1つの文では実行できない
正解:c
算術演算子(+、-、*、/)には、次の特徴があります。
問題文のSQLを実行すると、まず先に優先順位の高い「100 * 12」が行われ、後からsalとの引き算が行われてしまいます。よって期待した結果とはなりません(選択肢a)。また、「salary」と列別名を指定しても優先順位や計算結果には全く関係ありません(選択肢b)。この問題では、優先順位を変えるためにカッコが必要です(選択肢c)。
SELECT (sal - 100) * 12 FROM emp; |
次のCUST表の定義を確認してください。
CUST_IDNOT NULL NUMBER(6) |
「Dear <顧客名>,」という文を表示するには、どの問い合わせを使用したらよいでしょうか。<顧客名>には、CUST_NAMEの列値が入ります。
a.SELECT 'Dear ' || cust_name || ',' FROM cust;
b.SELECT "Dear " || cust_name || "," FROM cust;
c.SELECT '"Dear " cust_name ","' FROM cust;
d.SELECT 'Dear ' || cust_name || ',' || FROM cust;
e.SELECT 'Dear || cust_name || ,' FROM cust;
正解:a
列値やリテラル(SELECTリストに含まれる、文字・日付・数)を連結して結果を表示するには、連結演算子(||)を使用します。ただし、文字や日付のリテラルは必ず一重引用符で囲む必要があります(正解a)。
間違いやすいものとして、選択肢dのように、最後に連結演算子(||)を置いてはいけません。エラーになってしまいます。また、選択肢cと選択肢eのように全体を一重引用符で囲んでしまうと、全体で1つの文字列として扱われてしまいます。
SQLには、以下の機能があります。
この3つの機能を正しく表しているものを選択しなさい。
a. 選択、制限、関係
b. 選択、射影、結合
c. 制限、射影、結合
d. 識別、制限、関係
e. 選択、共通、結合
正解:b
「選択」は、問い合わせによって戻される表の行を選択することです。SELECT文では、WHERE句で選択が実行されます。
例: | select * from emp where deptno=10; |
問い合わせによって戻される表の列を選択することを「射影」といいます。列の数は必要に応じて選択できます。SELECT文では、SELECT列リストで射影が実行されます。
例: | select ename,sal,deptno from emp; |
「結合」は、異なる複数の表から関係するデータを1つにまとめて問い合わせることです。SELECT文では、結合文を使用して結合が実行されます。
例: | select emp.ename,dept.dname from emp join dept on emp.deptno=dept.deptno; |
そのほかの用語は、機能を表す用語としては使用されません。
次のSELECT文を確認してください。
SELECT empno, (.35 * sal) + (.05 * comm + (1.2 * (bonus * comm))) COUNT_RESULT |
この文の( )を外した結果として正しいものを選択しなさい。
a. COUNT_RESULTの値が小さくなる
b. COUNT_RESULTの値が大きくなる
c. COUNT_RESULTの結果は変わらない
d. エラーとなる
正解:c
問題2で解説したとおり、算術演算子の優先順位を確認しましょう。乗算(*)と除算(/)は加算(+)と減算(-)より優先されます。この問題では、カッコで囲んでいるのはすべて乗算(*)です。カッコを取り除いても先に処理されることになり、優先順位は同じですので結果も変わりません(正解c)。
複雑に見える問題が出題されたときは、まず実際の計算を行う前に、構文としてどうなのか、優先順位はどうなのかを考えるようにしましょう。この問題のように、複雑そうに見えても実際は単純なことを問われている問題が数多く出題されています。
4. 実行環境
SQL*PlusやiSQL*Plusを使用してSQL文を実行できます。
SQL*Plus | ・クライアントマシンにインストールするアプリケーション ・クライアント/サーバ接続で操作できる |
---|---|
iSQL*Plus | ・中間層としてのiSQL*Plus Serverにブラウザから接続してして使用するアプリケーション ・3階層接続で操作できる |
SQL*Plusへの接続例
iSQL*Plusへの接続例
WHERE句の値を変更できるSQL*Plusの機能を選択しなさい。
a. 代替変数
b. 置換変数
c. INSTEAD OF変数
d. 省略変数
e. そのような機能はない
正解:b
SQL*Plusの置換変数を使用することで、文を実行するときに値を代入することができます(正解b)。
置換変数は、WHERE句に限定されるわけではありませんが、WHERE句の値を実行ごとに変更するなどの目的で使用できます。置換変数は「&置換変数」で指定します。
SQL> SELECT empno, ename FROM emp WHERE empno = &empno;
|
不正解となった代替変数(選択肢a)、INSTEAD OF変数(選択肢c)、省略変数と呼ばれる機能(選択肢d)はありません。引っ掛けられないよう、変数について確認しておきましょう。
次の文を確認してください。
SELECT empno, ename FROM emp WHERE sal = &&salary; |
この文を実行したときに200と入力したところ、結果が表示されました。再度この文を実行すると、どのような結果となりますか。
a. 新しい値を入力するプロンプトが表示される
b. 1回目の値を使用するか、新しい値を使用するかを問うプロンプトが表示される
c. 1回目と同じ結果が表示される
d. レコードが表示されない
e. エラーとなる
正解:c
「&&置換変数」を使用することで、毎回ユーザーに入力を求めるのではなく、以前の変数を再利用することができます。そのため、問題のような文を再実行すると、以前の値を使用して結果が表示されます(正解c)。
SQL> SELECT empno,ename FROM emp WHERE sal = &&salary;
SQL> SELECT empno,ename FROM emp WHERE sal = &&salary;
|
選択肢aにある新しい値を入力するプロンプトを表示するには、「&置換変数」を使用します。問題1の解説を参照してください。
SQL*Plusコマンドを選択しなさい。
a. INSERT
b. UPDATE
c. RENAME
d. SELECT
e. DESCRIBE
正解:e
SQL*Plusコマンドは、SQL*Plus、iSQL*Plusでのみ使用できるコマンドです。データベースの値を操作するのではなく、表構造の表示や、ファイルにSQL文を保存(SAVE)するなどのコマンドが用意されています。正解eの「DESCRIBEコマンド(「DESC」と短縮可能)」を使用すると、表の定義やストアドプログラムの定義を確認できます。
SQL> desc emp
|
不正解となるINSERT(選択肢a)、UPDATE(選択肢b)、RENAME(選択肢c)、SELECT(選択肢d)はいずれもSQL文です。前述の「2. SQL文の区分」を参照してください。
SQL*Plusコマンドの属性を2つ選択しなさい。
a. データベースのデータを操作する
b. データベース内の表定義を変更する
c. SQLを実行するOracle独自のインターフェイスである
d. キーワードを短縮できない
e. 問い合わせ結果のフォーマットを変更できる
正解:c、e
SQL*Plusコマンドは、SQL*Plusから発行できる独自コマンドです。SQL*Plusコマンドには次の特徴があります。
不正解となるデータベースのデータを操作(選択肢a)やデータベース内の表定義変更(選択肢b)は、SQL文の特徴です。SQL*PLUSコマンドで行うことはできません。
次の内容をチェックしておきましょう。
次回は、「2. データの制限とソート」を確認します。次の宿題を解いておいてください。
従業員の職種に"SA_"が含まれている行を取り出している問い合わせを選択しなさい。
a. SELECT empno, ename FROM emp WHERE job = '%SA_%';
b. SELECT empno, ename FROM emp WHERE job LIKE '%SA\_%' ESCAPE '\';
c. SELECT empno, ename FROM emp WHERE job LIKE "%SA_\%" ESCAPE "\";
d. SELECT empno, ename FROM emp WHERE job LIKE '%SA_\%';
e. SELECT empno, ename FROM emp WHERE job = 'SA_';
IT資格試験の模擬問題をWebベースで学習できる@IT自分戦略研究所の新サービス「@IT資格攻略」では、Oracle関連の資格をテーマとして取り上げています。Bronze SQL 基礎 I、Bronze DBA 10gも近日中に追加予定です。「無料お試し版」もありますので、記事と併せてご覧ください。
Copyright © ITmedia, Inc. All Rights Reserved.