Oracle University 講師が ORACLE MASTER 取得を目指している方に向けて試験トピックを解説するブログ連載講座。「ORACLE MASTER Silver SQL 2019」資格取得に向けた試験トピックについて解説します。

————————————————-

今回はORACLE MASTER Silver SQLの試験トピック「集合演算子の使用 – UNIONおよびUNION ALL演算子の使用 -」に関連する問題をご紹介いたします。ORACLE MASTER Silver SQL(Exam Number: 1Z0-071-JPN)の詳細につきましては以下URLをご参考ください。

Oracle Database SQL Exam Number: 1Z0-071

URL: https://education.oracle.com/ja/oracle-database-sql/pexam_1Z0-071

————————————————-

今回は集合演算子をもちいたSELECT文に関する問題をご紹介いたします。

早速問題を確認してきましょう。

(解説)

それでは解説をしてきます。まずは集合演算子とは?から説明をしましょう。集合演算子は、複数のSELECT文の問合せの結果を1つの結果としてまとめることができる演算子となり、集合演算子を含む問合せのことを複合問い合わせと呼びます。Oracle Databaseでは4つの集合演算子がありますのでイメージ図とともに、以下に内容をまとめておきましょう。

演算子

説明

UNION

重複行を除去した後の、両方の問合せからの行

UNION ALL

すべての重複行を含む、両方の問合せからの行

INTERSECT

両方の問合せに共通の行

MINUS

最初の問合せには存在し、2番目の問合せには存在しない行

実際にSQL文も実行してみましょう。以下の2つの表(EMP_TABLEとHISTORY_TABLE)に対してUNIONを使用したSELECT文を実行してみます。(SQL文を実行するためのサンプル定義&データは本記事の最後に掲載してあります。)

2つのSELECT文の結果を1つの結果としてまとめて表示していますが、SELECT句に記載されているTO_CHAR(NULL)や数字の「0」の指定などがあります。これは何を意味しているのでしょうか?

集合演算子を使用する場合には色々な規則があります。その内容を確認していきましょう。

  • 集合演算子のガイドライン
    • SELECTリスト内の式の数が一致している必要があります
    • 後続のSELECT問合せの各列のデータ型と、最初の問合せに対応する列のデータ型が一致する必要があります(列名は一致させる必要はありません)
    • ORDER BY句は文の最後にしか指定できません
    • UNION ALL 以外の集合演算子を使用した場合は、重複する行は自動的に除去されます
    • UNION ALL 以外の集合演算子を使用した場合は、デフォルトで出力が昇順ソートされます
    • 最初の問合せの列名が結果に表示されます

集合演算子を使用する場合には、式の数やデータ型をそろえる必要があるので、TO_CHAR(NULL)や数字の「0」を明示的に指定して条件を満たしていたというわけですね。

集合演算子の使い方について確認ができましたので問題の選択肢をみていきましょう。

選択肢1ですが、UNION演算子は重複行を省く動作があるためソート処理が必ず実行されます。しかしORDER BY句の指定は必須ではなく、ORDER BY句を明示的に指定しなかった場合は最初のSELECT文の1番目の列情報を使って自動的にソート処理を実行します。そのためこの選択肢は誤りです。

選択肢2をみていきましょう。UNION ALL はすべての重複行を含めて両方のSELECT文から結果を戻しますが、他の演算子と異なりソート処理は実行されません。UNION演算子を使用し、明示的にORDER BY句を指定しなかったからといってUNION ALLと同じ動作になることはありませんので誤りです。

選択肢3は、選択肢1で説明した内容になりますね。正しい選択肢です。

選択肢4と選択肢5は対となる内容になりますが、ORDER BY句を指定できる列名は最初のSELECT文で指定している列名のみになります。したがって選択肢4は誤りで選択肢5が正しい内容になります。

以上の結果から、正解の選択肢は3と5になります。

今回使用したテーブル定義、サンプルデータを記載しておきます。実際に操作することで理解を深めてください。

drop table emp_table;
create table emp_table(
        emp_id          number primary key,
        emp_name        varchar2(50),
        salary          number not null,
        dept_id         number not null);

insert into emp_table values(100, ‘Steven King’, 24000, 10);
insert into emp_table values(101, ‘Neena Kochhar’, 17000, 20);
insert into emp_table values(102, ‘Alexander Hunold’, 9000, 30);
insert into emp_table values(103, ‘Diana Lorentz’, 8000, 30);
insert into emp_table values(104, ‘Shelli Baida’, 5500, 40);
commit;

 

drop table history_table;
create table history_table(
        emp_id          number not null,
        start_date      date,
        end_date        date,
        job_id          varchar2(10),
        dept_id         number not null);

insert into history_table values(102, ’01-01-13′, ’06-07-24′, ‘IT_PROG’, 60);
insert into history_table values(101, ’97-09-21′, ’01-10-27′, ‘AC_ACCOUNT’, 110);
insert into history_table values(101, ’01-10-28′, ’05-03-15′, ‘AC_MGR’, 110);
insert into history_table values(201, ’04-02-17′, ’07-12-19′, ‘MKREP’, 20);
insert into history_table values(104, ’06-03-24′, ’07-12-31′, ‘ST_CLERK’, 50);
commit;

 今回は集合演算子のUNION、UNION ALL、ORDER BY句の指定方法などを学習しましたが、その他の演算子であるINTERSECT、MINUSについてもしっかりと押さえておきましょう。

どのようなデータが戻ってくるかイメージ図を使いつつ、実際にSQL文を動作して確認しておきましょう。

今回の講義はここまでとします。お疲れ様でした。

————————————————-

ORACLE MASTER Silver SQL 2019 のご紹介

ORACLE MASTER Silver SQL 2019 試験記事トピック一覧

————————————————-

その他の ORACLE MASTER 試験トピック解説講座シリーズ:

【Oracle University講師によるORACLE MASTER Gold DBA 2019 試験トピック解説講座】トピック一覧

————————————————-