Oracleで使うSQLの基礎を学ぶORACLE MASTER Bronze SQL基礎I 講座(1)

Oracleデータベースエンジニアとしての実力を証明するORACLE MASTER資格。その入り口であるBronze資格の取得は難しくない。本連載と、同時掲載中の連載「Bronze DBA講座」(5/20開始予定)で合格を目指そう!

» 2005年05月12日 00時00分 公開
[有限会社 G.F.インフィニティ (Project - ∞)]

 「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の範囲に沿って各種問題を解きながら解説していきましょう。

基本的なSELECT文の作成

理解しておきたいこと

1. 確認しておきたい内容

  • SELECT文の機能
  • 基本的なSELECT文の実行
  • SQL文とiSQL*Plus(SQL*Plus)コマンドの区別

2. SQL文の区分

 SQL(Structured Query Language:構造化問い合わせ言語)は、RDBMS(Relational Database Management System:リレーショナルデータベース管理システム)を経由してデータベースの操作を行うための言語です。大きく分けると、DML(Data Manipulation Language:データ操作言語)、DDL(Data Definition Language:データ定義言語)、DCL(Data Control Language:データ制御言語)に分かれます。

DML DDL DCL
SELECT 問い合わせ CREATE 作成 GRANT 権限付与
INSERT 挿入 ALTER 変更 REVOKE 権限削除
UPDATE 更新 DROP 削除
DELETE 削除 RENAME 名前変更
MERGE 挿入と更新 TRUNCATE 切り捨て
COMMENT コメント
表1 SQLは、DML、DDL、DCLの3種類に大きく分けられる

 

 このほか、トランザクションを制御するCOMMIT(確定)、ROLLBACK(取り消し)、SAVEPOINT(トランザクション中のポインタ)などもあります。

問題

問題1

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文を使用することで、リレーショナルデータベースでは射影、選択、結合という処理が可能になります。

射影 射影:
射影では、問い合わせによって戻す列を限定します。列は1列とは限らず、必要な列を取得できます。SELECT文では、SELECT句の列リストによって、射影のための列を限定できます。
選択 選択:
選択では、問い合わせによって戻す行を限定します。行は条件によって必要な行を制限できます。SELECT文では、WHERE句によって、選択のための行を限定できます。
結合 結合:
結合は、同じ表、または異なる表の間に関係を作るための列を指定し、関係付けられた列と行を1つの結果として戻します。

問題

問題1

「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;

  • 列名の直後にASキーワードとともに指定する
SELECT ename AS NAME FROM emp;

 列別名はデフォルトでは大文字で表現されます。大文字/小文字を区別したり、スペースや特殊記号(#や$など)を使用したりする場合は、二重引用符(")で列別名の前後を囲む必要があります(正解a)。

 不正解となる選択肢のように一重引用符(')で囲む(選択肢b)場合や、空白があるのに何も記述なし(選択肢d)はエラーとなります。また、INITCAP関数(先頭大文字、後小文字に変換)などの関数を使用して列別名を変更する(選択肢c)ことはできません。

問題2

給与(「sal」列)から100を引いた値を12倍にした結果を求めるために次の文を実行しました。

SELECT ename, sal - 100 * 12 FROM emp;

この文の結果の説明として正しいものを選択しなさい。

a. このままで期待した結果となる
b. salaryという別名を指定することで期待した結果となる
c. 「(sal - 100) * 12」とすることで期待した結果となる
d. 1つの文では実行できない

正解:c

解説

 算術演算子(+、-、*、/)には、次の特徴があります。

  • SQL文の任意の句で使用できる(FROM句を除く)
  • DATEデータ型とTIMESTAMPデータ型は加算(+)と減算(-)のみ使用可能
  • 乗算(*)と除算(/)は加算(+)と減算(-)より優先される
  • 同じ優先順位の演算子は左側から右側へ評価される
  • カッコを使用して優先順位を変更し、文の内容を明確にできる

 問題文のSQLを実行すると、まず先に優先順位の高い「100 * 12」が行われ、後からsalとの引き算が行われてしまいます。よって期待した結果とはなりません(選択肢a)。また、「salary」と列別名を指定しても優先順位や計算結果には全く関係ありません(選択肢b)。この問題では、優先順位を変えるためにカッコが必要です(選択肢c)。

SELECT (sal - 100) * 12 FROM emp;

問題3

次のCUST表の定義を確認してください。

CUST_IDNOT NULL NUMBER(6)
CUST_NAMENOT NULL VARCHAR2(20)
CUST_ADDRESSVARCHAR2(20)

「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つの文字列として扱われてしまいます。

問題4

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;

 そのほかの用語は、機能を表す用語としては使用されません。

問題5

次の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への接続例

(画面をクリックすると、大きな画像が表示されます) (画面をクリックすると、大きな画像が表示されます)

問題

問題1

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;
empnoに値を入力してください: 7900
旧1: SELECT empno, ename FROM emp WHERE empno = &empno
新1: SELECT empno, ename FROM emp WHERE empno = 7900


EMPNO
----------
7900
ENAME
----------
JAMES

 不正解となった代替変数(選択肢a)、INSTEAD OF変数(選択肢c)、省略変数と呼ばれる機能(選択肢d)はありません。引っ掛けられないよう、変数について確認しておきましょう。

問題2

次の文を確認してください。

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;
salaryに値を入力してください: 2500← 1度目は入力
旧1: SELECT empno,ename FROM emp WHERE sal = &&salary
新1: SELECT empno,ename FROM emp WHERE sal = 2500


EMPNO
----------
119
ENAME
----------
Colmenares

SQL> SELECT empno,ename FROM emp WHERE sal = &&salary;
旧1: SELECT empno,ename FROM emp WHERE sal = &&salary
新1: SELECT empno,ename FROM emp WHERE sal = 2500← 2度目以降は変数を再利用し、入力なし


EMPNO
----------
119
ENAME
----------
Colmenares

 選択肢aにある新しい値を入力するプロンプトを表示するには、「&置換変数」を使用します。問題1の解説を参照してください。

問題3

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

名前
----------
EMPNO
ENAME
SAL
NULL?
----------
NOT NULL

-----------------
NUMBER(3)
VARCHAR2(20)
NUMBER(10)

 不正解となるINSERT(選択肢a)、UPDATE(選択肢b)、RENAME(選択肢c)、SELECT(選択肢d)はいずれもSQL文です。前述の「2. SQL文の区分」を参照してください。

問題4

SQL*Plusコマンドの属性を2つ選択しなさい。

a. データベースのデータを操作する
b. データベース内の表定義を変更する
c. SQLを実行するOracle独自のインターフェイスである
d. キーワードを短縮できない
e. 問い合わせ結果のフォーマットを変更できる

正解:c、e

解説

 SQL*Plusコマンドは、SQL*Plusから発行できる独自コマンドです。SQL*Plusコマンドには次の特徴があります。

  • SQL文を実行するためのOracle独自のインターフェイスである
  • SQL文を認識してOracleサーバに送信する
  • データベース内の値は操作できない(データの更新、定義はSQL文のみが行う)
  • コマンドが1行で収まらなければ継続文字として「ハイフン(-)」が使用できる
  • キーワードは短縮できる(表定義を確認する「DESCRIBE」は短縮して「DESC」でも可能)
  • コマンドでデータの書式変更ができる(COLUMNコマンドで列名や数値要素の変更など)

 不正解となるデータベースのデータを操作(選択肢a)やデータベース内の表定義変更(選択肢b)は、SQL文の特徴です。SQL*PLUSコマンドで行うことはできません。

まとめ

 次の内容をチェックしておきましょう。

  • 列別名を指定どおりにする場合は「"」で囲む
  • 算術演算子を使う場合、乗算(*)と除算(/)は加算(+)と減算(-)の前に行われるため、順番を入れ替えるならカッコ( )で囲む
  • 文字列を連結するなら「||」で連結する
  • 選択、射影、結合の違いについて
  • SQL*Plusでは、置換変数(&)が使用できる
  • SQL*Plusの独自コマンドと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.

RSSについて

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

メールマガジン登録

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