9

私は常に、SQL の Join を 2 つのテーブル間のある種のリンケージと考えていました。

例えば、

select e.name, d.name from employees e, departments d 
  where employees.deptID = departments.deptID

この場合、各従業員を部門 ID ではなく部門名で表示するために、2 つのテーブルをリンクしています。そして、「リンケージ」または「ユニオン」のようなものです」.

しかし、内部結合と外部結合について学習した後、結合 (内部結合) が実際には交差点であることがわかります。

たとえば、あるテーブルの ID が 1、2、7、8 で、別のテーブルの ID が 7 と 8 のみの場合、交差を取得する方法は次のとおりです。

select * from t1, t2 where t1.ID = t2.ID

「7 と 8」の 2 つのレコードを取得します。つまり、実際には交差点です。

したがって、2 つのテーブルの「交差」があります。これを 2 つのテーブルに対する "Union" 操作と比較してください。結合は「交差」と考えることができますか? しかし、その「リンク」または「横方向の結合」の側面はどうですか?

4

4 に答える 4

6

あなたは正しい道を進んでいます。によって返される行はINNER JOIN、結合条件を満たす行です。ただし、これは、各テーブルの列に適用される結合条件で 値を使用しているという理由だけで交差に似ています。

また、INTERSECTIONはすでに SQL 操作であり、別の意味を持つことにも注意してください。これは と同じではありませんJOIN

SQLJOINは、結合された両方のテーブルのすべての列を含む新しいタイプの行を生成できます。例: col4、col5、および col6 はテーブル A には存在しませんが、テーブル B との結合の結果には存在します。

SELECT a.col1, a.col2, a.col3, b.col4, b.col5, b.col6
FROM A INNER JOIN B ON a.col2=b.col5;

SQLINTERSECTIONは、2 つの別個のテーブルに共通の行を返します。これらのテーブルには、既に同じ列が含まれている必要があります。

SELECT col1, col2, col3 FROM A
INTERSECT
SELECT col1, col2, col3 FROM B;

これにより、たまたま次の結合と同じ結果が生成されます。

SELECT a.col1, a.col2, a.col3
FROM A INNER JOIN B ON a.col1=b.col1 AND a.col2=b.col2 AND a.col3=b.col3;

すべてのブランドのデータベースがINTERSECTIONオペレーターをサポートしているわけではありません。

于 2010-04-24T21:03:08.990 に答える
2

結合「リンク」または erm... は、2 つのテーブルの行を結合します。個人的にはひどい表現だと思いますが、それが「横向きの結合」の意味だと思います。ただし、わずかに異なることを行うさまざまな種類の結合があります。

  • 内部結合は実際には交差です。
  • 完全外部結合は共用体です。

Jeff Atwood のブログのこのページでは、他の可能性について説明しています。

于 2010-04-24T20:49:42.847 に答える
0

INNER JOINNULL2 つの を 2 つの異なる値として扱います。したがって、null 許容列に基づいて結合し、両方のテーブルがNULLその列に値を持っている場合、INNER JOINそれらの行は無視されます。

したがって、2 つのテーブル間のすべての共通行を正しく取得するには、 をINTERSECT使用する必要があります。2 つの を同じ値としてINTERSECT扱います。NULL

例(SQLite):

null 許容列を持つ 2 つのテーブルを作成します。

CREATE TABLE Table1 (id INT, firstName TEXT);
CREATE TABLE Table2 (id INT, firstName TEXT);

値を挿入NULL:

INSERT INTO Table1 VALUES (1, NULL);
INSERT INTO Table2 VALUES (1, NULL);

以下を使用して一般的な行を取得しますINNER JOIN(これは出力を示しません)。

SELECT * FROM Table1 INNER JOIN Table2 ON 
    Table1.id=Table2.id AND Table1.firstName=Table2.firstName;

以下を使用して共通行を取得しますINTERSECT(これは共通行を正しく示しています)。

SELECT * FROM Table1 INTERSECT SELECT * FROM Table2;

結論:

多くの場合、 と の両方INTERSECTを使用して同じ結果INNER JOINを得ることができますが、それらは同じではないため、状況に応じて選択する必要があります。

于 2016-06-07T05:56:53.677 に答える
0

外部結合 - ユニオンまたはユニオンオールとは関係ありません。

たとえば、Union または Union All 操作の結果として「null」は発生しませんが、Outer Join の結果として発生します。

于 2015-07-04T05:31:06.210 に答える