Podemos realcionar diversas tabelas através de elementos em comum
que serão IDs ou chaves relacionando umas as outras.
Podemos fazer o relacionamento entre as tabelas selecionando os
dados que queremos cruzar, indicando as tabelas a serem
consultadas e indicando qual a chave comum entre elas com o
comando WHERE.
SELECT coluna_tabelaA, coluna_tabelaB FROM
tabelaA, tabelaB WHERE
tabelaA.chave_comum = tabelaB.chave_comum
Entretanto a utilização do WHERE não é indicada para
fazer essa operação mas sim para filtros. O comando mais indicado
para essa operação é o INNER JOIN. Nesse caso a sintaxe é
a seguinte:
SELECT coluna_tabelaA, coluna_tabelaB FROM
tabelaA INNER JOIN tabelaB ON
tabelaA.chave_comum = tabelaB.chave_comum
Podemos facilitar os endereçamentos dos itens criando
alias(apelidos) para elas de modo a facilitar a sua
indicação. Para isso basta utilizar o comando AS e em
seguida o alias.
Em seguida fiz o relacionamento entre tres tabelas com ordenação.
SELECT nomeproduto,nomecategoria,nomefornecedor
FROM produtos AS p
INNER JOIN categorias AS c ON p.categoriaID = c.categoriaID
INNER JOIN fornecedores AS f ON p.fornecedorID =
f.fornecedorID
ORDER BY nomecategoria ASC
Quando queremos fazer um agrupamento utilizando uma chave presente
em duas tabelas devemos definir apenas uma chave para o
agrupamento, desse modo quando chamamos o comando
GROUP BY devemos definir uma das tabelas como agrupador
determinando seu prefixo (nome da tabela ou alias).
SELECT nomecategoria, COUNT(produtoID) AS total
FROM produtos AS p
INNER JOIN categorias AS c ON p.categoriaID = c.categoriaID
GROUP BY c.categoriaID
A consulta com agrupamento utilizando o
INNER JOIN entretanto apenas retorna os dados que tiverem
algum valor (calculado pelo COUNT). Para recuperar todas
as ocorrencias devemos utilizar o INNER JOIN. Esse
comando irá retornar todos os valores da tabela, mesmo o que não
tiverem valores de ocorrencia.
SELECT nomecompleto, COUNT(pedidoID) AS total
FROM clientes AS c LEFT JOIN pedidos AS p ON c.clienteID =
p.clienteID
GROUP BY c.clienteID
ORDER BY total DESC
Podemos mesclar os comandos de agrupamento com os de soma e
filtro:
SELECT nomestatus, SUM(valor_pedido) AS total
FROM pedidos AS p INNER JOIN pedidos_status AS s ON
p.status_pedido = s.statusID
GROUP BY p.status_pedido
HAVING total >= 6000
Por fim fizemos um filtro com tres tabelas buscando vários valores
de uma tabela.
SELECT DISTINCT nomecompleto,telefone,email
FROM clientes c INNER JOIN pedidos p ON c.clienteID =
p.clienteID
INNER JOIN pedidos_item i ON i.pedidoID = p.pedidoID
WHERE i.produtoID = 2
Note que não precisamos utilizar o AS para criar alias,
embora eu entenda que fica mais organizado e fácil de visualizar.