www.samueldiasneto.com: Tutorial MySQL

<<< Voltar Avançar >>>

12. Juntando tabelas

Muitas vezes você terá que juntar tabelas para atender a alguma necessidade específica. Observe por exemplo o banco de dados de exemplo mostrado abaixo:

mysql> show tables;
+-------------------+
| Tables_in_exemplo |
+-------------------+
| cliente           |
| pedido            |
+-------------------+
2 rows in set (0.00 sec)

mysql> describe cliente;
+--------+----------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra          |
+--------+----------+------+-----+---------+----------------+
| codigo | int(11)  |      | PRI | NULL    | auto_increment |
| nome   | char(30) |      |     |         |                |
+--------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> describe pedido;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| nr      | int(10) unsigned |      |     | 0       |       |
| cliente | int(11)          |      |     | 0       |       |
| valor   | float(5,2)       |      |     | 0.00    |       |
+---------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> select * from cliente;
+--------+--------+
| codigo | nome   |
+--------+--------+
|      1 | João   |
|      2 | Maria  |
|      3 | José   |
|      4 | Manuel |
+--------+--------+
4 rows in set (0.00 sec)

 mysql> select * from pedido;
+----+---------+--------+
| nr | cliente | valor  |
+----+---------+--------+
|  1 |       2 |  50.50 |
|  2 |       2 |  60.00 |
|  3 |       1 | 100.05 |
|  4 |       3 |  54.70 |
|  5 |       3 |  80.90 |
+----+---------+--------+
5 rows in set (0.00 sec)

mysql>   

Agora suponha que precisamos de um relatório que mostre os nomes dos clientes e os respectivos pedidos. Para isto precisamos unir as duas tabelas e selecionar apenas as colunas desejadas:

mysql> select cliente.nome,pedido.nr,pedido.valor from
    -> cliente,pedido
    -> where cliente.codigo = pedido.cliente;
+-------+----+--------+
| nome  | nr | valor  |
+-------+----+--------+
| João  |  3 | 100.05 |
| Maria |  1 |  50.50 |
| Maria |  2 |  60.00 |
| José  |  4 |  54.70 |
| José  |  5 |  80.90 |
+-------+----+--------+
5 rows in set (0.00 sec)

O comando acima pode ser entendido como selecione os campos nome do cliente, número do pedido e valor do pedido da união das tabelas cliente e pedido onde o código do cliente seja igual ao cliente do pedido.

Observe que o cliente Manuel não fez nenhum pedido. E se você quiser um relatório que mostre também os clientes que não fizeram nenhum pedido? Você terá que usar uma junção chamada left join:

mysql> select pedido.nr,cliente.nome,pedido.valor
    -> from cliente left join pedido
    -> on cliente.codigo = pedido.cliente;
+------+--------+--------+
| nr   | nome   | valor  |
+------+--------+--------+
|    3 | João   | 100.05 |
|    1 | Maria  |  50.50 |
|    2 | Maria  |  60.00 |
|    4 | José   |  54.70 |
|    5 | José   |  80.90 |
| NULL | Manuel |   NULL |
+------+--------+--------+
6 rows in set (0.05 sec)

Veja que agora o cliente que não fez nenhum pedido, no caso o Manuel, também foi exibido. Observe que com left join você deve usar on no lugar de where. Se quiser exibir apenas os clientes que não fizeram nenhum pedido, use algo como:

  mysql> select pedido.nr,cliente.nome,pedido.valor
    -> from cliente left join pedido
    -> on cliente.codigo = pedido.cliente
    -> where pedido.nr is null;
+------+--------+-------+
| nr   | nome   | valor |
+------+--------+-------+
| NULL | Manuel |  NULL |
+------+--------+-------+
1 row in set (0.00 sec)

<<< Voltar Avançar >>>