MySQL Junte-se: Interno, Externo, Esquerda, Direita, Cruzado

⚡ Resumo Inteligente

MySQL As junções (JOINs) combinam linhas de duas ou mais tabelas relacionadas em um único conjunto de resultados. Este recurso explica as junções CROSS, INNER, LEFT, RIGHT e OUTER com consultas executáveis, dados de exemplo e tabelas de saída claras para uso prático em bancos de dados.

  • 🔗 Princípio fundamental: Uma junção (JOIN) combina linhas entre tabelas usando relações de chave primária e chave estrangeira.
  • Por que isso importa: Uma única consulta JOIN utiliza indexação e reduz as viagens de ida e volta ao servidor em comparação com várias consultas separadas.
  • ✖️ Comportamento Cross JOIN: Cada linha da primeira tabela corresponde a cada linha da segunda, produzindo um produto cartesiano.
  • 🎯 Comportamento JOIN interno: Somente as linhas que satisfazem a condição de correspondência em ambas as tabelas são retornadas.
  • ↔️ Comportamento externo JOIN: LEFT JOIN e RIGHT JOIN também retornam linhas não correspondentes e preenchem as colunas ausentes com NULL.
  • 🧩 LIGADO versus USANDO: USING exige nomes de coluna idênticos, enquanto ON aceita qualquer expressão correspondente.

MySQL JOINS

O que são JUNÇÕES?

As junções ajudam a recuperar dados de duas ou mais tabelas de banco de dados.

As tabelas são mutuamente relacionadas usando chaves primárias e estrangeiras.

Observação: JOIN é o tópico mais incompreendido entre os aprendizes de SQL. Para simplificar e facilitar o entendimento, usaremos um novo banco de dados para praticar com exemplos. Como mostrado abaixo.

Todos os exemplos abaixo utilizam essas duas tabelas. id_do_filme coluna em membros aponta para o id coluna em filmes — a relação que cada JOIN corresponde.

membros

id primeiro nome último nome id_do_filme
1 Adam Smith 1
2 Ravi Kumar 2
3 Susan Davidson 5
4 Jenny Adrianna 8
5 Lee Pong 10

filmes

id título categoria
1 ASSASSIN'S CREED: EMBERS animações
2 Aço Real (2012) animações
3 Alvin e os Esquilos animações
4 As Aventuras de Tin Tin animações
5 Seguro (2012) Ação
6 Casa Segura (2012) Ação
7 GIA 18+
8 Prazo 2009 18+
9 A imagem suja 18+
10 Marley e eu Romance

Por que devemos usar JOINS?

Antes de analisar cada tipo de JOIN, vale a pena entender por que um JOIN é preferível à execução de várias consultas.

Agora você pode pensar por que usamos JOINs quando podemos fazer a mesma tarefa executando consultas. Especialmente se você tem alguma experiência em programação de banco de dados, sabe que podemos executar consultas uma por uma, usar a saída de cada uma em consultas sucessivas. Claro, isso é possível. Mas usando JOINs, você pode realizar o trabalho usando apenas uma consulta com quaisquer parâmetros de pesquisa. Por outro lado MySQL pode alcançar melhor desempenho com JOINs, pois pode usar indexação. Basta usar uma única consulta JOIN em vez de executar várias consultas para reduzir a sobrecarga do servidor. Usar múltiplas consultas, o que gera mais transferências de dados entre MySQL e aplicativos (software). Além disso, também requer mais manipulações de dados no final do aplicativo.

É evidente que podemos conseguir melhores MySQL e desempenho de aplicativos pelo uso de JOINs.

Tipos de JUNÇÕES

MySQL Suporta vários tipos de JOIN, cada um respondendo a uma pergunta diferente sobre as mesmas duas tabelas. A tabela abaixo os compara; cada tipo é então demonstrado com uma consulta e sua respectiva saída.

Tipo de junção Linhas retornadas Valores nulos no resultado? Uso típico
JUNÇÃO CRUZADA Cada linha da tabela A é emparelhada com cada linha da tabela B. Não Gerando todas as combinações possíveis
INNER JOIN Apenas as linhas que correspondem à condição em ambas as tabelas. Não Membros que realmente alugaram um filme
LEFT JOIN Todas as linhas da tabela da esquerda, mais as correspondências da tabela da direita. Sim, do lado direito. Todos os filmes, mesmo aqueles que nunca foram alugados
JUNTAR À DIREITA Todas as linhas da tabela da direita, mais as correspondências da esquerda. Sim, do lado esquerdo. Todos os filmes, mesmo sem nenhum membro associado

JUNÇÃO CRUZADA

Cross JOIN é uma forma mais simples de JOINs que corresponde a cada linha de uma tabela de banco de dados com todas as linhas de outra.

Em outras palavras, nos dá combinações de cada linha da primeira tabela com todos os registros da segunda tabela.

Suponha que queiramos obter todos os registros de membros em relação a todos os registros de filmes. Podemos usar o script mostrado abaixo para obter os resultados desejados.

Tipos de junções

SELECT * FROM `movies` CROSS JOIN `members`

Executando o script acima em MySQL bancada nos dá os seguintes resultados.

id title id first_name last_name movie_id
1 ASSASSIN'S CREED: EMBERS Animations 1 Adam Smith 1
1 ASSASSIN'S CREED: EMBERS Animations 2 Ravi Kumar 2
1 ASSASSIN'S CREED: EMBERS Animations 3 Susan Davidson 5
1 ASSASSIN'S CREED: EMBERS Animations 4 Jenny Adrianna 8
1 ASSASSIN'S CREED: EMBERS Animations 6 Lee Pong 10
2 Real Steel(2012) Animations 1 Adam Smith 1
2 Real Steel(2012) Animations 2 Ravi Kumar 2
2 Real Steel(2012) Animations 3 Susan Davidson 5
2 Real Steel(2012) Animations 4 Jenny Adrianna 8
2 Real Steel(2012) Animations 6 Lee Pong 10
3 Alvin and the Chipmunks Animations 1 Adam Smith 1
3 Alvin and the Chipmunks Animations 2 Ravi Kumar 2
3 Alvin and the Chipmunks Animations 3 Susan Davidson 5
3 Alvin and the Chipmunks Animations 4 Jenny Adrianna 8
3 Alvin and the Chipmunks Animations 6 Lee Pong 10
4 The Adventures of Tin Tin Animations 1 Adam Smith 1
4 The Adventures of Tin Tin Animations 2 Ravi Kumar 2
4 The Adventures of Tin Tin Animations 3 Susan Davidson 5
4 The Adventures of Tin Tin Animations 4 Jenny Adrianna 8
4 The Adventures of Tin Tin Animations 6 Lee Pong 10
5 Safe (2012) Action 1 Adam Smith 1
5 Safe (2012) Action 2 Ravi Kumar 2
5 Safe (2012) Action 3 Susan Davidson 5
5 Safe (2012) Action 4 Jenny Adrianna 8
5 Safe (2012) Action 6 Lee Pong 10
6 Safe House(2012) Action 1 Adam Smith 1
6 Safe House(2012) Action 2 Ravi Kumar 2
6 Safe House(2012) Action 3 Susan Davidson 5
6 Safe House(2012) Action 4 Jenny Adrianna 8
6 Safe House(2012) Action 6 Lee Pong 10
7 GIA 18+ 1 Adam Smith 1
7 GIA 18+ 2 Ravi Kumar 2
7 GIA 18+ 3 Susan Davidson 5
7 GIA 18+ 4 Jenny Adrianna 8
7 GIA 18+ 6 Lee Pong 10
8 Deadline(2009) 18+ 1 Adam Smith 1
8 Deadline(2009) 18+ 2 Ravi Kumar 2
8 Deadline(2009) 18+ 3 Susan Davidson 5
8 Deadline(2009) 18+ 4 Jenny Adrianna 8
8 Deadline(2009) 18+ 6 Lee Pong 10
9 The Dirty Picture 18+ 1 Adam Smith 1
9 The Dirty Picture 18+ 2 Ravi Kumar 2
9 The Dirty Picture 18+ 3 Susan Davidson 5
9 The Dirty Picture 18+ 4 Jenny Adrianna 8
9 The Dirty Picture 18+ 6 Lee Pong 10
10 Marley and me Romance 1 Adam Smith 1
10 Marley and me Romance 2 Ravi Kumar 2
10 Marley and me Romance 3 Susan Davidson 5
10 Marley and me Romance 4 Jenny Adrianna 8
10 Marley and me Romance 6 Lee Pong 10

INNER JOIN

Uma junção cruzada (CROSS JOIN) retorna todos os pares possíveis, o que raramente é o desejado. Uma junção interna (INNER JOIN) restringe o resultado aos pares que são de fato relacionados.

O JOIN interno é usado para retornar linhas de ambas as tabelas que satisfazem a condição fornecida.

Suponha que você queira obter uma lista de membros que alugaram filmes, juntamente com os títulos dos filmes alugados por eles. Você pode simplesmente usar um INNER JOIN para isso, que retorna as linhas de ambas as tabelas que satisfazem as condições fornecidas.

INNER JOIN

SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`

Executando o script acima, dê

first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me

Observe que o script de resultados acima também pode ser escrito da seguinte maneira para obter os mesmos resultados.

SELECT A.`first_name` , A.`last_name` , B.`title`
FROM `members` AS A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`

JOINs externos

Um INNER JOIN remove silenciosamente as linhas que não têm par. Quando essas linhas sem par são importantes, um OUTER JOIN é a escolha certa.

MySQL As junções externas (Outer JOINs) retornam todos os registros correspondentes de ambas as tabelas.

Ele pode detectar registros sem correspondência na tabela unida. Ele retorna NULL valores para registros da tabela unida se nenhuma correspondência for encontrada.

Parece confuso? Vejamos um exemplo –

LEFT JOIN

Suponha agora que você deseja obter os títulos de todos os filmes junto com os nomes dos membros que os alugaram. É claro que alguns filmes não foram alugados por ninguém. Podemos simplesmente usar LEFT JOIN para o propósito.

JOINs externos

O LEFT JOIN retorna todas as linhas da tabela à esquerda, mesmo que nenhuma linha correspondente tenha sido encontrada na tabela à direita. Onde nenhuma correspondência for encontrada na tabela à direita, NULL será retornado.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
ON B.`movie_id` = A.`id`

Executando o script acima em MySQL O Workbench fornece os resultados. Você pode ver no resultado retornado, listado abaixo, que para filmes que não foram alugados, os campos de nome do membro têm valores NULL. Isso significa que nenhum membro correspondente foi encontrado na tabela de membros para aquele filme específico.

title first_name last_name
ASSASSIN'S CREED: EMBERS Adam Smith
Real Steel(2012) Ravi Kumar
Safe (2012) Susan Davidson
Deadline(2009) Jenny Adrianna
Marley and me Lee Pong
Alvin and the Chipmunks NULL NULL
The Adventures of Tin Tin NULL NULL
Safe House(2012) NULL NULL
GIA NULL NULL
The Dirty Picture NULL NULL
Note: Null is returned for non-matching rows on right

JUNTAR À DIREITA

RIGHT JOIN é obviamente o oposto de LEFT JOIN. O RIGHT JOIN retorna todas as colunas da tabela à direita, mesmo que nenhuma linha correspondente tenha sido encontrada na tabela à esquerda. Onde nenhuma correspondência for encontrada na tabela à esquerda, NULL será retornado.

Em nosso exemplo, vamos supor que você precise obter os nomes dos membros e os filmes alugados por eles. Agora temos um novo integrante que ainda não alugou nenhum filme

JUNTAR À DIREITA

SELECT A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B
ON B.`id` = A.`movie_id`

Executando o script acima em MySQL workbench fornece os seguintes resultados.

first_name last_name title
Adam Smith ASSASSIN'S CREED: EMBERS
Ravi Kumar Real Steel(2012)
Susan Davidson Safe (2012)
Jenny Adrianna Deadline(2009)
Lee Pong Marley and me
NULL NULL Alvin and the Chipmunks
NULL NULL The Adventures of Tin Tin
NULL NULL Safe House(2012)
NULL NULL GIA
NULL NULL The Dirty Picture
Note: Null is returned for non-matching rows on left

Cláusulas “ON” e “USING”

Todas as consultas realizadas até o momento encontraram linhas com a cláusula ON. MySQL Oferece uma alternativa mais curta quando as colunas correspondentes compartilham o mesmo nome.

Nos exemplos de consulta JOIN acima, usamos a cláusula ON para combinar os registros entre as tabelas.

A cláusula USING também pode ser usada para o mesmo propósito. A diferença com USANDO é precisa ter nomes idênticos para colunas correspondentes em ambas as tabelas.

Na tabela “movies” até agora usamos sua chave primária com o nome “id”. Referimo-nos ao mesmo na tabela “membros” com o nome “movie_id”.

Vamos renomear o campo “id” da tabela “movies” para ter o nome “movie_id”. Fazemos isso para ter nomes de campos correspondentes idênticos.

ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;

A seguir, vamos usar USING com o exemplo LEFT JOIN acima.

SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )

Além de usar ON e USANDO com JOINs você pode usar muitos outros MySQL cláusulas como GROUP BY, ONDE e até funções como SOMA, AVG, etc.

Perguntas Frequentes

Uma operação JOIN combina colunas de duas tabelas lado a lado, correspondendo linhas com base em uma chave. Uma operação UNION empilha os resultados de duas consultas verticalmente e exige que a quantidade e os tipos de colunas correspondam.

Sim. Encadeie cláusulas JOIN adicionais, cada uma com sua própria condição ON. MySQL A função une as duas primeiras tabelas, depois une esse resultado intermediário à próxima tabela e assim por diante.

Uma junção consigo mesma (SELF JOIN) une uma tabela a si mesma usando dois aliases. Ela compara linhas dentro de uma tabela, como por exemplo, associar a linha de um funcionário à linha do gerente desse funcionário.

Sim. Assistentes de IA integrados em editores como... MySQL Workbench É possível elaborar consultas JOIN a partir de um prompt em linguagem natural. Sempre revise as condições ON geradas, pois uma chave incorreta produz resultados errados silenciosamente.

Em parte. Os consultores de IA sugerem índices e melhores ordens de junção, o que geralmente reduz o tempo de execução. O otimizador ainda escolhe o plano final, portanto, a indexação correta nas chaves de junção continua sendo o fator mais importante.

Resuma esta postagem com: