Voltar para a lista de artigos Artigos
8 minutos de leitura

Como Manter Linhas Inigualáveis Quando Você Junta duas Tabelas em SQL

Aprenda como usar o JOIN para manter tanto as linhas emparelhadas quanto as não emparelhadas quando você juntar duas tabelas.

Juntar duas ou mais mesas é uma habilidade que você precisa muito se estiver trabalhando com bancos de dados. Para rever e praticar suas habilidades de união SQL, eu recomendo a Cláusulas JOIN em SQL curso. Ele contém mais de 90 exercícios e seções sobre diferentes desafios de união.

Se você une tabelas frequentemente em SQL, provavelmente já notou que nem todos os dados de uma tabela correspondem aos dados de outra tabela o tempo todo. Às vezes, você precisa apenas dos dados que têm uma correspondência em ambas as tabelas. E, às vezes, você também precisa manter as linhas inigualáveis. Como você faz isso em um JOIN?

Qual junta lhe dá as Linhas Inigualáveis?

Você provavelmente já sabe disso, mas vale a pena repetir. O objetivo do JOIN é obter os dados de duas ou mais tabelas. Você os une pela(s) coluna(s) que eles têm em comum.

Os quatro principais tipos de JOINs são:

  • (INNER) JOIN.
  • LEFT (OUTER) JOIN.
  • RIGHT (OUTER) JOIN.
  • FULL (OUTER) JOIN.

Quando você usa um simples (INNER) JOIN, você só terá as linhas que têm fósforos em ambas as tabelas. A consulta não retornará linhas inigualáveis em nenhuma forma ou formato.

Se isto não for o que você deseja, a solução é usar o LEFT JOIN, RIGHT JOIN, ou FULL JOIN, dependendo do que você gostaria de ver.

Se você é novo no JOIN, aqui é onde cada tipo deJOIN é exaustivamente explicado. Você também pode ter uma folha de trapaça SQL JOIN por perto para ajudá-lo com a sintaxe e uso do JOIN.

Conheça os dados

Os dados com os quais vamos trabalhar consistem em duas tabelas:

  • employee.
  • project.

A tabela employee tem quatro colunas:

  • id: O ID do funcionário; é a chave primária (PK) da tabela.
  • first_name: O primeiro nome do funcionário.
  • last_name: O sobrenome do funcionário.
  • project_id: O ID do projeto e a chave estrangeira (FK) da tabela, referenciando outra tabela chamada project.

Eis o que os dados da tabela employee parece que sim:

idfirst_namelast_nameproject_id
1IngaDansken1
2RosinaSneezem5
3DarRisbie4
4LyneaBraveyNULL
5AlanahAbrashkov4
6EmmitJaime4
7KarrieLatek5
8GarrettCreginNULL
9CecilioZiemkeNULL
10MalanieChapellow1
11FraydaPinkett1
12MaddiMullissNULL
13BlaneTue5
14CarverVeighey5
15ChristosManleyNULL

Há duas colunas na tabela project:

  • id: O ID do projeto; é a chave primária (PK) da tabela.
  • project_name: O nome do projeto.

E estes são os dados da tabela:

idproject_name
1Reporting Process
2Database Enhancement
3Sales Boosting
4Employee Satisfaction
5IT Security
6Diversity Program
7Policies & Procedures
8Social Media Visibility
9Mobile Banking
10Education

O que acontece quando você utiliza o INNER JOIN?

Para obter o nome dos funcionários e os projetos em que eles estão trabalhando utilizando o INNER JOIN, você terá que escrever este código:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
JOIN project p
  ON e.project_id = p.id;

Nota: É claro que você pode usar ou JOIN ou INNER JOIN como a palavra-chave - eles são os mesmos.

Eis o que você obtém como resultado:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security

O resultado mostra apenas as fileiras da tabela employee que correspondem às fileiras na tabela project. Em outras palavras, o código retorna apenas os funcionários que têm um projeto alocado a eles. Isto, entretanto, significa que cada tabela pode ter linhas que não correspondem à outra tabela. Pode haver alguns funcionários que não estão alocados a nenhum projeto, e pode haver alguns projetos sem nenhum funcionário alocado a eles.

Como você também obtém as linhas incomparáveis?

Obtenha todas as Linhas Combinadas e Inigualáveis de uma Tabela

Para obter todas as linhas de apenas uma das tabelas - as linhas combinadas assim como as linhas não combinadas - você precisa usar o LEFT JOIN ou o RIGHT JOIN. Qual delas você deve usar depende da tabela da qual você quer manter as linhas não combinadas. O LEFT JOIN fará isso a partir da tabela da esquerda, o RIGHT JOIN a partir da da direita. Deixe-me mostrar-lhe o que isso significa na prática.

Usando o JOGO ESQUERDO

Para obter as linhas combinadas, bem como as inigualáveis, de uma tabela usando o LEFT JOIN, você terá que escrever este código:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
LEFT JOIN project p
  ON e.project_id = p.id;

É quase o mesmo código que no exemplo anterior. A única diferença é que ele usa a palavra-chave LEFT JOIN em vez da JOIN. Isto lhe dará todos os dados da tabela da esquerda (employeeneste caso), e todos os dados correspondentes da tabela da direita (project). Quando não há dados correspondentes na tabela projectvocê recebe os valores NULL, mas você ainda recebe todos os valores da tabela employee. Veja por si mesmo:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Como você interpreta estes dados? Você tem todos os funcionários e os projetos em que eles estão trabalhando. Quando há um valor NULL na coluna project_name, isso significa que o funcionário em questão não está trabalhando em nenhum projeto.

Usando o RIGHT JOIN

Agora, vamos escrever o mesmo código com o RIGHT JOIN em vez de usar o LEFT JOIN.

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
RIGHT JOIN project p
  ON e.project_id = p.id;

É uma imagem espelho do código anterior. Ele retornará todos os dados da tabela do lado direito, projecte apenas as fileiras correspondentes da tabela da esquerda, employee. Novamente, quando não há dados correspondentes da tabela employeeos valores serão NULL.

Este é o resultado da consulta:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation

Agora, estes dados mostram todos os projetos que existem na tabela project. Quando as colunas first_name e last_name são NULL, isso significa que não há funcionários trabalhando nesse projeto.

Será que o FULL JOIN vai lhe dar todas as linhas combinadas e inigualáveis?

Eu acho que a consulta usando o FULL JOIN e seu resultado falará por si mesma. Vamos ver o que ela faz. Primeiro, a pergunta:

SELECT
  first_name,
  last_name,
  project_name
FROM employee e
FULL JOIN project p
  ON e.project_id = p.id;

Novamente, a única diferença em relação às consultas anteriores é o tipo de junção utilizado. Tudo o resto é o mesmo. Esta consulta FULL JOIN retornará os seguintes dados:

first_namelast_nameproject_name
FraydaPinkettReporting Process
MalanieChapellowReporting Process
IngaDanskenReporting Process
NULLNULLDatabase Enhancement
NULLNULLSales Boosting
EmmitJaimeEmployee Satisfaction
AlanahAbrashkovEmployee Satisfaction
DarRisbieEmployee Satisfaction
CarverVeigheyIT Security
BlaneTueIT Security
KarrieLatekIT Security
RosinaSneezemIT Security
NULLNULLDiversity Program
NULLNULLPolicies & Procedures
NULLNULLSocial Media Visibility
NULLNULLMobile Banking
NULLNULLEducation
ChristosManleyNULL
MaddiMullissNULL
CecilioZiemkeNULL
GarrettCreginNULL
LyneaBraveyNULL

Vamos inspecionar um pouco os dados. Há filas que se encontram em ambas as tabelas. Há, no entanto, linhas da tabela employee que não têm filas correspondentes na tabela project. Você pode identificar estas linhas através dos valores NULL na coluna project_name. Há também linhas da tabela project sem linhas de correspondência na tabela employee. Mais uma vez, é aqui que estão os valores NULL. Desta vez, o NULLs estará nas colunas first_name e last_name.

Quando usar qual união

Agora que você já viu o que cada JOIN retorna, vamos esclarecer o que cada JOIN faz.

O JOIN ou INNER JOIN não retorna nenhuma fila que não corresponda. Ele retorna apenas as linhas que correspondem em ambas as tabelas às quais você se junta. Se você quiser obter linhas inigualáveis, não deve usá-las.

O LEFT JOIN e o RIGHT JOIN devolvem as duas linhas que correspondem e não correspondem. Entretanto, você precisa estar ciente de qual tabela você obtém as linhas inigualáveis. Com base em suas necessidades, você usará ou o LEFT JOIN ou o RIGHT JOIN. Ambos obtêm todas as linhas de uma tabela (combinadas e inigualáveis) e todas as linhas correspondentes da outra tabela. Quando não são encontradas linhas correspondentes na outra tabela, as colunas da outra tabela mostram os valores NULL.

O FULL JOIN obtém todos os dados de todas as tabelas às quais você se junta. É como combinar as três junções acima. Você obtém todas as linhas correspondentes como ao usar o INNER JOIN. Você também obterá linhas não correspondentes da tabela da esquerda e da direita, também. É como se você usasse o LEFT JOIN e o RIGHT JOIN simultaneamente.

Aqui estão mais alguns exemplos para praticar a junção das tabelas.

Aprenda os diferentes tipos de junção para selecionar a que você precisa!

Você vê, saber como estes JOINs funcionam é bastante útil. Eles permitem que você junte duas ou mais tabelas e obtenha diferentes combinações de dados de cada tabela. Não há diferença em como você escreve o código. A única coisa que muda é a palavra-chave que você usa, dependendo do tipo de JOIN que você precisa. É realmente importante entender que dados cada um destes JOINs retorna.

Para dominar e praticar esta habilidade, o curso SQL para Iniciantes e o curso SQL JOINs são o que você precisa! Se você precisa de conselhos sobre como praticar JOINs, aqui estão algumas dicas.