Problema:
Você gostaria de combinar dados de mais de duas tabelas usando apenas uma instrução SELECT.
Exemplo:
Existem quatro tabelas em nosso banco de dados:
student
, teacher
, subject
e learning
. O
student
tabela contém dados nas seguintes colunas:id
, first_name
e last_name
. id | first_name | last_name |
---|---|---|
1 | Tom | Moleiro |
2 | João | Primavera |
3 | Lisa | Williams |
4 | Ellie | Barker |
5 | James | Mouro |
O
teacher
tabela contém dados nas seguintes colunas:id
, first_name
, last_name
e subject
. id | first_name | last_name |
---|---|---|
1 | Milão | Smith |
2 | Carlos | Davis |
3 | Marcar | Mouro |
O
subject
tabela contém dados nas seguintes colunas:id
e name
. id | nome |
---|---|
1 | Inglês |
2 | Arte |
3 | Música |
Por fim, o
learning
tabela contém dados nas seguintes colunas:id
, mark
, subject_id
, student_id
e teacher_id
. id | marcar | subject_id | id_aluno | id_do_professor |
---|---|---|---|---|
1 | 4 | 1 | 2 | 1 |
2 | 5 | 2 | 3 | 2 |
3 | 4 | 3 | 1 | 3 |
4 | 3 | 2 | 1 | 2 |
5 | 2 | 3 | 5 | 3 |
6 | 3 | 3 | 4 | 2 |
Queremos saber quais alunos estão estudando inglês, música e arte, bem como quais professores estão ministrando essas aulas. Selecione o assunto do curso, o sobrenome do aluno que está fazendo esse curso e o sobrenome do professor que ministra esse curso.
Solução:
Use vários
JOIN
s em sua consulta:SELECT l.name AS subject_name, t.last_name AS student_last_name, st.last_name AS teacher_last_name FROM learning AS l JOIN subject s ON l.subject_id=s.id JOIN student st ON l.student_id=st.id JOIN teacher t ON l.teacher_id=t.id;
Esta consulta retorna registros com o nome da disciplina do curso e os sobrenomes dos alunos e professores:
subject_name | s_last_name | t_last_name |
---|---|---|
Música | Mouro | Moleiro |
Arte | Davis | Moleiro |
Inglês | Smith | Primavera |
Arte | Davis | Williams |
Música | Davis | Barker |
Música | Mouro | Mouro |
Esses dados vêm de três tabelas, então temos que juntar todas essas tabelas para obter as informações que buscamos.
Discussão:
Se você quiser combinar dados armazenados em várias (mais de duas) tabelas, você deve usar o
JOIN
operador várias vezes. Primeiro, você junta duas tabelas como faria normalmente (usando JOIN
, LEFT JOIN
, RIGHT JOIN
, ou FULL JOIN
, como apropriado). O JOIN
A operação cria uma “tabela virtual” que armazena dados combinados das duas tabelas. Em nosso exemplo, a tabela de resultados é uma combinação de learning
e subject
mesas. O próximo passo é juntar esta tabela de resultados à terceira tabela (no nosso exemplo,
student
). Isso é como um JOIN
normal :você junta a “mesa virtual” e a terceira mesa com uma condição apropriada. Essa condição geralmente deve incluir uma ou mais colunas da tabela adicional (student
) e uma ou mais colunas da “tabela virtual”. Em nosso exemplo, fazemos referência ao student
tabela na segunda condição JOIN. Neste ponto, temos uma nova tabela virtual com dados de três tabelas. A última etapa é adicionar dados da quarta tabela (no nosso exemplo,
teacher
). e junte-se usando a chave dessas tabelas (no nosso exemplo, id
do teacher
tabela e teacher_id
do learning
tabela). Se você tiver que ingressar em outra tabela, poderá usar outro
JOIN
operador com uma condição apropriada na cláusula ON. Em teoria, você pode juntar quantas tabelas quiser.