Quelle est la différence entre une jointure naturelle et une jointure interne?
Une différence significative entre INNER JOIN et NATURAL JOIN est le nombre de colonnes renvoyées.
Considérer:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
Le INNER JOIN
de TableA et TableB sur Column1 renverra
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 |
+------------+-----------+----------+----------+
Le NATURAL JOIN
de TableA et TableB sur Column1 renverra:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
La colonne répétée est évitée.
(AFAICT de la grammaire standard, vous ne pouvez pas spécifier les colonnes de jointure dans une jointure naturelle; la jointure est strictement basée sur un nom. Voir aussi Wikipedia .)
(Il y a un tricheur dans la sortie de la jointure interne; les parties a.
et b.
ne figurent pas dans les noms des colonnes; il vous suffirait que vous ayez column1
, column2
, column1
, column3
.)
natural left
ou natural right
) en supposant que les critères de jointure correspondent aux colonnes correspondant aux mêmes noms dans les deux tables.Je voudrais éviter d'utiliser des jointures naturelles comme la peste, car les jointures naturelles sont:
Une jointure naturelle est juste un raccourci pour éviter la frappe, avec la présomption que la jointure est simple et correspond aux champs du même nom.
SELECT
*
FROM
table1
NATURAL JOIN
table2
USING (room_number)
Est le même que...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
Ce que vous ne pouvez pas faire avec le format de raccourci, cependant, ce sont des jointures plus complexes ...
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 n'est pas fidèle au modèle relationnel à bien des égards. Le résultat d'une requête SQL n'est pas une relation car il peut contenir des colonnes avec des noms en double, des colonnes "anonymes" (non nommées), des lignes en double, des valeurs nulles, etc. SQL ne traite pas les tables comme des relations car il repose sur l'ordre des colonnes, etc.
L'idée derrière NATURAL JOIN
en SQL est de rendre plus facile la fidélité au modèle relationnel. Le résultat du NATURAL JOIN
de deux tables aura des colonnes dédupliquées par nom, donc pas de colonnes anonymes. De même, UNION CORRESPONDING
et EXCEPT CORRESPONDING
sont fournis pour résoudre la dépendance de SQL vis-à-vis de l'ordre des colonnes dans la syntaxe héritée UNION
.
Cependant, comme pour toutes les techniques de programmation, il faut de la discipline pour être utile. Une exigence pour un NATURAL JOIN
réussi est de nommer systématiquement les colonnes, car les jointures sont impliquées dans les colonnes portant le même nom (il est dommage que la syntaxe de changement de nom des colonnes en SQL soit détaillée, mais l’effet secondaire est d’encourager la discipline lors du nommage des colonnes dans les tables de base. et VIEW
s :)
Notez qu'un SQL NATURAL JOIN
est une équi-jointure **, cependant, cela n'est pas un obstacle à l'utilité. Considérez que si NATURAL JOIN
était le seul type de jointure pris en charge dans SQL, il serait toujours relationnellement complet .
Bien qu'il soit vrai que tout NATURAL JOIN
puisse être écrit en utilisant INNER JOIN
et projection (SELECT
), il est également vrai que tout INNER JOIN
peut être écrit en utilisant product (CROSS JOIN
) et restriction (WHERE
); De plus, notez qu'un NATURAL JOIN
entre des tables sans noms de colonnes en commun donnera le même résultat que CROSS JOIN
. Donc, si vous êtes uniquement intéressé par les résultats qui sont des relations (et pourquoi pas?!), Alors NATURAL JOIN
est le seul type de jointure dont vous avez besoin. Bien sûr, il est vrai que, du point de vue de la conception du langage, les raccourcis tels que INNER JOIN
et CROSS JOIN
ont leur valeur, mais vous pouvez également considérer que presque toutes les requêtes SQL peuvent être écrites de 10 façons différentes sur le plan syntaxique, mais équivalentes sur le plan sémantique. très difficile à développer.
Voici quelques exemples de requêtes (utilisant la base de données habituelle sur les pièces et les fournisseurs ) qui sont sémantiquement équivalentes:
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' style
SELECT *
FROM S, SP
WHERE S.SNO = SP.SNO;
** La jointure naturelle relationnelle n’est pas une équijointure, mais une projection de celle-ci. - philipxy
Une jointure NATURAL
est simplement une syntaxe courte pour une jointure spécifiqueINNER
- ou "équi-jointure" - et, une fois que la syntaxe est décompressée, les deux représentent la même opération de calcul formel. Ce n'est pas un "type différent" de jointure, comme dans le cas de OUTER
(LEFT
RIGHT
) ou CROSS
jointures.
Voir la section equi-join sur Wikipedia:
Une jointure naturelle offre une spécialisation supplémentaire des équi-jointes. _/Le prédicat de jointure découle implicitement de la comparaison de toutes les colonnes des deux tables qui portent le même nom de colonne dans les tables jointes. La table jointe résultante ne contient qu'une colonne pour chaque paire de colonnes portant le même nom.
La plupart des experts s'accordent pour dire que {que les JOINNELS NATURELS sont dangereux et découragent par conséquent leur utilisation. _ Le danger provient de l'ajout par inadvertance d'une nouvelle colonne, nommée comme une autre colonne ...
C'est-à-dire que toutes les jointures NATURAL
peuvent être écrites comme des jointures INNER
} _ (mais l'inverse n'est pas vrai). Pour ce faire, il suffit de créer le prédicat explicitement - par exemple. USING
ou ON
- et, comme Jonathan Leffler l’a souligné, sélectionnez les colonnes du jeu de résultats souhaitées pour éviter les "doublons" si vous le souhaitez.
Bonne codage.
(Le mot clé NATURAL
peut également être appliqué aux jointures LEFT
et RIGHT
. Il en va de même. Une jointure NATURAL LEFT/RIGHT
est simplement une syntaxe courte pour une jointure spécifiqueLEFT/RIGHT
.)
Jointure naturelle: Il s'agit de la combinaison ou du résultat combiné de toutes les colonnes des deux tables . Elle renverra toutes les lignes de la première table par rapport à la seconde.
Jointure interne: cette jointure fonctionnera sauf si l'un des noms de colonne doit être sxame dans deux tables
Une jointure naturelle est l'endroit où 2 tables sont jointes sur la base de toutes les colonnes communes.
colonne commune: est une colonne qui a le même nom dans les deux tables + a des types de données compatibles dans les deux tables . Vous pouvez utiliser seulement = opérateur
Une jointure interne est l'endroit où 2 tables sont jointes sur la base des colonnes communes mentionnées dans la clause ON.
colonne commune: colonne contenant des types de données compatibles dans les deux tables mais ne nécessitant pas le même nom . Vous pouvez uniquement utiliser un opérateur de comparaison comme =
, <=
, >=
, <
, >
, <>
Les jointures internes et naturelles sont presque identiques, mais il existe une légère différence entre elles. La différence est dans la jointure naturelle, il n'est pas nécessaire de spécifier la condition, mais dans la condition de jointure interne est obligatoire. Si nous spécifions la condition dans la jointure interne, les tables résultantes sont comme un produit cartésien.