連載
» 2005年11月11日 00時00分 公開

SQLの外部結合でデータを取り出すORACLE MASTER Bronze SQL基礎I 講座(7)

Oracleデータベースエンジニアとしての実力を証明するORACLE MASTER資格。その入り口であるBronze資格の取得は難しくない。本連載と、同時掲載中の連載「Bronze DBA講座」で合格を目指そう!(参考記事:「Oracle 10g対応のORACLE MASTERとは?」)

[有限会社 G.F.インフィニティ,Project - ∞]

 前回に引き続き、複数の表からデータを表示する方法について学びます。前回「SQLで複数の表からデータを取り出す」で、等価結合と非等価結合、内部結合を紹介しました。今回は外部結合を学びましょう。

理解しておきたいこと

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

  • 外部結合による、結合条件に一致しないデータの表示

2.外部結合

 外部結合は、結合条件を満たさないデータも含めて戻します。外部結合では、結合構文の違いによって、以下の結合タイプが使用できます。

左側外部結合 内部結合結果に加え、LEFT OUTER JOIN句の左側の表(FROM表)のすべての行を戻す
右側外部結合 内部結合結果に加え、RIGHT OUTER JOIN句の右側の表(JOIN表)のすべての行を戻す
完全外部結合 内部結合結果に加え、FROM表とJOIN表のすべての行を戻す

 それぞれの結合構文は以下のとおりです。これらは内部結合同様、ANSIで規格化され、SQL1999構文と呼ばれます。

・左側外部結合

 SELECT 列名リスト FROM 表名1 LEFT OUTER JOIN 表名2 ON(結合条件);

例:
SQL> SELECT e.empno, e.ename, d.deptno, d.dname FROM dept d
     LEFT OUTER JOIN emp e
  2  ON     (e.deptno = d.deptno);
      
     EMPNO ENAME          DEPTNO DNAME
---------- ---------- ---------- --------------
‥‥
      7698 BLAKE              30 SALES
      7654 MARTIN             30 SALES
      7900 JAMES              30 SALES
      7844 TURNER             30 SALES
      7521 WARD               30 SALES
                              40 OPERATIONS

 最後の1行が、外部結合によって左側の表(FROM表)であるdept表から戻された行です。

・右側外部結合

 SELECT 列名リスト FROM 表名1 RIGHT OUTER JOIN 表名2 ON(結合条件);

例:
SQL> SELECT e.empno, e.ename, d.deptno, d.dname FROM emp e
     RIGHT OUTER JOIN dept d
  2  ON     (e.deptno = d.deptno);
      
     EMPNO ENAME          DEPTNO DNAME
---------- ---------- ---------- --------------
‥‥
      7698 BLAKE              30 SALES
      7654 MARTIN             30 SALES
      7900 JAMES              30 SALES
      7844 TURNER             30 SALES
      7521 WARD               30 SALES
                              40 OPERATIONS

 左側外部結合の例と結果は同じですが、最後の1行は、外部結合によって右側の表(JOIN表)であるdept表から戻された行です。

・完全外部結合

 SELECT 列名リスト FROM 表名1 FULL OUTER JOIN 表名2 ON(結合条件);

 デフォルトのemp表では完全外部結合のイメージがわきにくいので、1行追加してテストします。

例:
SQL> INSERT INTO emp(empno, ename, deptno) VALUES (8000,
     'TEST', null);
SQL> SELECT e.empno, e.ename, d.deptno, d.dname FROM emp e
     FULL OUTER JOIN dept d
  2  ON     (e.deptno = d.deptno);
      
     EMPNO ENAME          DEPTNO DNAME
---------- ---------- ---------- --------------
‥‥
      7698 BLAKE              30 SALES
      7654 MARTIN             30 SALES
      7900 JAMES              30 SALES
      7844 TURNER             30 SALES
      7521 WARD               30 SALES
      8000 TEST
                              40 OPERATIONS

 最後の2行が、完全外部結合によってemp表とdept表から戻された行です。この例のように、結合キー列がNULL値の場合も結合はできません。その場合、外部結合を行うことで結果に含めることが可能になります。

 今回はON句を使用した構文と例を紹介しましたが、外部結合でもNATURAL JOIN句(自然結合)、USING句を使用することができます。

問題

■問題1

外部結合を使用する処理を2つ選択しなさい。

a.両方にNULL値が含まれている
b.片方に含まれないデータも取得する必要がある
c.両方に含まれるデータも含まれないデータも取得する必要がある
d.両方に含まれるデータのみ取得する必要がある
e.主キーと外部キーの関係がある表からデータを取得する

正解:a、c

■解説

 前回の宿題にした問題です。外部結合は、結合条件に一致しないレコードも同時に出力するためのものです(正解c)。一致しない原因としては、結合キーにNULL値がある場合(正解a)、他方に含まれない結合キー値が存在する場合があります。

 そのほかの選択肢の不正解の理由は次のとおりです。

選択肢b:外部結合には、結合条件に一致しないデータのうち片方の表のデータを取得する左側外部結合と右側外部結合、両方の表のデータを取得する完全外部結合がありますので、説明として不十分であると思われます。

選択肢d:両方に含まれるデータのみ取得するには、内部結合を使用します。

選択肢e:結合を行えるのは、表に主キーと外部キーの関係が存在する場合に限りません。非等価結合を使用すれば、同じ値が含まれていなくても結合することができます。また、非等価結合でも内部結合、外部結合を行うことができます。

■問題2

どのようなときに完全外部結合を使用するとよいでしょうか。

a.1つの表のみに一致しない行が含まれている
b.NOT NULL設定されている表である
c.両方の表に一致する行が含まれている
d.両方の表に一致しない行が含まれている

正解:d

■解説

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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