228

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

4

11 に答える 11

275

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

検討:

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

Column1のINNER JOINTableAとTableBのは

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

Column1のNATURAL JOINTableAとTableBは次を返します。

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

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

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

内部結合出力にチートがあります。a.およびb.パーツは列名に含まれません。見出しとして、、、、が含まれているcolumn1だけcolumn2ですcolumn1column3

于 2012-01-01T23:51:06.877 に答える
93
  • 内部結合とは、最初のテーブルの行が返されるために、結合されたテーブルの一致する行が必要な結合です。
  • 外部結合とは、最初のテーブルの行が返されるために、結合されたテーブルの一致する行が不要な結合です
  • 自然結合は、結合基準が両方のテーブルの同じ名前の列が一致する場所であると想定する結合(またはのいずれかを持つことができます)ですnatural leftnatural right

自然結合は次のとおりであるため、ペストのような自然結合の使用は避けます。

  • 標準のSQL[SQL92]ではないため、移植性がなく、特に読み取り可能ではなく(ほとんどのSQLコーダーによって)、さまざまなツール/ライブラリでサポートされていない可能性があります
  • 有益ではありません。スキーマを参照せずに、どの列が結合されているかを知ることはできません
  • 結合条件はスキーマの変更に対して目に見えないほど脆弱です-複数の自然結合列があり、そのような列の1つがテーブルから削除された場合でも、クエリは実行されますが、おそらく正しくはなく、この動作の変更はサイレントになります
  • 努力する価値はほとんどありません。タイピングの約10秒しか節約できません
于 2012-01-01T23:50:42.037 に答える
28

自然結合は、入力を回避するための単なるショートカットであり、結合は単純であり、同じ名前のフィールドに一致することを前提としています。

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)
于 2012-01-01T23:50:18.173 に答える
15

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

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

ただし、すべてのプログラミング手法と同様に、役に立つには規律が必要です。成功するための 1 つの要件は、NATURAL JOIN列に一貫した名前を付けることです。これは、結合が同じ名前の列に対して暗示されるためです (SQL で列の名前を変更するための構文が冗長であることは残念ですが、その副作用は、ベース テーブルで列に名前を付ける際の規律を促進し、VIEWs :)

SQLNATURAL JOINは等結合**であることに注意してください。ただし、これは有用性を妨げるものではありません。NATURAL JOINが SQL でサポートされている唯一の結合タイプであったとしても、それはまだリレーショナル コンプリートであると考えてください。

any は射影 ( )NATURAL JOINを使用して記述できることは確かですが、積 ( ) と制限 ( )を使用して記述できることも事実です。さらに、共通の列名のないテーブル間では、 と同じ結果が得られることに注意してください。したがって、リレーションである結果のみに関心がある場合 (そして、なぜそうでないのですか?!)は、必要な唯一の結合タイプです。確かに、言​​語設計の観点から、やなどの省略表現には価値があることは事実ですが、ほぼすべての SQL クエリは、構文的には異なるが意味的には同等の 10 の方法で記述できることも考慮してください。これが、SQL オプティマイザを非常に困難にしている理由です。開発する。INNER JOINSELECTINNER JOINCROSS JOINWHERENATURAL JOINCROSS JOINNATURAL JOININNER JOINCROSS JOIN

以下は、意味的に同等のクエリの例です (通常の部品とサプライヤーのデータベースを使用)。

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;

** リレーショナル自然結合は等価結合ではなく、等価結合です。– フィリップシー

于 2012-01-03T10:24:38.307 に答える
9

結合は、特定の結合(または「equi-join」)NATURALの短い構文であり、構文がラップ解除されると、どちらも同じ関係代数演算を表します。(/ )や結合の場合のように、「異なる種類」の結合ではありません。 INNEROUTERLEFTRIGHTCROSS

ウィキペディアの等結合セクションを参照してください。

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

ほとんどの専門家は、NATURAL JOINは危険であるため、その使用を強く推奨しないことに同意しています。危険は、別の列と同じ名前の新しい列を誤って追加することから発生します...

つまり、すべての結合は結合NATURALとして記述できますINNER(ただし、その逆は当てはまりません)。これを行うには、述語を明示的に作成します (たとえばUSING、またはON)。JonathanLefflerが指摘したように、必要に応じて「重複」を回避するために、目的の結果セット列を選択します。

ハッピーコーディング。


NATURALキーワードはLEFTRIGHT結合にも適用できます。同じことが適用されます。結合は、特定NATURAL LEFT/RIGHTの結合の短い構文にすぎません。) LEFT/RIGHT

于 2012-01-02T00:07:42.330 に答える
2

自然結合: 2 つのテーブルのすべての列の結合または結合結果です。2 番目のテーブルに関して、最初のテーブルのすべての行が返されます。

内部結合: この結合は、列名のいずれかが 2 つのテーブルで sxame でない限り機能します。

于 2012-11-11T16:32:40.633 に答える