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?
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?
Em seu primeiro exemplo, você só retornará uma lista de usuários e números de telefone se existir pelo menos um registro de telefone para o usuário.
Em seu segundo exemplo, você retornará uma lista de todos os usuários, além de quaisquer registros de telefone, se estiverem disponíveis (se não estiverem disponíveis, você obterá
NULL
os valores de telefone).Toda vez que alguém faz essa pergunta, há a resposta: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
Espero que ajude você a entender,
Uma junção interna retorna linhas que podem ser combinadas com base nos critérios de junção.
Uma junção externa retorna estas e todas as linhas...
...da primeira tabela para uma junção à esquerda
...da segunda tabela para uma junção à direita
...de ambas as 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 que tenham user_ids de telefone que correspondam a ids em user, use a junção interna. Se você também deseja incluir linhas de usuário que não têm entrada de telefone correspondente, a junção à esquerda seria apropriada.
Para obter mais informações, consulte esta pergunta no StackOverflow .
Se você tiver 2 tabelas como abaixo:
Se você usar o Inner Join, você obtém:
Se você usar o Full Outer Join, você obtém:
Se você usar o Left Outer Join, você obtém:
Outer join é expressamente projetado para produzir nulos em seu resultado e, portanto, deve ser evitado, em geral. Relacionalmente falando, é uma espécie de casamento forçado: força as mesas a uma espécie de união — sim, quero dizer união, não união — mesmo quando as mesas em questão não atendem aos requisitos usuais para união. Ele faz isso, com efeito, preenchendo uma ou ambas as tabelas com nulos antes de fazer a união, tornando-as, afinal, em conformidade com os requisitos usuais. Mas não há razão para que esse preenchimento não seja feito com valores apropriados em vez de nulos, como neste exemplo:
Alternativamente, o mesmo resultado pode ser obtido usando o operador de junção externa SQL em conjunto com
COALESCE
, como aqui:Uma observação sobre a junção externa (4.6) em "SQL and Relational Theory: How to Write Accurate SQL Code" por CJ Date
Uma junção interna é uma junção em que os únicos resultados exibidos são resultados em que as chaves estão em ambas as tabelas. Uma junção externa exibirá os resultados de todas as chaves em uma tabela, uma junção esquerda da primeira e uma junção direita da segunda. Por exemplo:
Digamos que table1 tenha a seguinte chave primária e pares de dados: (1, a), (2, b), (3, c)
Digamos também que table2 tenha os seguintes pares de chave primária e dados: (1, divertido), (3, pode), (4, acontecer)
Portanto, uma junção interna de table1 a table2 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 de table1 para table2 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 de table1 a table2 nas chaves primárias produziria os seguintes trigêmeos resultantes (mesmo formato acima): (1, a, fun), (3, c, can), (4, NULL, acontecer)
Espero que isso explique o conceito decentemente bem.
Deixe-me tentar descrevê-lo um pouco mais intuitivo.
A junção interna mostra os usuários que possuem um ou mais telefones junto com seus números de telefone.
A junção externa esquerda também lista os 'usuários' que não possuem telefone.
Como você perguntou quando usar o quê, aqui está um cenário com consultas - selecione qual usar dependendo do requisito.
Dados:
Table Users tem 10 registros. A tabela Phoneno possui 6 registros (com uma relação de 1:1, significando que uma entrada em PhoneNo fará referência a apenas uma entrada em Users, e apenas uma entrada em PhoneNo pode referenciar uma determinada entrada em Users).
Requisito 1: Mostrar todos os usuários com seus números de telefone. Ignore usuários sem número de telefone.
Consulta:
Resultado: mostra 6 usuários que possuem número de telefone
Requisito 2: Mostrar todos os usuários com seu número de telefone. Se o usuário não tiver um display de telefone 'N/A' (não disponível)
Consulta:
Resultado:
Mostra todos os 10 registros
Nota: ifnull é uma sintaxe MySql para transformar o valor nulo. Eu usei esta função para fazer o mecanismo db mostrar 'N/A' quando phonno é nulo. Procure a função apropriada se estiver usando algum outro DBMS. No SQL Server você tem que usar a
CASE
instrução.Eu espero que isso ajude.