| <<< 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 >>> |