Sql-certificate-get-data-from-multiple-tables

提供:Dev Guides
移動先:案内検索

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

複数のテーブルのデータを表示する

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

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

  • 自然結合(等結合または単純結合とも呼ばれます)-一般的に名前が付けられ定義された列を使用して結合を作成します。
  • 非等価結合-結合するテーブルに同等の行がない場合にテーブルを結合します。たとえば、テーブルのある列の値を別のテーブルの値の範囲と一致させるためです。
  • 自己結合-テーブルをそれ自体に結合します。
  • 外部結合-他のテーブルに一致するレコードがない場合、出力にテーブルのレコードを含めます。 *デカルト結合(デカルト積またはクロス結合とも呼ばれます)-最初のテーブルの各行を2番目のテーブルのすべての行に複製します。可能なすべてのレコードの組み合わせを表示して、テーブル間の結合を作成します。

自然結合

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

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列を指定することはできません。また、結合に関係する列をテーブル名またはエイリアスで修飾することはできません。

USING句

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

従業員とそのレポーティングマネージャーを含む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 OUTER JOINの3つのタイプがあります。 それらはすべてINNER JOINで始まり、その後、ドロップされた行の一部を追加し直します。 LEFT OUTER JOINは、結合条件の最初の(左)テーブルからドロップされたすべての行を追加し直し、2番目(右)のテーブルの出力列はNULLに設定されます。 RIGHT OUTER JOINは、結合条件の2番目(右)のテーブルからドロップされたすべての行を追加し直し、1番目(左)のテーブルの出力列はNULLに設定されます。 FULL OUTER JOINは、両方のテーブルからドロップされたすべての行を追加します。

右外部結合

RIGHT OUTER JOINは、結合条件の2番目(右)のテーブルからドロップされたすべての行を追加し直し、1番目(左)のテーブルの出力列は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つのテーブルの外積を生成します。 上記のクエリは、CROSS JOIN句を使用して作成できます。

通常、デカルト積結果テーブルはあまり役に立ちません。 実際、このような結果テーブルはひどく誤解を招く可能性があります。 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;