Percorrer relações com JOIN
Para mostrar dados de várias tabelas ao mesmo tempo usa-se JOIN, emparelhando
linhas pelas suas chaves: a estrangeira de uma tabela com o id da outra.
SELECT clientes.nome, pedidos.data
FROM clientes
JOIN pedidos ON pedidos.cliente_id = clientes.id;
Para saber quais produtos cada pedido leva encadeamos vários JOIN, passando
pela tabela ponte detalhes:
SELECT clientes.nome, produtos.nome, detalhes.quantidade
FROM clientes
JOIN pedidos ON pedidos.cliente_id = clientes.id
JOIN detalhes ON detalhes.pedido_id = pedidos.id
JOIN produtos ON produtos.id = detalhes.produto_id;
Resumir com GROUP BY
O valor de cada linha é quantidade * preco. Para o total gasto por
cliente somamos todas as suas linhas e agrupamos por cliente:
SELECT clientes.nome, SUM(detalhes.quantidade * produtos.preco) AS total
FROM clientes
JOIN pedidos ON pedidos.cliente_id = clientes.id
JOIN detalhes ON detalhes.pedido_id = pedidos.id
JOIN produtos ON produtos.id = detalhes.produto_id
GROUP BY clientes.id
ORDER BY total DESC;
Comparar com subconsultas
Uma subconsulta é um SELECT dentro de outro. Serve, por exemplo, para
comparar cada linha com um valor calculado (como uma média):
SELECT nome FROM produtos
WHERE preco > (SELECT AVG(preco) FROM produtos);
Ordem determinista. sql.js compara o resultado linha a linha, então sempre fechamos com um
ORDER BYque não deixe empates ambíguos (adicionando oidou o nome como desempate quando for preciso).