Diferencia entre JOIN y INNER JOIN

1000

Ambas uniones me darán los mismos resultados:

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

vs

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

¿Hay alguna diferencia entre las declaraciones en el desempeño o no?

¿Difiere entre diferentes implementaciones de SQL ?

driis
fuente
2
Vea esta pregunta: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn
66
Como nota al margen: CROSS JOIN es un tipo de unión bueno para conocer (difiere de INNER JOIN).
Serge

Respuestas:

1093

Son funcionalmente equivalentes, pero INNER JOINpueden ser un poco más claros de leer, especialmente si la consulta tiene otros tipos de unión (es decir, LEFTor RIGHTo CROSS) incluidos en ella.

caballo pálido
fuente
11
¿Es esto cierto para todas las bases de datos (por ejemplo, SQL, postgres?) ¿Alguien sabe un enlace a la documentación que explica esto?
Chogg
44
Es el estándar ANSI SQL. Ver más: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
India
14
La consulta es lo suficientemente clara con solo escribir JOIN, INNER es solo ruido.
Ivanzinho
22
Tal vez soy un purista, pero creo que es mejor ser explícito que implícito al escribir SQL. INNER JOIN es más legible, especialmente en consultas complejas.
bruceskyaus
3
@Ivanzinho: Las pulsaciones del teclado no son la medida de la consulta o la complejidad del programa. La complejidad de la vida real proviene de la capacidad de mantenimiento, donde la legibilidad juega un papel importante. El hecho de que cuando dice INNER JOIN, puedes estar seguro de lo que hace y de que se supone que es solo eso, mientras que un JOIN simple te dejará a ti, oa otra persona, preguntándose qué dijo el estándar sobre la implementación y fue el INNER / EXTERIOR / IZQUIERDA excluido por accidente o por propósito.
Tuukka Haapaniemi
243

No, no hay diferencia, azúcar sintáctica pura .

Quassnoi
fuente
22
No llamaría a este azúcar sintáctico. Tipo de unión "predeterminado", "taquigrafía" o "alias", tal vez.
mk12
62
En informática, el azúcar sintáctico es la sintaxis dentro de un lenguaje de programación que está diseñado para facilitar la lectura o la expresión . Creo que la capacidad de omitir INNERcae dentro de esta definición.
Quassnoi
14
Si aplica la definición muy literalmente, sí, pero siempre la he visto reservada para tipos de sintaxis más interesantes, no solo nombres alternativos para las cosas.
mk12
10
@Quassnoi el mero hecho de que se hizo esta pregunta, muestra la ausencia de INNERhace no hacen la consulta más fácil de leer. Por lo que sé, JOINbien podría significar LEFT JOINsi no fue aclarado por las respuestas aquí.
martennis
2
@Quassnoi La declaración introductoria wiki de su comentario es cierta para el azúcar sintáctico, pero es inadecuada como definición. El azúcar sintáctico se trata de una sintaxis más simple para casos especiales de sintaxis compleja. Es más apropiado decir que INNER es una "palabra de ruido".
philipxy
144

UNIÓN INTERNA = UNIRSE

INNER JOIN es el valor predeterminado si no especifica el tipo cuando usa la palabra JOIN.

También puede usar LEFT OUTER JOIN o RIGHT OUTER JOIN, en cuyo caso la palabra OUTER es opcional, o puede especificar CROSS JOIN.

O

Para una unión interna, la sintaxis es:

SELECCIONAR ...
DESDE la Tabla A
[INTERIOR] UNIRSE a la Tabla B

(en otras palabras, la palabra clave "INTERIOR" es opcional ; los resultados son los mismos con o sin ella)

net_prog
fuente
54

De manera similar con OUTER JOINs, la palabra "OUTER"es opcional. Es la palabra clave LEFTo la RIGHTque hace que el JOINan "OUTER" JOIN.

Sin embargo, por alguna razón, siempre uso "OUTER"como en LEFT OUTER JOINy nunca LEFT JOIN, pero nunca uso INNER JOIN, sino que solo uso "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
fuente
23
Soy lo opuesto a ti: siempre digo "INNER JOIN" pero nunca uso OUTER; entonces "LEFT JOIN" y "RIGHT JOIN". ¡Supongo que solo mantengo mi personaje cuenta constante!
Stephen Holt
10
@ Jonathan. No hay un concepto de dirección en una unión interna. Las uniones externas pueden producir conjuntos de resultados inigualables y pueden variar según la dirección. El interior requiere coincidencia, por lo que la dirección no importa.
Karl Kieninger
32

Como las otras respuestas ya indican que no hay diferencia en su ejemplo.

Aquí se documenta la parte gramatical relevante.

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

Mostrando que todos son opcionales. La página aclara aún más que

INNEREspecifica que se devuelven todos los pares de filas coincidentes. Descarta filas no coincidentes de ambas tablas. Cuando no se especifica ningún tipo de combinación, este es el valor predeterminado .

Sin embargo, la gramática también indica que hay un momento en el que INNER se requiere. Al especificar una sugerencia de unión.

Vea el ejemplo a continuación.

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;

ingrese la descripción de la imagen aquí

Martin Smith
fuente