SQLの JOIN
とは何ですか?また、その種類にはどのようなものがありますか?
W3schools](https://www.w3schools.com/sql/sql_join.asp)のイラストです。
.
。
![右結合-表2のすべてのレコードと表1の条件に一致するレコードとの結合][3]。
。
SQL JOIN`は、2つ以上のデータベースのテーブルからデータを取得する方法です。
SQL JOIN
にはどのようなものがありますか?全部で5つのJOIN
があります。それらは:
1. JOIN or INNER JOIN
2. OUTER JOIN
2.1 LEFT OUTER JOIN or LEFT JOIN
2.2 RIGHT OUTER JOIN or RIGHT JOIN
2.3 FULL OUTER JOIN or FULL JOIN
3. NATURAL JOIN
4. CROSS JOIN
5. SELF JOIN
この種のJOIN
では、両方のテーブルで条件にマッチするすべてのレコードを取得し、マッチしない両方のテーブルのレコードは報告されません。
言い換えれば、INNER JOIN
は以下の単一の事実に基づいています。つまり、INNER JOIN
は、「両方のテーブルで一致したエントリーのみがリストアップされるべきである」という単一の事実に基づいています。
他のJOINキーワード(
INNER、
OUTER、
LEFTなど)を持たない
JOINは、
INNER JOINであることに注意してください。言い換えれば、
JOINは は
INNER JOIN` のための構文シュガーです (参照: https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join)。
OUTER JOIN
は、以下のものを取得します。
どちらかです。 一方のテーブルのマッチした行と、もう一方のテーブルのすべての行 あるいは すべてのテーブルのすべての行(一致したかどうかは問題ではありません)。
外部結合には3種類あります。
2.1 LEFT OUTER JOINまたはLEFT JOIN。
この結合は、左のテーブルのすべての行を、右のテーブルの一致する行と一緒に返します。
返します。右のテーブルに一致する列がない場合は、NULL
の値を返します。
2.2 RIGHT OUTER JOINまたはRIGHT JOIN(右外部結合
このJOIN
は、右のテーブルのすべての行を、左のテーブルの一致する行と合わせて返します。
返します。左のテーブルに一致する列がない場合は、NULL
の値を返します。
2.3 FULL OUTER JOINまたはFULL JOINの場合
このJOIN
は、LEFT OUTER JOIN
とRIGHT OUTER JOIN
を組み合わせたものです。条件が満たされるとどちらかのテーブルから行を返し、マッチしない場合は NULL
を返します。
言い換えれば、OUTER JOIN
は以下の事実に基づいています。つまり、OUTER JOIN
は次のような事実に基づいています:一方のテーブル(RIGHTまたはLEFT)、または両方のテーブル(FULL)の一致するエントリのみがリストアップされるべきです。
Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
これは2つの条件に基づいています。
JOIN
は、同じ名前の全ての列に対して同一性を持って行われます。
2.結果から重複するカラムを削除する。これはどちらかというと理論的な性質のもので、その結果(おそらく)ほとんどのDBMSは はこれをサポートしていません。
関係する2つのテーブルの直交積です。CROSS JOIN "の結果は、ほとんどの場合、意味をなさないでしょう。 ほとんどの状況では意味をなさないでしょう。さらに、これは全く必要ありません(正確には、最低限必要です)。
これは、JOIN
の異なる形式ではなく、むしろ、あるテーブルを自分自身にJOIN
(INNER
、OUTER
など)するものです。
JOIN句に使われる演算子によって、2種類の
JOIN`があります。それらは
1.Equi JOIN 2.シータJOIN
どのようなタイプのJOIN
(INNER
、OUTER
など)であっても、等号演算子(=)のみを使用する場合は、次のように言います。
そのJOIN
はEQUI JOIN
です。
これは、EQUI JOIN
と同じですが、>、<、>=などの他のすべての演算子を使用することができます。
多くの人は、
EQUI JOIN
とθJOIN
の両方を、INNER
やOUTER
などのJOIN
に似ていると考えています。 などのJOIN
に似ていると考えています。しかし、私はそれは間違いであり、考え方を曖昧にしていると強く思います。 の考えを曖昧にしてしまいます。なぜなら、INNER JOIN
やOUTER JOIN
などは、すべてテーブルとそのデータに関連しているからです。 一方、EQUI JOIN
やTHETA JOIN
は、私たちが使っている演算子としか関係ありません。 一方、EQUI JOIN
やTHETA JOIN
は、前者で使用する演算子としか関係ありません。NATURAL JOIN "をある種の "癖 "だと考える人もいます。 NATURAL JOIN "をある種の "EQUI JOIN "と考える人が多いようです。実際には、その通りです。 NATURAL JOIN
について述べた最初の条件のため、実際にはそうです。しかし、それを単に
NATURAL JOINに限定する必要はありません。 しかし、単純に「自然な結合」だけに限定する必要はありません。内側からの参加」や「外側からの参加」などは なども
EQUI JOIN` になり得ます。
Definition:
JOINSは、複数のテーブルから結合されたデータを同時に照会する方法です。
RDBMSには5種類の結合があります。
Equi-Join:** 2つのテーブルの共通レコードを、等号条件に基づいて結合する。 技術的には、あるテーブルの主キーの値と別のテーブルの外部キーの値を比較するために等号演算子(=)を使用してJoinを行い、結果セットは両方のテーブルからの共通(マッチ)レコードを含む。実装方法については、INNER-JOINを参照してください。
Natural-Join:** Equi-Joinの拡張版で、SELECT 操作で、重複するカラムを省略します。実装方法は、INNER-JOINを参照してください。
Non-Equi-Join:Equi-joinの逆で、結合条件に等号演算子(=)以外のものを使用します(例:!=、<=、>、<、BETWEENなど)。実装についてはINNER-JOINを参照してください。
自己結合(Self-Join:**)。これは通常、自己参照テーブル(またはUnary関係エンティティ)を照会する際に必要となります。 実装方法はINNER-JOINを参照してください。
2つのテーブルのすべてのレコードを何の条件もなく結合します。技術的には、WHERE句のないクエリの結果セットを返します。
SQLへの関心と進歩により、結合には3つのタイプがあり、すべてのRDBMSの結合はこれらのタイプの結合を使って実現できます。
1.1. インナー結合: 2つのテーブルからマッチした行をマージ(または結合)します。マッチングはテーブルの共通カラムとその比較演算に基づいて行われます。等式に基づく条件であれば、EQUI-JOINが実行されます。EQUI-JOINが実行され、それ以外は非EQUI-JOINとなります。
2.2. OUTER-JOIN: 2つのテーブルからマッチした行と、NULL値を持つマッチしていない行をマージ(または結合)します。しかし、マッチしない行の選択をカスタマイズすることができます。例えば、サブタイプによって、マッチしない行を第1テーブルまたは第2テーブルから選択することができます。例えば、最初のテーブルまたは2番目のテーブルから一致しない行を選択します。
2.1.2.1. **LEFT OUTER JOIN**(別名、LEFT-JOIN)。2つのテーブルから一致する行を返し、LEFTテーブル(つまり第1テーブル)からは一致しない行のみを返します。
2.2.2.2. **RIGHT Outer JOIN**(別名:RIGHT-JOIN)。2つのテーブルからマッチした行を返し、RIGHTテーブルからのみマッチしていない行を返します。
2.3.2.3. **FULL OUTER JOIN**(別名:OUTER JOIN)。2つのテーブルから一致した行と一致しなかった行を返します。
3.3. CROSS-JOIN: この結合はマージや結合を行わず、代わりにカルテシアン積を行います。
. 注:Self-JOINは、要求に応じてINNER-JOIN、OUTER-JOIN、CROSS-JOINのいずれかで実現できますが、テーブルは自分自身と結合しなければなりません。
[詳細はこちら:][2]。
1.1:INNER-JOIN:Equi-joinの実装。
SELECT *
FROM Table1 A
INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;
*1.2: INNER-JOIN: Natural-JOINの実装** {{19747}} {{19747}} {{19747
Select A.*, B.Col1, B.Col2 --But no B.ForeignKeyColumn in Select
FROM Table1 A
INNER JOIN Table2 B On A.Pk = B.Fk;
*1.3: INNER-JOIN: NON-Equi-JOINの実装**
Select A.*, B.Col1, B.Col2 --But no B.ForeignKeyColumn in Select
FROM Table1 A
INNER JOIN Table2 B On A.Pk = B.Fk;
Select *
FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;
1.4:SELF-JOINによるINNER-JOIN。
Select *
FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;
2.1:OUTER JOIN(完全な外部結合)
Select *
FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;
2.2:LEFT JOIN (左結合)
Select *
FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;
2.3:RIGHT JOIN(右結合
Select *
FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;
3.1:CROSS JOIN(クロスジョイント
Select *
FROM TableA CROSS JOIN TableB;
3.2:CROSS JOIN-Self JOIN
Select *
FROM Table1 A1 CROSS JOIN Table1 A2;
//OR//になります。
Select *
FROM Table1 A1,Table1 A2;