自然結合と内部結合の違いは何ですか?
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.
の部分は列名には含まれません。column1
、column2
、column1
、column3
は見出しとして使用できます。)
natural left
またはnatural right
のいずれかを使用できます)。自然結合は次の理由で、ペストのような自然結合は使用しないでください。
自然な結合は、結合は単純で同じ名前のフィールドに一致するという前提で、入力を避けるための単なる近道です。
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)
SQLは多くの点でリレーショナルモデルに忠実ではありません。 SQLクエリの結果は、重複する名前の列、 '匿名'(名前なし)の列、重複する行、NULLなどがあるため、リレーションではありません。SQLは列の順序などに依存するため、テーブルをリレーションとして扱いません。
SQLのNATURAL JOIN
の背後にある考え方は、リレーショナルモデルにより忠実になりやすくすることです。 2つのテーブルのNATURAL JOIN
の結果は、名前によって重複排除された列を持つため、匿名列はありません。同様に、UNION CORRESPONDING
およびEXCEPT CORRESPONDING
は、従来のUNION
構文における列の順序に対するSQLの依存関係に対処するために提供されています。
しかし、すべてのプログラミング技法と同様に、それは有用であるためにしつけが必要です。 NATURAL JOIN
を成功させるための1つの要件は、同じ名前の列に結合が暗黙的に含まれるため、一貫して名前が付けられた列です(SQLで列名を変更する構文は冗長ですが、基本表の列に名前を付けるときに規律を助長することは残念です)とVIEW
s :)
SQLのNATURAL JOIN
は等結合**ですが、実用性を妨げるものではありません。 NATURAL JOIN
がSQLでサポートされている唯一の結合型であったとしても、それは依然として 関係的に完全な であると考えてください。
NATURAL JOIN
はすべてINNER JOIN
とプロジェクション(SELECT
)を使って書くことができますが、INNER JOIN
はproduct(CROSS JOIN
)と制限(WHERE
)を使って書くこともできます。共通の列名を持たないテーブル間のNATURAL JOIN
はCROSS JOIN
と同じ結果になることにさらに注意してください。したがって、リレーションである結果だけに興味がある場合は(そしてなぜそうではないのでしょうか?)、NATURAL JOIN
が必要な唯一の結合タイプです。確かに、言語設計の観点からは、INNER JOIN
やCROSS 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つのプロジェクションです。 - フィリピー
NATURAL
結合は、specificINNER
結合-または "equi-join"-の短い構文であり、構文がアンラップされると、両方とも同じリレーショナルを表します代数演算。 OUTER
(LEFT
/RIGHT
)またはCROSS
結合の場合のように、「異なる種類の」結合ではありません。
ウィキペディアの equi-join セクションを参照してください。
自然結合は、等結合のさらなる特殊化を提供します。 結合述語は、両方のテーブルのすべての列を比較することで暗黙的に発生します結合されたテーブルで同じ列名を持つ。結果の結合テーブルには、同じ名前の列のペアごとに1列のみが含まれます。
ほとんどの専門家は同意しますNATURAL JOINは危険であり、その使用を強く推奨しません。危険は、別の列と同じ名前の新しい列を不注意に追加することに起因しています...
つまり、すべてのNATURAL
結合はINNER
結合として記述できます(ただし、逆は成り立ちません)。そのためには、述語explicitly-を作成するだけです。 USING
またはON
-そして、Jonathan Lefflerが指摘したように、必要に応じて「重複」を避けるために、目的の結果セット列を選択します。
ハッピーコーディング。
(NATURAL
キーワードはLEFT
およびRIGHT
結合にも適用でき、同じことが適用されます。NATURAL LEFT/RIGHT
結合は特定のLEFT/RIGHT
参加。)
ナチュラルジョイン:2つのテーブルのすべての列の組み合わせまたは組み合わせの結果です。 2番目のテーブルに対して最初のテーブルのすべての行を返します。
内部結合:この結合は、2つのテーブルで列名のいずれかがsxameである場合を除き、機能します。
ナチュラルジョインは、2つのテーブルがすべての一般的な列に基づいて結合される場所です。
共通列:両方のテーブルで同じ名前を持ち、両方のテーブルで互換性のあるデータ型を持つ列です。 =演算子のみを使用できます
内部結合は、ON句に記載されている共通の列に基づいて2つのテーブルが結合される場所です。
共通列:両方のテーブルで互換性のあるデータ型を持つ列ですが、同じ名前を持つ必要はありません。 =
、<=
、>=
、<
、>
、<>
のような任意の比較演算子だけを使用できます
内部結合と自然結合はほとんど同じですが、それらにはわずかな違いがあります。違いは、自然結合では条件を指定する必要がないことですが、内部結合では必須です。内部結合で条件を指定すると、結果の表はデカルト積のようになります。