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