Différence entre JOIN et INNER JOIN

1000

Ces deux jointures me donneront les mêmes résultats:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

contre

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

Y a-t-il une différence entre les déclarations de performance ou autre?

Cela diffère-t-il entre les différentes implémentations SQL ?

driis
la source
2
Voir cette question: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn
6
Remarque: CROSS JOIN est un bon type de jointure (il diffère de INNER JOIN).
Serge

Réponses:

1093

Ils sont fonctionnellement équivalents, mais INNER JOINpeuvent être un peu plus clairs à lire, surtout si la requête contient d'autres types de jointures (c'est LEFT-à- dire ou RIGHTou CROSS).

cheval pâle
la source
11
Est-ce vrai pour toutes les bases de données (par exemple SQL, postgres?) Quelqu'un connaît-il un lien vers la documentation expliquant cela?
Chogg
4
C'est la norme SQL ANSI. Voir plus: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
Indien
14
La requête est suffisamment claire simplement en écrivant JOIN, INNER n'est que du bruit.
Ivanzinho
22
Je suis peut-être un puriste, mais je pense qu'il vaut mieux être explicite qu'implicite lors de l'écriture de SQL. INNER JOIN est plus lisible, en particulier dans les requêtes complexes.
bruceskyaus
3
@Ivanzinho: les touches du clavier ne sont pas la mesure de la complexité des requêtes ou des programmes. La complexité réelle vient de la maintenabilité, où la lisibilité joue un rôle majeur. Le fait que quand il dit INNER JOIN, vous pouvez être sûr de ce qu'il fait et que c'est censé être juste cela, alors qu'un simple JOIN vous laissera, ou quelqu'un d'autre, se demandant ce que la norme a dit sur la mise en œuvre et était l'INNER / EXTERIEUR / GAUCHE laissé de côté par accident ou par intention.
Tuukka Haapaniemi
243

Non, il n'y a pas de différence, du sucre syntaxique pur .

Quassnoi
la source
22
Je n'appellerais pas ce sucre syntaxique. Type de jointure "par défaut", "raccourci" ou "alias", peut-être.
mk12
62
En informatique, le sucre syntaxique est la syntaxe d'un langage de programmation conçu pour faciliter la lecture ou l'expression . Je crois que la capacité d'omettre INNERrelève de cette définition.
Quassnoi
14
Si vous appliquez la définition très littéralement, oui, mais je l'ai toujours vue réservée à des types de syntaxe plus intéressants, pas seulement des noms alternatifs pour les choses.
mk12
10
@Quassnoi le simple fait que cette question soit posée, montre que l'absence de INNERne rend pas la requête plus facile à lire. Pour autant que je sache, cela JOINpourrait bien vouloir dire LEFT JOINsi cela n'était pas clarifié par les réponses ici.
martennis
2
@Quassnoi L'instruction wiki d'introduction citée de votre commentaire est vraie pour le sucre syntaxique, mais elle est inadéquate en tant que définition. Le sucrage syntaxique concerne une syntaxe plus simple pour des cas particuliers de syntaxe complexe. Il est plus approprié de dire que INNER est un "mot de bruit".
philipxy
144

INNER JOIN = JOIN

INNER JOIN est la valeur par défaut si vous ne spécifiez pas le type lorsque vous utilisez le mot JOIN.

Vous pouvez également utiliser LEFT OUTER JOIN ou RIGHT OUTER JOIN, auquel cas le mot OUTER est facultatif, ou vous pouvez spécifier CROSS JOIN.

OU

Pour une jointure interne, la syntaxe est:

SELECT ...
FROM TableA
[INNER] JOIN TableB

(en d'autres termes, le mot clé "INNER" est facultatif - les résultats sont les mêmes avec ou sans lui)

net_prog
la source
59

Cela diffère-t-il entre les différentes implémentations SQL?

Oui, Microsoft Access ne permet pas seulement join. Cela nécessite inner join.

Michał Powaga
la source
54

De même avec OUTER JOINs, le mot "OUTER"est facultatif. C'est le mot-clé LEFTou RIGHTqui fait le JOINan "OUTER" JOIN.

Cependant, pour une raison quelconque, j'utilise toujours "OUTER"comme dans LEFT OUTER JOINet jamais LEFT JOIN, mais je n'utilise jamais INNER JOIN, mais plutôt j'utilise simplement "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID
Kristen
la source
23
Je suis l'opposé de vous: je dis toujours "INNER JOIN" mais je n'utilise jamais OUTER; donc "LEFT JOIN" et "RIGHT JOIN". Je suppose que je garde juste le nombre de mes personnages constant!
Stephen Holt
10
@ Jonathan. Il n'y a pas de concept de direction sur une jointure interne. Les jointures externes peuvent produire des ensembles de résultats inégalés et ceux-ci peuvent varier en fonction de la direction. L'intérieur nécessite une correspondance pour que la direction n'ait pas d'importance.
Karl Kieninger
32

Comme les autres réponses l'indiquent déjà, il n'y a pas de différence dans votre exemple.

Le bit de grammaire pertinent est documenté ici

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Montrant que tous sont facultatifs. La page précise en outre que

INNERSpécifie que toutes les paires de lignes correspondantes sont renvoyées. Ignore les lignes sans correspondance des deux tables. Lorsqu'aucun type de jointure n'est spécifié, il s'agit de la valeur par défaut .

La grammaire indique également qu'il y a une fois où cela INNER est nécessaire. Lors de la spécification d'un indice de jointure.

Voir l'exemple ci-dessous

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

entrez la description de l'image ici

Martin Smith
la source