MySQL – INNER JOIN – Consultar dados em duas ou mais Tabelas relacionadas

INNER JOIN – Consultar dados em duas ou mais Tabelas no MySQL

JOINS

A cláusula JOIN é usada para combinar dados provenientes de duas ou mais tabelas do banco de dados, baseado em um relacionamento entre colunas destas tabelas. há duas categorias principais de joins:

    • INNER JOIN: Retorna linhas (registros) quando houver pelo menos uma correspondência em ambas as tabelas.
    • OUTER JOIN: Retorna linhas (registros) mesmo quando não houver ao menos uma correspondência em uma das tabelas (ou ambas). O OUTER JOIN divide-se em  LEFT JOIN, RIGHT JOIN e FULL JOIN.

Nesta aula vamos estudar especificamente a cláusula INNER JOIN

INNER JOIN

Como dito, um INNER JOIN (ou simplesmente JOIN) permite obter registros com dados provenientes de duas ou mais tabelas relacionadas do banco de dados no MySQL. A sintaxe básica de um INNER JOIN em uma consulta é:

SELECT colunas
FROM tabela1
INNER JOIN tabela2
ON tabela1.coluna=tabela2.coluna;

Onde tabela1.coluna é o nome da primeira tabela concatenado com um ponto e com o nome da coluna chave primária ou estrangeira da tabela, e tabela2.coluna é o nome da segunda tabela concatenado com um ponto e com a chave estrangeira ou primária dessa tabela que se relaciona com a chave da primeira tabela.

Vejamos um exemplo. Vamos consultar as tabelas de livros e autores (tbl_livro e tbl_autores) e retornar os dados relativos aos livros e aos autores ao mesmo tempo:

SELECT * FROM tbl_Livro
INNER JOIN tbl_autores
ON tbl_Livro.ID_Autor = tbl_autores.ID_Autor; 

INNER JOIN SQL no MySQL

Vejamos outro exemplo. Faremos a consulta nas tabelas de livros e autores, porém retornando apenas os nomes dos livros, seus ISBNs e os nomes dos autores desses livros. Note que as duas primeiras informações estão na tabela de livros, e o nome do autor está somente na tabela de autores. O que as liga é o relacionamento entre as colunas ID_Autor existentes nas tabelas – é chave primária na tabela de autores e estrangeira na de livros:

SELECT tbl_Livro.Nome_Livro, tbl_Livro.ISBN, tbl_autores.Nome_Autor
FROM tbl_Livro
INNER JOIN tbl_autores
ON tbl_Livro.ID_Autor = tbl_autores.ID_Autor;

INNER JOIN SQL no MySQL 

Mais um exemplo, agora com filtros. Vamos retornar os nomes dos livros e nomes das editoras, mas somente das editoras cujo nome se inicia com a letra M. Note o uso de aliases nestas declarações, a fim de simplificar o código:

SELECT L.Nome_Livro AS Livros, E.Nome_editora AS Editoras
FROM tbl_Livro AS L
INNER JOIN tbl_editoras AS E
ON L.ID_editora = E.ID_editora
WHERE E.Nome_Editora LIKE 'M%';

INNER JOIN SQL no MySQL 
Mais um exemplo para terminar. Agora vamos fazer um INNER JOIN com as três tabelas do banco de dados simultaneamente. Queremos os nomes e preços dos livros, nomes de seus autores e editoras, mas somente das editoras cujo nome se inicia com a letra O, tudo isso ordenado em ordem decrescente de preço dos livros:

SELECT L.Nome_Livro AS Livro,
A.Nome_autor AS Autor,
E.Nome_Editora AS Editora,
L.Preco_Livro AS 'Preço do Livro'
FROM tbl_Livro AS L
INNER JOIN tbl_autores AS A
ON L.ID_autor = A.ID_autor
INNER JOIN tbl_editoras AS E
ON L.ID_editora = E.ID_editora
WHERE E.Nome_Editora LIKE 'O%'
ORDER BY L.Preco_Livro DESC;

INNER JOIN SQL no MySQL

Neste exemplo fazemos o join entre a tabela de livros e a de autores, e logo em seguida entra a tabela de livros e a de editoras, pois os relacionamentos se dão entre essas tabelas. Também ordenamos os resultados por ordem decrescente dos preços dos livros.

Muito bem! Na próxima aula vamos falar de OUTER JOINS. Enquanto isso, assista a um vídeo com as explicações sobre INNER JOINS no MySQL:

Sobre Fábio dos Reis (1193 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

18 Comentários em MySQL – INNER JOIN – Consultar dados em duas ou mais Tabelas relacionadas

  1. vlw sangue bom

  2. Muito bom explicativo. Parabéns pelo site.

  3. Boa noite Fábio primeiramente gostaria de agradecer pelo excelente trabalho que voce tem realizado, eu mesmo já realizei dois cursos aqui de mysql e logica de programação já faz um tempo. Só tenho a agradecer. Gostaria que se voce pudesse me sanar um dúvida de JOINS no mysql estou com um problema e não consigo resolver. Por exemplo tenho três tabelas, a saber, tbl_estado(cod_estadonome,sigla) tbl_cidade(cod_cidade,nome,cod_estado) e uma tabela tbl_endereco(cod_endereco,rua,numero,cep,bairro,cod_cidade) como faço para trazer, a partir da tabela endereco, as colunas da tabela estado que é chave estrangeira da tabela cidade? Não consigo, só funciona se eu colocar na tabela endereco as chaves estrangeiras de cidade e estado

  4. RAEL RODRIGUES DA SILVA // 29/06/2017 em 12:38 // Responder

    adorei o site e estou aprendendo muito com vc.
    gostaria de saber como posso mesclar a função count(expressão) e inner join.

    parabens pelo seu trabalho.

  5. Stuart MacNair // 27/10/2017 em 10:56 // Responder

    Me salvou com sua explicação e exemplo de uso do “inner join” Fábio!!! Muito obrigado mesmo e parabéns!!

  6. Tenho duvida de como fazer um SELECT 3 tabelas, a,b,c onde a tabela ‘a’ não está relacionada com ‘c’ apenas com ‘b’.

    a realaciona com b
    b realciona com c
    mas preciso dos dados de a e c.

  7. Fábio Moura // 03/03/2018 em 13:45 // Responder

    Resposta ao Marcelo :
    “Tenho duvida de como fazer um SELECT 3 tabelas, a,b,c onde a tabela ‘a’ não está relacionada com ‘c’ apenas com ‘b’.

    a realaciona com b
    b realciona com c
    mas preciso dos dados de a e c.”

    SELECT a.nome, c.banco FROM tabela_a AS a
    INNER JOIN tabela_b AS b
    ON b.id = a.id
    INNER JOIN tabela_c AS c
    ON b.id = c.id
    WHERE a.nome = ‘busca’

  8. Marcelo Munhoz // 25/09/2019 em 16:45 // Responder

    Parabéns pela didática e pela boa vontade em publicar estes ensinamentos. Toda comunidade agradece. Me ajudou mto…

  9. Parabéns pelo seu trabalho, suas aulas já me ajudaram muito.

  10. Estou com dificuldade de receber organizado as informações de duas tabelas distintas “session” e “production” vinda do banco de dados para a (table “html”), as informações ficam duplicadas nas (tr), gostaria de receber os dados no lugar adequado, pode me ajudar?

    Meu codigo
    Considere a sintaxe correta Ok:
    SQL
    “SELECT * FROM Session S”
    “INNER JOIN production P”
    “ON S.id_session = P.id_session”

    HTML/PHP
    {foreach from=SESSION item=S}

    {S.sn_name}
    {S.prod_qtd}
    {S.prod_date}

    {\foreach}
    Já tentei fazer um foreach só para a TD também!

  11. cezar de oliveira // 27/05/2020 em 20:25 // Responder

    Nossa vc me salvou. Estava há horas rodando a internete toda buscando como fazer uma pesquisa específica em um campo dentro de um INNER JOIN. Tava ficando doidao ja kkkkk. Site completo de vcs curti demais
    Muito obrigado!!!

  12. cezar de oliveira // 27/05/2020 em 20:26 // Responder

    salvou demais obrigado

  13. Marcelo Matias // 30/07/2020 em 6:58 // Responder

    Bom dia

    Estava a muito tempo tentando conectar duas tabelas, mas agora funciona só que não satisfez porque

    Eu estou relacionando duas uma do cliente e a outra dos serviços

    Só está aparecer os clientes que já têm serviços e eu preciso que na mesma tabela apareça clientes que foram cadastrados e ainda não tiveram serviços

  14. Diego Souza // 09/02/2021 em 17:22 // Responder

    Muito obrigado pelo show de conteúdo. Sou bem leito em SQL e precisei fazer um consulta em 3 tabelas com campos diversos. Este curso caiu dos céus. Muito obrigado pela didática, dinâmica e aula riquíssima. Rodei n’s fóruns nas últimas semana e não conseguia chegar nos resultados necessários. Após alguns minutos deste curso me senti um DBA Master, (risos). Muito obrigado novamente, Fábio dos Reis e sucesso.

Escreva um comentário

Seu e-mail não será divulgado


*