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.

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.
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.
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.
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 |
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
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 |
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.




