243 votes

Différence entre jointure naturelle et jointure interne

Quelle est la différence entre une jointure naturelle et une jointure interne ?

6 votes

Cette question ne fait pas double emploi avec l'autre, car elle porte sur les jointures INNER et NATURAL, qui ne sont pas abordées dans l'autre question.

2 votes

À un moment donné, ce site a été fermé en tant que duplicata de Quelle est la différence entre les jointures gauche, droite, extérieure et intérieure ? mais cette question ne traite pas de la différence entre les jointures internes et les jointures naturelles.

290voto

Jonathan Leffler Points 299946

Une différence importante entre INNER JOIN et NATURAL JOIN est le nombre de colonnes retournées.

Pensez-y :

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

El INNER JOIN de la TableA et de la TableB sur la Colonne1 retournera

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      |
+------------+-----------+----------+----------+

El NATURAL JOIN de la TableA et de la TableB sur la Colonne1 sera retourné :

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

La colonne répétée est évitée.

(D'après la grammaire standard, vous ne pouvez pas spécifier les colonnes de jonction dans une jointure naturelle ; la jointure est strictement basée sur le nom. Voir aussi Wikipedia .)

( Il y a une tricherie dans la sortie de la jointure interne ; la a. y b. ne seraient pas dans les noms de colonnes ; vous auriez juste column1 , column2 , column1 , column3 en tant qu'en-têtes. )

0 votes

Je ne suis pas sûr d'adhérer à cette idée en particulier (un INNER JOIN pourrait être construit avec la balise exactement la même chose ensemble de résultats), bien qu'il aborde le général : "un comportement magique à court terme".

2 votes

J'ai deux tables TableA(Column1,Column2) et TableB(Column2,Column3).

26 votes

La réduction des colonnes dans la sortie est l'aspect le moins important d'une jointure naturelle. Ce que vous devez savoir, c'est que (A) la jointure se fait automatiquement sur des champs de même nom et (B) elle vous foutra dans la merde au moment où vous vous y attendrez le moins. Dans mon monde, l'utilisation d'une jointure naturelle est un motif de licenciement.

97voto

Bohemian Points 134107
  • Un site intérieur La jointure est une jointure où la ligne correspondante dans la table jointe est requise pour qu'une ligne de la première table soit retournée.
  • Un site extérieur Une jointure est une jointure où la ligne correspondante dans la table jointe est no nécessaire pour qu'une ligne de la première table soit retournée
  • A naturel join est une jointure (vous pouvez avoir soit natural left o natural right ) qui suppose que les critères de jointure sont ceux où les colonnes de même nom dans les deux tables correspondent.

J'éviterais d'utiliser les jointures naturelles comme la peste, car les jointures naturelles sont.. :

  • no standard sql [SQL 92] et donc pas portable, pas particulièrement lisible (par la plupart des codeurs SQL) et éventuellement non pris en charge par divers outils/bibliothèques.
  • non informatif ; vous ne pouvez pas savoir quelles colonnes sont jointes sans vous référer au schéma.
  • vos conditions de jointure sont invisiblement vulnérables aux changements de schéma - s'il existe plusieurs colonnes de jointure naturelles et que l'une d'entre elles est supprimée d'une table, la requête s'exécutera quand même, mais probablement pas correctement et ce changement de comportement sera silencieux.
  • Cela ne vaut guère la peine ; vous n'économisez que 10 secondes de frappe.

2 votes

Je pense que la gauche/droite pour l'extérieur devrait être mentionnée (puisque l'extérieur est mentionné tout court). Mais sinon, c'est bien et concis : il ne manque que les jolis exemples de diagrammes d'enregistrements SQL.

2 votes

La GAUCHE NATURELLE et la DROITE NATURELLE existent également. Mais oui, évitez-les quand même.

1 votes

@Bohème, En ce qui concerne le fait de "les éviter comme la peste", il existe des cas d'utilisation réels des jointures naturelles pour lesquels elles s'avèrent utiles. mariadb.com/kb/en/sql-99/natural-join "...L'apparence décontractée des "Livres NATURAL JOIN Checkouts " n'est possible que lorsque les conventions de nommage des bases de données sont formelles et appliquées...."

32voto

MatBailie Points 37610

Une jointure naturelle n'est qu'un raccourci pour éviter la saisie, avec la présomption que la jointure est simple et correspond à des champs de même nom.

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

C'est la même chose que...

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

Ce que vous ne pouvez pas faire avec le format 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)

3 votes

@JonathanLeffler - Dans MySQL, certainement.

3 votes

OK - intéressant. J'ai posé la question parce que la norme SQL ne semble pas le permettre (mais des extensions sont toujours possibles).

0 votes

Quel SGBD permet cette syntaxe non standard ? NATURAL JOIN ... USING () ? La norme est soit a NATURAL JOIN b o a JOIN b USING (c)

16voto

onedaywhen Points 24594

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 parce qu'il peut avoir des colonnes avec des noms en double, des colonnes "anonymes" (sans nom), des lignes en double, des nuls, etc. SQL ne traite pas les tables comme des relations car il s'appuie sur l'ordre des colonnes, etc.

L'idée derrière NATURAL JOIN en SQL est de permettre d'être plus fidèle au modèle relationnel. Le résultat de la NATURAL JOIN de deux tables aura des colonnes dé-dupliquées par nom, donc pas de colonnes anonymes. De même, UNION CORRESPONDING y EXCEPT CORRESPONDING sont fournis pour remédier à la dépendance de SQL à l'égard de l'ordre des colonnes dans l'ancien système de gestion de l'information. UNION la syntaxe.

Cependant, comme toutes les techniques de programmation, elle nécessite de la discipline pour être utile. L'une des conditions de réussite d'une NATURAL JOIN sont des colonnes nommées de manière cohérente, parce que les jointures sont implicites sur les colonnes ayant le même nom (il est dommage que la syntaxe pour renommer les colonnes en SQL soit verbeuse, mais l'effet secondaire est d'encourager la discipline lors de la dénomination des colonnes dans les tables de base et les VIEW s :)

Note a SQL NATURAL JOIN est une équi-jonction**, mais cela ne l'empêche pas d'être utile. Considérez que si NATURAL JOIN était le seul type de jointure supporté en SQL, il serait toujours Relationnel complet .

S'il est vrai que tout NATURAL JOIN peut être écrit en utilisant INNER JOIN et la projection ( SELECT ), il est également vrai que toute INNER JOIN peut être écrit en utilisant le produit ( CROSS JOIN ) et la restriction ( WHERE ) ; on notera en outre que a NATURAL JOIN entre des tables n'ayant aucun nom de colonne en commun donnera le même résultat que CROSS JOIN . Donc, si vous ne vous intéressez qu'aux 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, des raccourcis tels que INNER JOIN y CROSS JOIN ont leur valeur, mais il faut aussi tenir compte du fait que presque toutes les requêtes SQL peuvent être écrites de 10 manières différentes sur le plan syntaxique, mais équivalentes sur le plan sémantique, et c'est ce qui rend les optimiseurs SQL si difficiles à développer.

Voici quelques exemples de requêtes (utilisant la base de données habituelle des pièces et des fournisseurs ) qui sont sémantiquement équivalents :

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;

** La jointure naturelle relationnelle n'est pas une équijointe, c'est une projection d'une équijointe. - philipxy

0 votes

La jointure naturelle relationnelle n'est pas une équijointure, c'est une projection de celle-ci. La jointure naturelle SQL est une equijoin SQL (duplications possibles) - elle est définie en termes de jointure interne en utilisant.

0 votes

@philipxy : Merci, j'ai fait des modifications. N'hésitez pas à éditer - cette réponse ou n'importe laquelle de mes réponses - pour les inexactitudes et les malentendus. Je continue à apprendre de vous :)

9voto

A NATURAL La jointure est une syntaxe courte pour un spécifique INNER join -- ou "equi-join" -- et, une fois la syntaxe démêlée, les deux représentent la même opération d'algèbre relationnelle. Il ne s'agit pas d'un "type différent" de jointure, comme dans le cas de OUTER ( LEFT / RIGHT ) ou CROSS rejoint.

Voir le équi-joint sur Wikipédia :

Une jointure naturelle offre une spécialisation supplémentaire des équi-joints. Le prédicat de jointure est obtenu implicitement en comparant toutes les colonnes des deux tables. qui ont les mêmes noms de colonnes dans les tables jointes. La table jointe qui en résulte contient une seule colonne pour chaque paire de colonnes de même nom.

La plupart des experts sont d'accord que les JOINTS NATURELS sont dangereux et découragent donc fortement leur utilisation. Le danger vient de l'ajout par inadvertance d'une nouvelle colonne, portant le même nom qu'une autre colonne ...

C'est-à-dire, tous NATURAL peut s'écrire comme suit INNER rejoint (mais l'inverse n'est pas vrai). Pour ce faire, il suffit de créer le prédicat explicitement -- par exemple USING o ON -- et, comme l'a souligné Jonathan Leffler, sélectionnez les colonnes de l'ensemble des résultats souhaités pour éviter les "doublons" si vous le souhaitez.

Bon codage.


(Le NATURAL Le mot-clé peut également être appliqué à LEFT y RIGHT rejoint, et il en va de même. A NATURAL LEFT/RIGHT est juste une syntaxe courte pour une spécifique LEFT/RIGHT joindre.)

2 votes

"NATURAL join n'est qu'une syntaxe courte pour [snipped] "equi-join" -- et, une fois que la syntaxe est déballée, les deux représentent la même algèbre relationnelle" - vous avez raison : c'est vrai pour l'algèbre relationnelle mais votre réponse s'effondre après cela, par exemple : "La plupart des experts s'accordent à dire que les NATURAL JOINs sont dangereux et déconseillent donc fortement leur utilisation" - quels experts de l'algèbre relationnelle disent cela ?!

0 votes

"Non, la jointure naturelle est une projection d'une (jointure interne d'une forme que l'on peut raisonnablement appeler une) jointure equijoin. Il existe également des jointures naturelles internes et externes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X