Eu sou novo no SQL e queria saber qual é a diferença entre esses dois JOIN
tipos?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
Quando devo usar um ou outro?
Respostas:
No seu primeiro exemplo, você retornará apenas uma lista de usuários e números de telefone se houver pelo menos um registro telefônico para o usuário.
No seu segundo exemplo, você retornará uma lista de todos os usuários, além de todos os registros telefônicos, se estiverem disponíveis (se não estiverem disponíveis, você obterá
NULL
os valores do telefone).fonte
Sempre que alguém faz essa pergunta, existe a resposta: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
Espero que ajude você a entender,
fonte
Uma junção interna retorna linhas que podem ser combinadas com base nos critérios de junção.
Uma junção externa retorna essas e todas as linhas ...
... da primeira tabela para uma junção esquerda
... da segunda tabela para uma junção direita
... das duas tabelas para uma junção completa
Escolher quando usar um ou outro é uma questão de determinar quais dados você precisa. Para o seu exemplo, se você precisar apenas de registros com user_ids do telefone que correspondam aos IDs do usuário, use a junção interna. Se você também deseja incluir linhas do usuário que não possuem entrada telefônica correspondente, a associação à esquerda seria apropriada.
Para mais informações, consulte esta pergunta no StackOverflow .
fonte
Se você tem 2 tabelas como abaixo:
Se você usa o Inner Join, você obtém:
Se você usa a Junção externa completa, obtém:
Se você usa a associação externa esquerda, você obtém:
fonte
A junção externa é expressamente projetada para produzir nulos em seu resultado e, portanto, deve ser evitada, em geral. Relativamente falando, é um tipo de casamento de espingarda: força as tabelas a um tipo de união - sim, quero dizer união, não união - mesmo quando as tabelas em questão falham em conformidade com os requisitos usuais de união. Isso é feito, preenchendo uma ou ambas as tabelas com nulos antes de fazer a união, tornando-as conformes aos requisitos usuais, afinal. Mas não há razão para que esse preenchimento não deva ser feito com valores adequados em vez de nulos, como neste exemplo:
Como alternativa, o mesmo resultado pode ser obtido usando o operador de junção externa do SQL em conjunto com
COALESCE
, como aqui:Uma observação sobre a junção externa (4.6) em "SQL e teoria relacional: como escrever código SQL preciso" por data de CJ
fonte
Uma junção interna é uma junção em que os únicos resultados exibidos são aqueles em que as chaves estão nas duas tabelas. Uma junção externa exibirá os resultados para todas as chaves em uma tabela, uma junção esquerda da primeira e uma junção direita da segunda. Por exemplo:
Digamos que a tabela1 tenha os seguintes pares de dados e chave primária: (1, a), (2, b), (3, c)
Digamos também que a tabela2 tenha os seguintes pares de dados e chave primária: (1, divertido), (3, pode), (4, acontecer)
Portanto, uma junção interna da tabela1 à tabela2 nas chaves primárias produziria os seguintes trigêmeos resultantes (com a chave primária comum primeiro, o segundo item da primeira tabela em segundo e o segundo item da segunda tabela em terceiro): (1, a, fun), ( 3, c) pode)
Uma junção externa esquerda da tabela1 para a tabela2 nas chaves primárias produziria os seguintes trigêmeos resultantes (mesmo formato acima): (1, a, fun), (2, b, NULL), (3, c, can)
Uma junção externa direita da tabela1 para a tabela2 nas chaves primárias produziria os seguintes trigêmeos resultantes (mesmo formato acima): (1, a, divertido), (3, c, pode), (4, NULL, acontecer)
Espero que isso explique bem o conceito decentemente.
fonte
Deixe-me tentar descrevê-lo um pouco mais intuitivo.
A junção interna mostra os usuários, que têm um ou mais telefones junto com seus números de telefone.
A junção externa esquerda lista adicionalmente os 'usuários' que não têm telefone.
fonte
Como você perguntou quando usar o quê, eis um cenário com consultas - selecione qual usar, dependendo do requisito.
Dados:
Usuários da tabela possui 10 registros. A Tabela Phoneno possui 6 registros (com uma relação 1: 1, o que significa que uma entrada no PhoneNo fará referência a apenas uma entrada em Usuários e apenas uma entrada no PhoneNo pode fazer referência a uma entrada especificada em Usuários).
Requisito 1: mostre todos os usuários com seus números de telefone. Ignore usuários sem número de telefone.
Inquerir:
Resultado: mostra 6 usuários que têm número de telefone
Requisito 2: mostre todos os usuários com seu número de telefone. Se o usuário não tiver um telefone exibindo 'N / A' (não disponível)
Inquerir:
Resultado:
Mostra todos os 10 registros
Nota: ifnull é uma sintaxe do MySql para transformar o valor nulo. Eu usei essa função para fazer o mecanismo db mostrar 'N / A' quando phonno é nulo. Procure a função apropriada se você estiver usando algum outro DBMS. No SQL Server, você precisa usar a
CASE
instruçãoEu espero que isso ajude.
fonte