Como fazer consultas em 2 tabelas no MySQL

Como fazer consultas em 2 tabelas no MySQL utilizando a linguagem PHP

Sempre vejo em alguns fórums que, desenvolvedores que estão iniciando no SQL, tem muita dúvida sobre como fazer um select em duas tabelas.

Resolvi então criar este post especialment para ajudar os “caçulas” da área de desenvolvimento a entender melhor sobre a sintaxe JOIN do SQL. Vou tentar não usar muito os termos técnicos do SQL para todos entenderem melhor.

Primeiramente, vamos definir o que é a sintaxe JOIN, quais são as suas funcionalidades e falar sobre suas formas de complementos: LEFT JOIN, RIGHT JOIN, OUTER, STRAIGHT_JOIN, CROSS JOIN, NATURAL e etc. Depois vamos mostrar as diferenças e mostrar alguns exemplos para você entender melhor.

Vou tomar como exemplo, duas tabelas para vocês entenderem melhor (lembrando que é possível fazer com mais tabelas):

mysql> select * from responsaveis;

+—————————+———————————–+———–+
| nome                     | telefone                         | pid      |
+—————————+———————————–+———–+
| Mr Brown            | 01225 708225           |         1 |
| Miss Smith          | 01225 899360           |        2 |
| Mr Pullen            | 01380 724040           |        3 |
+—————————+———————————–+———–+

3 rows in set (0.00 sec)

mysql> select * from propriedades;

+——+——-+——————————————+
| pid  | spid | propriedade                     |
+——+——-+——————————————+
|     1 |       1 | Old House Farm                |
|     3 |       2 | The Willows                       |
|     3 |       3 | Tall Trees                           |
|     3 |       4 | The Melksham Florist     |
|     4 |       5 | Dun Roamin                      |
+——+——-+——————————————+

5 rows in set (0.00 sec)

O que é o JOIN?

O JOIN é uma sintaxe do SQL utilizada apenas em instruções SELECT.

Esta sintaxe pode ser utilizada para trazer resultados de duas (ou mais) tabelas relacionadas. Lembrando que você precisará de uma chave estrangeira (um campo de uma tabela que referencia a outra com o mesmo tipo e o mesmo valor, e não necessáriamente o mesmo nome).

Existem diversos complementos para esta sintaxe, que possibilitam diversas formas de trazer os resultados das relações das tabelas. Vejas quais são as possibilidades de complementos para o JOIN que o MySQL suporta (fiquem atentos ao número da linha para as explicações futuras):

1. tabela_ref, tabela_ref
2. tabela_ref [INNER | CROSS] JOIN table_reference [join_condition]
3. tabela_ref STRAIGHT_JOIN tabela_ref
4. tabela_ref LEFT [OUTER] JOIN table_reference [join_condition]
5. tabela_ref NATURAL [LEFT [OUTER]] JOIN tabela_ref
6. { OJ tabela_ref LEFT OUTER JOIN tabela_ref ON expr_condicional }
7. tabela_ref RIGHT [OUTER] JOIN table_reference [join_condition]
8. tabela_ref NATURAL [RIGHT [OUTER]] JOIN tabela_ref
 

O que é o INNER JOIN?

 INNER JOIN (linha 2) e , (vírgula, linha 1) são semanticamente equivalentes na ausência da condição join: ambos produzirão um produto Cartesiano entre as tabelas especificadas. (isto é, todos os registros na primeira tabela serão ligados com todos os registros na segunda tabela).

SELECT nome, telefone, propriedade FROM responsaveis, propriedades ON responsaveis.pid = propriedades.pid

SELECT nome, telefone, propriedade FROM responsaveis INNER JOIN propriedades ON responsaveis.pid = propriedades.pid

O que é o CROSS JOIN?

CROSS JOIN talvez seja a sintaxe menos utilizada, ela multiplicará os resultados, e você tem 1 tabela com 3 registros e outra tabela com 2 registros, você terá um resultado de 6 linhas. Eu não vou ficar perdendo tempo e espaço explicando o CROSS JOIN, por ser algo muito dificil de ser utilizado, mas quem quiser saber mais afundo, lenha esta página (em inglês): http://www.roseindia.net/sql/sqljoin/mysql-cross-join.shtml

SELECT nome, telefone, propriedade FROM responsaveis CROSS JOIN propriedades

O que é o STRAIGHT_JOIN?

STRAIGHT_JOIN é identico a JOIN, exceto pelo fato de que a tabela de esquerda sempre é lida antes da tabela da direita. Ele pode ser usado para aqueles casos (poucos) onde o otimizador join coloca as tabelas na ordem errada.

SELECT nome, telefone, propriedade FROM responsaveis STRAINGHT_JOIN propriedades ON responsaveis.pid = propriedades.pid

O que é o LEFT JOIN?

LEFT JOIN é equivalente ao INNER JOIN, exceto pelo fato de que todos os registros da tabela da coluna da esquerda serão retornados, mesmo que não tenha relação alguma com outra tabela.

SELECT nome, telefone, propriedade FROM responsaveis LEFTJOIN propriedades ON responsaveis.pid = propriedades.pid

O que é o NATURAL?

Um NATURAL [LEFT] JOIN de duas tabelas é definido para ser semanticamente equivalente a um INNER JOIN ou um LEFT JOIN com uma cláusula USING que nomeia todas as colunas que exitem em ambas as tabelas.

A cláusula USING (lista_colunas) nomeia uma lista de colunas que devem existir em ambas as tabelas. As seguintes duas cláusulas são semanticamente idênticas:

a LEFT JOIN b USING (c1,c2,c3)
a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3

SELECT nome, telefone, propriedade FROM responsaveis NATURAL LEFTJOIN propriedades

SELECT nome, telefone, propriedade FROM responsaveis LEFTJOIN propriedades USING (pid)

O que é o RIGHT JOIN?

RIGHT JOIN funciona de forma análoga a um LEFT JOIN. Para manter o código portável entre banco de dados, é recomendado usar LEFT JOIN em vez de RIGHT JOIN.

SELECT nome, telefone, propriedade FROM responsaveis RIGHT JOIN propriedades ON responsaveis.pid = propriedades.pid

 

E é isso, qualquer comentário ou dúvida é só comentar no post.

Para quem quer se aprofundar bastante sobre o assunto, não deixe de entrar nestes links:

http://dev.mysql.com/doc/refman/5.0/en/join.html (manual do MySQL)

http://en.wikipedia.org/wiki/Join_(SQL) (Definição do JOIN no Wikipedia)