web-dev-qa-db-fra.com

Différence entre jointure naturelle et jointure interne

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

167
smith

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.)

205
Jonathan Leffler
  • Une jointure inner est une jointure dans laquelle la ligne correspondante de la table jointe est requise pour qu'une ligne de la première table soit renvoyée.
  • Une jointure outer est une jointure dans laquelle la ligne correspondante de la table jointe est pas / requise pour qu'une ligne de la première table soit renvoyée
  • Une jointure natural est une jointure (vous pouvez avoir soit 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:

  • ne pas SQL standard [SQL 92] et donc pas portable, pas particulièrement lisible (par la plupart des codeurs SQL) et éventuellement pas pris en charge par divers outils/bibliothèques
  • pas informatif; vous ne pouvez pas dire quelles colonnes sont jointes sans faire référence au schéma
  • vos conditions de jointure sont invisiblement vulnérables aux modifications de schéma - s'il existe plusieurs colonnes de jointure naturelles et qu'une de ces colonnes est supprimée d'une table, la requête sera toujours exécutée, mais probablement pas correctement et cette modification de comportement sera silencieuse.
  • peine la peine de l'effort; vous ne économisez qu'environ 10 secondes de frappe
76
Bohemian

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)
23
MatBailie

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 VIEWs :) 

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 

11
onedaywhen

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 (LEFTRIGHT) 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.)

8
user166390

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

2
Victor Bhatti

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 =, <=, >=, <, >, <>

1
Suchitra Phadke

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.

0
rashedcs