Quelle est la différence entre une jointure naturelle et une jointure interne?
sql
join
natural-join
forgeron
la source
la source
Réponses:
Une différence significative entre INNER JOIN et NATURAL JOIN est le nombre de colonnes renvoyées.
Considérer:
Le
INNER JOIN
de TableA et TableB sur Colonne1 sera de retourLe
NATURAL JOIN
de TableA et TableB sur Colonne1 renverra: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 le nom. Voir aussi Wikipedia .)
( Il y a un tricheur dans la sortie jointure interne, la
a.
et lesb.
parties ne seraient pas dans les noms de colonnes, vous souhaitez simplement avoircolumn1
,column2
,column1
,column3
comme les rubriques. )la source
NATURAL JOIN
va ruiner exactement , pourquoi c'est inattendu et dans quel monde vous vous trouvez?Customers
etEmployees
, rejoignantEmployeeID
.Employees
a également unManagerID
champ. Tout va bien. Puis, un jour, quelqu'un ajoute unManagerID
champ à laCustomers
table. Votre jointure ne sera pas interrompue (ce serait une grâce), mais elle inclura désormais un deuxième champ et fonctionnera de manière incorrecte . Ainsi, un changement apparemment inoffensif peut briser quelque chose de très éloigné. TRÈS MAUVAIS. Le seul avantage d'une jointure naturelle est d'économiser un peu de frappe et l'inconvénient est substantiel.SELECT * FROM TableA INNER JOIN TableB USING (Column1)
donne 4 colonnes. Ce n'est pas correct carSELECT * FROM TableA INNER JOIN TableB USING (Column1)
etSELECT * FROM TableA NATURAL JOIN TableB
sont égaux, ils donnent tous les deux 3 colonnes.natural left
ou l' autrenatural right
) qui suppose que les critères de jointure correspondent aux colonnes du même nom dans les deux tables.J'éviterais d'utiliser des jointures naturelles comme la peste, car les jointures naturelles sont:
passtandard SQL [SQL 92] etdonc pasportable, pas particulièrement lisible (par la plupart des codeurs SQL) et éventuellement non pris en charge par divers outils / bibliothèquesla source
NATURAL JOIN Checkouts
"à l'id
est omniprésent et inutile de se joindre à; les noms de clé étrangère habituels sonttablename_id
. Les jointures naturelles sont une mauvaise, mauvaise, mauvaise idée.Une jointure naturelle n'est qu'un raccourci pour éviter de taper, avec la présomption que la jointure est simple et correspond aux champs du même nom.
Est le même que...
Ce que vous ne pouvez pas faire avec le format de raccourci, cependant, c'est des jointures plus complexes ...
la source
NATURAL JOIN ... USING ()
? La norme est soita NATURAL JOIN b
oua JOIN b USING (c)
room_number
, tandis que vos jointures internes auront deux colonnes nomméesroom_number
.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 elle peut avoir des colonnes avec des noms en double, des colonnes `` anonymes '' (sans nom), des lignes en double, des valeurs nulles, etc. SQL ne traite pas les tables comme des relations car elle repose sur l'ordre des colonnes, etc.
L'idée
NATURAL JOIN
sous-jacente à SQL est de faciliter la fidélité au modèle relationnel. Le résultat de l'uneNATURAL JOIN
des deux tables aura des colonnes dédoublonnées par nom, donc pas de colonnes anonymes. De même,UNION CORRESPONDING
etEXCEPT CORRESPONDING
sont fournis pour répondre à la dépendance de SQL sur l'ordre des colonnes dans laUNION
syntaxe existante .Cependant, comme pour toutes les techniques de programmation, la discipline doit être utile. Une condition pour réussir
NATURAL JOIN
est des colonnes nommées de manière cohérente, car les jointures sont implicites sur des colonnes avec les mêmes noms (il est dommage que la syntaxe pour renommer les colonnes en SQL soit verbeuse mais l'effet secondaire est d'encourager la discipline lors du nommage des colonnes dans les tables de base etVIEW
s :)Notez qu'un SQL
NATURAL JOIN
est une équi-jointure **, mais ce n'est pas un obstacle à l'utilité. Considérez que siNATURAL JOIN
le seul type de jointure était pris en charge dans SQL, il serait toujours relationnellement complet .S'il est en effet vrai que tout
NATURAL JOIN
peut être écrit à l'aide deINNER JOIN
et projection (SELECT
), il est également vrai que toutINNER JOIN
peut être écrit à l'aide de product (CROSS JOIN
) et restriction (WHERE
); notez en outre qu'unNATURAL JOIN
entre tableaux sans nom de colonne en commun donnera le même résultat queCROSS JOIN
. Donc, si vous êtes uniquement intéressé par les résultats qui sont des relations (et pourquoi jamais?!),NATURAL JOIN
C'est le seul type de jointure dont vous avez besoin. Bien sûr, il est vrai que dans une perspective de conception de langage, les raccourcis tels queINNER JOIN
etCROSS JOIN
ont leur valeur, mais considèrent également que presque toutes les requêtes SQL peuvent être écrites de 10 manières syntaxiquement différentes, mais sémantiquement équivalentes, et c'est ce qui rend les optimiseurs SQL si durs développer.Voici quelques exemples de requêtes (utilisant la base de données de pièces et fournisseurs habituelles ) qui sont sémantiquement équivalentes:
** La jointure relationnelle naturelle n'est pas une équijoin, c'est une projection d'une. - philipxy
la source
Une
NATURAL
jointure est juste une syntaxe courte pour une jointure spécifiqueINNER
- ou "équi-jointure" - et, une fois la syntaxe déployée, les deux représentent la même opération d'algèbre relationnelle. Ce n'est pas un "type différent" de jointure, comme dans le cas deOUTER
(LEFT
/RIGHT
) ou deCROSS
jointures.Voir la section equi-join sur Wikipedia:
Autrement dit, toutes les
NATURAL
jointures peuvent être écrites sous forme deINNER
jointures (mais l'inverse n'est pas vrai). Pour ce faire, il suffit de créer le prédicat explicitement - par exempleUSING
ouON
- et, comme l'a souligné Jonathan Leffler, sélectionnez les colonnes de l'ensemble de résultats souhaitées pour éviter les "doublons" si vous le souhaitez.Codage heureux.
(Le
NATURAL
mot-clé peut également être appliqué àLEFT
etRIGHT
jointures, et la même chose s'applique. UneNATURAL LEFT/RIGHT
jointure n'est qu'une courte syntaxe pour une jointure spécifiqueLEFT/RIGHT
.)la source
Jointure naturelle: c'est la combinaison ou le résultat combiné de toutes les colonnes des deux tables. Il renverra toutes les lignes de la première table par rapport à la deuxième table.
Jointure interne: cette jointure fonctionnera sauf si l'un des noms de colonne doit être sxame dans deux tables
la source
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 ne pouvez utiliser que l'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: est une colonne qui a des types de données compatibles dans les deux tables mais qui n'a pas besoin d'avoir le même nom. Vous ne pouvez utiliser que tout opérateur comme comparision
=
,<=
,>=
,<
,>
,<>
la source
la différence est que dans la jointure interne (equi / default) et la jointure naturelle qui, dans la victoire de la colonne commune natuarl join, seront affichées en une seule fois, mais la jointure interne / equi / default / simple la colonne commune sera affichée en double.
la source
La jointure interne et la jointure naturelle sont presque identiques, mais il existe une légère différence entre elles. La différence est dans la jointure naturelle, pas besoin de spécifier de 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.
la source
JOINTURE INTERNE :
la source
Jointure interne, joignez deux tables dont le nom de colonne est identique.
Jointure naturelle, joignez deux tables où le nom de la colonne et les types de données sont identiques.
la source
NATURAL JOIN
(comme plusieurs personnes l'ont souligné il y a des années) est celui où les noms de colonne sont les mêmes. Le type de données n'a pas besoin d'être le même. Les champs utilisés pour unINNER JOIN
besoin n'ont pas le même nom.