Diferença entre JOIN e INNER JOIN


999

Ambas as junções me fornecerão os mesmos resultados:

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

vs

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

Existe alguma diferença entre as declarações de desempenho ou não?

Difere entre diferentes implementações SQL ?



6
Como uma observação lateral: CROSS JOIN é um bom conhecimento do tipo de junção (difere de INNER JOIN).
Serge

Respostas:


1093

Eles são funcionalmente equivalentes, mas INNER JOINpodem ser um pouco mais claros de ler, especialmente se a consulta tiver outros tipos de junção (ie LEFTou RIGHTou CROSS) incluídos nela.


11
Isso é verdade para todas as bases de dados (por exemplo, SQL, postgres?) Alguém conhece um link para a documentação que explica isso?
Chogg


14
A consulta é clara o suficiente apenas escrevendo JOIN, INNER é apenas ruído.
Ivanzinho

22
Talvez eu seja purista, mas acho melhor ser explícito do que implícito ao escrever SQL. INNER JOIN é mais legível, especialmente em consultas complexas.
precisa saber é o seguinte

3
@ Ivanzinho: Os toques no teclado não são a medida da consulta ou da complexidade do programa. A complexidade da vida real vem da capacidade de manutenção, onde a legibilidade desempenha um papel importante. O fato de que, quando diz INNER JOIN, você pode ter certeza do que faz e que deve ser exatamente isso, enquanto um JOIN simples deixará você ou outra pessoa se perguntando o que o padrão disse sobre a implementação e foi o INNER. / OUTER / LEFT deixado de fora por acidente ou por propósito.
Tuukka Haapaniemi

243

Não, não há diferença, açúcar sintático puro .


22
Eu não chamaria isso de açúcar sintático. Tipo de junção "Padrão", "taquigrafia" ou "alias", talvez.
MK12

62
Na ciência da computação, o açúcar sintático é uma sintaxe dentro de uma linguagem de programação projetada para facilitar a leitura ou a expressão . Acredito que a capacidade de omitir INNERse enquadra nessa definição.
Quassnoi

14
Se você aplicar a definição literalmente, sim, mas sempre a vi reservada para tipos de sintaxe mais interessantes, não apenas para nomes alternativos.
Mk12

10
@Quassnoi o simples facto de esta pergunta é feita, mostra a ausência de INNERque não fazer a consulta mais fácil de ler. Pelo que sei, JOINpoderia muito bem significar LEFT JOINse não fosse esclarecido pelas respostas aqui.
Martennis 29/06

2
@Quassnoi A declaração wiki introdutória citada pelo seu comentário é verdadeira quanto ao açúcar sintático, mas é inadequada como definição. Adoção sintática é sobre sintaxe mais simples para casos especiais de sintaxe complexa. É mais apropriado dizer que INNER é uma "palavra de ruído".
68519 philipxy

143

INNER JOIN = JOIN

INNER JOIN é o padrão se você não especificar o tipo ao usar a palavra JOIN.

Você também pode usar JUNTA EXTERNA ESQUERDA ou JUNTA EXTERNA DIREITA; nesse caso, a palavra OUTER é opcional, ou pode especificar JUNÇÃO CRUZADA.

OU

Para uma junção interna, a sintaxe é:

SELECT ...
FROM TabelaA
[INNER] JOIN TableB

(em outras palavras, a palavra-chave "INNER" é opcional - os resultados são os mesmos, com ou sem)



54

Da mesma forma com OUTER JOINs, a palavra "OUTER"é opcional. É a palavra LEFT- RIGHTchave ou que faz o JOINan "OUTER" JOIN.

No entanto, por alguma razão, eu sempre uso "OUTER"como em LEFT OUTER JOINe nunca LEFT JOIN, mas nunca uso INNER JOIN, mas apenas 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

23
Sou o oposto de você: sempre digo "INNER JOIN", mas nunca uso OUTER; então "LEFT JOIN" e "RIGHT JOIN". Acho que estou apenas mantendo minha conta constante!
Stephen Holt

10
@ Jonathan.Não há conceito de direção em uma junção interna. Junções externas podem produzir conjuntos de resultados incomparáveis ​​e podem variar de acordo com a direção. Interno exige correspondência para que a direção não importe.
Karl Kieninger

32

Como as outras respostas já afirmam, não há diferença no seu exemplo.

A parte relevante da gramática está documentada aqui

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

Mostrando que todos são opcionais. A página esclarece ainda que

INNEREspecifica que todos os pares de linhas correspondentes são retornados. Descarta linhas sem correspondência de ambas as tabelas. Quando nenhum tipo de junção é especificado, esse é o padrão .

A gramática também indica que há um momento em que isso INNER é necessário. Ao especificar uma dica de junção.

Veja o exemplo abaixo

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;

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.