Você aprendeu como exibir dados de uma única tabela usando SELECT. Mas para selecionar dados de várias tabelas usamos a JOIN juntamente com SELECT. Isso porque JOIN associa as linhas de uma tabela às linhas de outra com base em uma condição.
Há diversos tipos de JOIN: inner join, left join, right join, cross join, full outer join
, full join
…
As Tabelas que Usaremos nos Exemplos
Usaremos as tabelas guests e vips para demonstrar os exemplos que praticaremos.
Veja o artigo onde baixamos o banco nation para testes: MariaDB e MySQL: Baixando Exemplo de Banco de Dados. Dentro desse do banco de dados nation estão as duas tabelas guests e vips.
Tabela guests:
MariaDB [nation]> select * from guests; +----------+-------+ | guest_id | name | +----------+-------+ | 1 | John | | 2 | Jane | | 3 | Jean | | 4 | Storm | | 5 | Beast | +----------+-------+
Tabela vips:
MariaDB [nation]> select * from vips; +--------+-----------+ | vip_id | name | +--------+-----------+ | 1 | Jane | | 2 | Charles | | 3 | John | | 4 | Wolverine | | 5 | Rogue | +--------+-----------+
Exemplos com INNER JOIN
#1 juntando(join) as tabelas vips e guests
select * from guests inner join vips;
MariaDB [nation]> select * from guests inner join vips; +----------+-------+--------+-----------+ | guest_id | name | vip_id | name | +----------+-------+--------+-----------+ | 1 | John | 1 | Jane | | 2 | Jane | 1 | Jane | | 3 | Jean | 1 | Jane | | 4 | Storm | 1 | Jane | | 5 | Beast | 1 | Jane | | 1 | John | 2 | Charles | | 2 | Jane | 2 | Charles | | 3 | Jean | 2 | Charles | | 4 | Storm | 2 | Charles | | 5 | Beast | 2 | Charles | | 1 | John | 3 | John | | 2 | Jane | 3 | John | | 3 | Jean | 3 | John | | 4 | Storm | 3 | John | | 5 | Beast | 3 | John | | 1 | John | 4 | Wolverine | | 2 | Jane | 4 | Wolverine | | 3 | Jean | 4 | Wolverine | | 4 | Storm | 4 | Wolverine | | 5 | Beast | 4 | Wolverine | | 1 | John | 5 | Rogue | | 2 | Jane | 5 | Rogue | | 3 | Jean | 5 | Rogue | | 4 | Storm | 5 | Rogue | | 5 | Beast | 5 | Rogue | +----------+-------+--------+-----------+
Podemos ver que não funcionou muito bem o join pois houve repetições.
#2 podemos usar on para declarar uma condição. Por exemplo, quero mostrar somente os IDs iguais nas duas tabelas. Para isso uso o nome da tabela mais o nome do campo. Exemplo, podemos usar o campo guest_id com o vip_id assim: guests.guest_id = vips.vip_id. Assim, quero que seja mostrado somente os números(IDs) que existam nas duas colunas ao mesmo tempo.
select * from guests inner join vips on guests.guest_id = vips.vip_id;
MariaDB [nation]> select * from guests inner join vips on guests.guest_id = vips.vip_id; +----------+-------+--------+-----------+ | guest_id | name | vip_id | name | +----------+-------+--------+-----------+ | 1 | John | 1 | Jane | | 2 | Jane | 2 | Charles | | 3 | Jean | 3 | John | | 4 | Storm | 4 | Wolverine | | 5 | Beast | 5 | Rogue | +----------+-------+--------+-----------+
#3 acima tempos dois nomes de colunas diferentes(guest_id e vip_id). Se os nomes fossem iguais nas duas tabelas então poderíamos usar o operador using. Vamos supor que os dois campos se chamam apenas meu_id.
select * from guests inner join vips using (meu_id);
Podemos fazer usar using com o campo name que está presente em ambas as tabelas.
select * from guests inner join vips using (name);
MariaDB [nation]> select * from guests inner join vips using (name); +------+----------+--------+ | name | guest_id | vip_id | +------+----------+--------+ | Jane | 2 | 1 | | John | 1 | 3 | +------+----------+--------+
Usando LEFT JOIN
Aqui temos o conceito de tabela à esquerda.
Levando em consideração as tabelas guests e vips podemos dizer que guests está à esquerda e vips à direita.
left join pega todos os dados tabela da esquerda(guests). Quanto à tabela da direita(vips) ele exibe somente os valores que batem com a tabela esquerda e preenche com null o restante.
select * from guests left join vips using (name);
MariaDB [nation]> select * from guests left join vips using (name); +-------+----------+--------+ | name | guest_id | vip_id | +-------+----------+--------+ | Jane | 2 | 1 | | John | 1 | 3 | | Jean | 3 | NULL | | Storm | 4 | NULL | | Beast | 5 | NULL | +-------+----------+--------+
Usando RIGHT JOIN
Levando em consideração as tabelas guests e vips podemos dizer que guests está à esquerda e vips à direita.
riight join pega todos os dados tabela da direita(vips). Quanto à tabela da esquerda(guests) ele exibe somente os valores que batem com a tabela direita e preenche com null o restante.
select * from guests right join vips using (name);
MariaDB [nation]> select * from guests right join vips using (name); +-----------+--------+----------+ | name | vip_id | guest_id | +-----------+--------+----------+ | John | 3 | 1 | | Jane | 1 | 2 | | Charles | 2 | NULL | | Wolverine | 4 | NULL | | Rogue | 5 | NULL | +-----------+--------+----------+
Bonus
Podemos usar JOIN com mais de duas tabelas:
select lista_campos from guests inner join vips on join_condicao2 inner join outra_tabela on join_condicao2 ...;
Veja um exemplo na prática onde tenho 3 tabelas: recibo, pagamento e prenotacao
SELECT *
FROM recibo
INNER JOIN pagamento ON recibo.numero_recibo = pagamento.recibo
INNER JOIN prenotacao ON recibo.numero_recibo = prenotacao.recibo;
Podemos também usar letras como apelidos para as colunas. c usamos para countries e r para regions. Em “from countries c” eu falo que countries é c e em “inner join region r” eu aviso que r é region. Não se preocupe em entender 100%. Isso será visto mais adiante.
select c.name, r.name from countries c inner join regions r on r.region_id = c.region_id order by c.name;
Também podemos exibir um nome qualquer para cada coluna nos resultados. Abaixo tenho Pais e Regiao. Isso não influencia em nada, é somente para deixar a exibição do resultado mais legível.
select c.name Pais, r.name Regiao from countries c inner join regions r on r.region_id = c.region_id order by c.name;
Neste tutorial, você aprendeu como usar a cláusula de junção MariaDB para selecionar dados de várias tabelas.
Comment on “MariaDB e MySQL: Usando INNER JOIN, LEFT JOIN e RIGHT JOIN”