複数のテーブルからデータを取得する

複数のテーブルからのデータの表示

大規模なデータベースの関連テーブルは、外部キーと主キー、または共通列と呼ばれることが多いものを使用してリンクされます。テーブルを結合する機能により、生成される結果テーブルにさらに意味を追加できます。クエリで結合される「n」個のテーブルには、最小(n-1)個の結合条件が必要です。結合条件に基づいて、Oracleは一致する行のペアを結合し、結合条件を満たすものを表示します。

結合は次のように分類されます

  • 自然結合(等結合または単純結合とも呼ばれます)-一般的に名前が付けられ、定義された列を使用して結合を作成します。

  • 不等結合-結合するテーブルに同等の行がない場合にテーブルを結合します-たとえば、テーブルの1つの列の値を別のテーブルの値の範囲と一致させます。

  • 自己結合-テーブルをそれ自体に結合します。

  • 外部結合-他のテーブルに一致するレコードがない場合、出力にテーブルのレコードを含めます。

  • デカルト結合(デカルト積またはクロス結合とも呼ばれます)-最初のテーブルの各行を2番目のテーブルのすべての行で複製します。可能なすべてのレコードの組み合わせを表示することにより、テーブル間の結合を作成します。

自然結合

NATURALキーワードを使用すると、等結合の構文を簡略化できます.2つ(またはそれ以上)のテーブルに同じ名前の列があり、列に結合互換性がある場合、つまり、列に値の共有ドメインがある場合は常に、NATURALJOINが可能です。操作は、同じ名前の列に対して等しい列値を持つテーブルの行を結合します。

DEPARTMENTSテーブルとEMPLOYEESテーブルの間の1対多の関係を考慮してください。各テーブルにはDEPARTMENT_IDという名前の列があります。この列は、DEPARTMENTSテーブルの主キーであり、EMPLOYEESテーブルの外部キーです。

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;

FIRST_NAME DNAME
---------- ------
MILLER     DEPT 1
JOHN       DEPT 1
MARTIN     DEPT 2
EDWIN      DEPT 2

以下のSELECTクエリは、ONキーワードで結合条件を明示的に指定することにより、2つのテーブルを結合します。

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);

NATURAL JOINにはいくつかの制限があります。NATURALJOINでLOB列を指定することはできません。また、結合に関係する列をテーブル名またはエイリアスで修飾することはできません。

使用条項

Oracleは、Natural結合を使用して、列を暗黙的に識別し、結合の基礎を形成します。多くの状況では、結合条件を明示的に宣言する必要があります。このような場合、USING句を使用して結合基準を指定します。USING句は列の同等性に基づいてテーブルを結合するため、Equijoinとも呼ばれます。これらは、内部結合または単純結合とも呼ばれます。

構文:

SELECT <column list>
FROM   TABLE1   JOIN   TABLE2	
USING (column name)

以下のSELECTクエリについて考えてみます。EMPLOYEESテーブルとDEPARTMENTSテーブルは、共通の列DEPARTMENT_IDを使用して結合されます。

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);

自己結合

SELF-JOIN操作は、単一のテーブル内に格納されている行の間に対象の関係が存在する場合に結果テーブルを生成します。つまり、テーブルがそれ自体に結合される場合、その結合は自己結合と呼ばれます。

従業員とそのレポートマネージャーを含むEMPLOYEESテーブルについて考えてみます。従業員のマネージャーの名前を見つけるには、EMPテーブル自体に結合する必要があります。これは、自己結合の典型的な候補です。

SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;

非等結合

非等号結合は、関連する列を等号で結合できない場合に使用されます。つまり、結合するテーブルに同等の行がありません。非等式結合を使用すると、範囲の最小値を1つの列に格納できます。レコードの最大値と別の列の最大値。したがって、列と列の一致を見つける代わりに、不等結合を使用して、出荷されるアイテムが列の最小範囲と最大範囲の間にあるかどうかを判断できます。結合がアイテムの一致範囲を見つけた場合、対応する出荷手数料は結果で返すことができます。等式結合の従来の方法と同様に、非等式結合はWHERE句で実行できます。さらに、JOINキーワードをON句とともに使用して、結合に関連する列を指定できます。

SELECT E.first_name,
            J.job_hisal,
            J.job_losal,
            E.salary
     FROM employees E JOIN job_sal J
     ON (E.salary BETWEEN J.job_losal AND J.job_losal);

等式および不等式演算子、BETWEEN、IS NULL、IS NOT NULL、およびRELATIONALなど、前述のすべての比較パラメーターを使用できます。

外部結合

外部結合は、2つのテーブルが関連している場合でも、1つのテーブルの行が2番目のテーブルの行と一致しない状況を識別するために使用されます。

外部結合には、LEFT、RIGHT、およびFULL OUTERJOINの3つのタイプがあります。それらはすべてINNERJOINで始まり、その後、削除された行の一部を追加し直します。LEFT OUTER JOINは、結合条件で最初の(左)テーブルからドロップされたすべての行を追加し直し、2番目(右)のテーブルからの出力列はNULLに設定されます。RIGHT OUTER JOINは、結合条件で2番目(右)のテーブルから削除されたすべての行を追加し直し、最初(左)のテーブルからの出力列はNULLに設定されます。FULL OUTER JOINは、両方のテーブルから削除されたすべての行を追加し直します。

右外部結合

RIGHT OUTER JOINは、結合条件で2番目(右)のテーブルから削除されたすべての行を追加し直し、最初(左)のテーブルからの出力列はNULLに設定されます。以下のクエリは、従業員とそれに対応する部門をリストしていることに注意してください。また、部門30には従業員が割り当てられていません。

SELECT E.first_name, E.salary, D.department_id          
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

左外部結合

LEFT OUTER JOINは、結合条件で最初の(左)テーブルからドロップされたすべての行を追加し直し、2番目(右)のテーブルからの出力列はNULLに設定されます。上で示したクエリは、(+)記号の位置を交換することにより、左外部結合を示すために使用できます。

SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE   D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

完全外部結合

FULL OUTER JOINは、両方のテーブルから削除されたすべての行を追加し直します。以下のクエリは、従業員とその部門のリストを示しています。従業員「MAN」にはこれまでどの部門も割り当てられておらず(NULL)、部門30はどの従業員にも割り当てられていないことに注意してください。

SELECT  nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;

FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN        -
JOHN       10
EDWIN      20
MILLER     10
MARTIN     20
-          30

6 rows selected.

デカルト積またはクロス結合

2つのエンティティAとBの場合、A * Bはデカルト積として知られています。デカルト積は、各テーブルの行のすべての可能な組み合わせで構成されます。したがって、10行のテーブルを20行のテーブルと結合すると、直積は200行(10 * 20 = 200)になります。たとえば、従業員テーブルを8行、部門テーブルを3行と結合すると、 24行のデカルト積テーブル(8 * 3 = 24)。

クロス結合とは、2つのテーブルのデカルト積を指します。2つのテーブルの外積を生成します。上記のクエリは、CROSSJOIN句を使用して記述できます。

デカルト積の結果テーブルは、通常、あまり役に立ちません。実際、そのような結果テーブルはひどく誤解を招く可能性があります。EMPLOYEESテーブルとDEPARTMENTSテーブルに対して以下のクエリを実行すると、結果テーブルは、すべての従業員がすべての部門と関係を持っていることを意味しますが、そうではないことがわかります。

SELECT E.first_name, D.DNAME
FROM employees E,departments D;
クロス結合は、次のように記述できます。
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;