web-dev-qa-db-ja.com

自然結合と内部結合の違い

自然結合と内部結合の違いは何ですか?

178
smith

INNER JOINとNATURAL JOINの大きな違いの1つは、返される列の数です。

検討してください:

TableA                           TableB
+------------+----------+        +--------------------+    
|Column1     | Column2  |        |Column1  |  Column3 |
+-----------------------+        +--------------------+
| 1          |  2       |        | 1       |   3      |
+------------+----------+        +---------+----------+

Column1のTableAとTableBのINNER JOINが返されます。

SELECT * FROM TableA INNER JOIN TableB USING (Column1);
SELECT * FROM TableA INNER JOIN TableB ON TableA.Column1 = TableB.Column1;
+------------+-----------+---------------------+    
| a.Column1  | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1          |  2        | 1        |   3      |
+------------+-----------+----------+----------+

Column1のTableAとTableBのNATURAL JOINは以下を返します。

SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+    
|Column1     | Column2  | Column3  |
+-----------------------+----------+
| 1          |  2       |   3      |
+------------+----------+----------+

繰り返し列は避けられます。

(標準の文法から、自然結合で結合列を指定することはできません。結合は厳密に名前に基づいています。 Wikipedia も参照してください。)

内部結合の出力にチートがあります。a.b.の部分は列名には含まれません。column1column2column1column3は見出しとして使用できます。

217
  • 内側結合は、最初のテーブルからの行が返されるために、結合されたテーブル内の一致する行が必要な結合です。
  • 外部結合は、結合されたテーブル内の一致する行が必須ではない行からの行です。返される最初のテーブル
  • 自然な結合は、結合条件が両方のテーブルの同じ名前の列が一致する場所であると見なす結合です(natural leftまたはnatural rightのいずれかを使用できます)。

自然結合は次の理由で、ペストのような自然結合は使用しないでください。

  • ではない 標準SQL [SQL 92] したがってそうではありません 移植性があり、(ほとんどのSQLコーダで)特に読みにくく、さまざまなツールやライブラリでサポートされていない可能性があります。
  • 有益ではありません。スキーマを参照せずにどの列が結合されているのかわかりません。
  • 結合条件はスキーマの変更に対して目に見えないほど脆弱です - 複数の自然結合列があり、そのような列がテーブルから削除された場合でも、クエリは実行されますが、おそらく正しくなく、動作の変更は無視されます。
  • 努力の価値はほとんどありません。たった10秒の入力で節約できます
77
Bohemian

自然な結合は、結合は単純で同じ名前のフィールドに一致するという前提で、入力を避けるための単なる近道です。

SELECT
  *
FROM
  table1
NATURAL JOIN
  table2
    -- implicitly uses `room_number` to join

と同じです...

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON table1.room_number = table2.room_number

しかし、ショートカット形式ではできないことは、もっと複雑な結合です。

SELECT
  *
FROM
  table1
INNER JOIN
  table2
    ON (table1.room_number = table2.room_number)
    OR (table1.room_number IS NULL AND table2.room_number IS NULL)
22
MatBailie

SQLは多くの点でリレーショナルモデルに忠実ではありません。 SQLクエリの結果は、重複する名前の列、 '匿名'(名前なし)の列、重複する行、NULLなどがあるため、リレーションではありません。SQLは列の順序などに依存するため、テーブルをリレーションとして扱いません。

SQLのNATURAL JOINの背後にある考え方は、リレーショナルモデルにより忠実になりやすくすることです。 2つのテーブルのNATURAL JOINの結果は、名前によって重複排除された列を持つため、匿名列はありません。同様に、UNION CORRESPONDINGおよびEXCEPT CORRESPONDINGは、従来のUNION構文における列の順序に対するSQLの依存関係に対処するために提供されています。

しかし、すべてのプログラミング技法と同様に、それは有用であるためにしつけが必要です。 NATURAL JOINを成功させるための1つの要件は、同じ名前の列に結合が暗黙的に含まれるため、一貫して名前が付けられた列です(SQLで列名を変更する構文は冗長ですが、基本表の列に名前を付けるときに規律を助長することは残念です)とVIEWs :)

SQLのNATURAL JOINは等結合**ですが、実用性を妨げるものではありません。 NATURAL JOINがSQLでサポートされている唯一の結合型であったとしても、それは依然として 関係的に完全な であると考えてください。

NATURAL JOINはすべてINNER JOINとプロジェクション(SELECT)を使って書くことができますが、INNER JOINはproduct(CROSS JOIN)と制限(WHERE)を使って書くこともできます。共通の列名を持たないテーブル間のNATURAL JOINCROSS JOINと同じ結果になることにさらに注意してください。したがって、リレーションである結果だけに興味がある場合は(そしてなぜそうではないのでしょうか?)、NATURAL JOINが必要な唯一の結合タイプです。確かに、言​​語設計の観点からは、INNER JOINCROSS JOINのような短縮形には価値がありますが、ほとんどすべてのSQLクエリは構文的には異なるが意味的に同じ方法で書くことができます。開発が非常に難しい。

意味的に等価ないくつかのクエリ例( 通常の部品とサプライヤのデータベース を使用)は以下のとおりです。

SELECT *
  FROM S NATURAL JOIN SP;

-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
  FROM S INNER JOIN SP 
          USING (SNO);                        

-- Alternative projection
SELECT S.*, PNO, QTY
  FROM S INNER JOIN SP 
          ON S.SNO = SP.SNO;

-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
  FROM S INNER JOIN SP 
      ON S.SNO = SP.SNO;

-- 'Old school'
SELECT S.*, PNO, QTY
  FROM S, SP 
 WHERE S.SNO = SP.SNO;

**リレーショナルナチュラルジョインはエクイジョインではなく、1つのプロジェクションです。 - フィリピー

13
onedaywhen

NATURAL結合は、specificINNER結合-または "equi-join"-の短い構文であり、構文がアンラップされると、両方とも同じリレーショナルを表します代数演算。 OUTERLEFT/RIGHT)またはCROSS結合の場合のように、「異なる種類の」結合ではありません。

ウィキペディアの equi-join セクションを参照してください。

自然結合は、等結合のさらなる特殊化を提供します。 結合述語は、両方のテーブルのすべての列を比較することで暗黙的に発生します結合されたテーブルで同じ列名を持つ結果の結合テーブルには、同じ名前の列のペアごとに1列のみが含まれます。

ほとんどの専門家は同意しますNATURAL JOINは危険であり、その使用を強く推奨しません。危険は、別の列と同じ名前の新しい列を不注意に追加することに起因しています...

つまり、すべてのNATURAL結合はINNER結合として記述できます(ただし、逆は成り立ちません)。そのためには、述語explicitly-を作成するだけです。 USINGまたはON-そして、Jonathan Lefflerが指摘したように、必要に応じて「重複」を避けるために、目的の結果セット列を選択します。

ハッピーコーディング。


NATURALキーワードはLEFTおよびRIGHT結合にも適用でき、同じことが適用されます。NATURAL LEFT/RIGHT結合は特定のLEFT/RIGHT参加。)

8
user166390

ナチュラルジョイン:2つのテーブルのすべての列の組み合わせまたは組み合わせの結果です。 2番目のテーブルに対して最初のテーブルのすべての行を返します。

内部結合:この結合は、2つのテーブルで列名のいずれかがsxameである場合を除き、機能します。

2
Victor Bhatti

ナチュラルジョインは、2つのテーブルがすべての一般的な列に基づいて結合される場所です。

共通列:両方のテーブルで同じ名前を持ち、両方のテーブルで互換性のあるデータ型を持つ列です。 =演算子のみを使用できます

内部結合は、ON句に記載されている共通の列に基づいて2つのテーブルが結合される場所です。

共通列:両方のテーブルで互換性のあるデータ型を持つ列ですが、同じ名前を持つ必要はありません。 =<=>=<><>のような任意の比較演算子だけを使用できます

0
Suchitra Phadke

内部結合と自然結合はほとんど同じですが、それらにはわずかな違いがあります。違いは、自然結合では条件を指定する必要がないことですが、内部結合では必須です。内部結合で条件を指定すると、結果の表はデカルト積のようになります。

0
rashedcs