Recorrer relaciones con JOIN
Para mostrar datos de varias tablas a la vez se usa JOIN, emparejando filas
por sus claves: la foránea de una tabla con el id de la otra.
SELECT clientes.nombre, pedidos.fecha
FROM clientes
JOIN pedidos ON pedidos.cliente_id = clientes.id;
Para conocer qué productos lleva cada pedido encadenamos varios JOIN, pasando
por la tabla puente detalles:
SELECT clientes.nombre, productos.nombre, detalles.cantidad
FROM clientes
JOIN pedidos ON pedidos.cliente_id = clientes.id
JOIN detalles ON detalles.pedido_id = pedidos.id
JOIN productos ON productos.id = detalles.producto_id;
Resumir con GROUP BY
El importe de cada línea es cantidad * precio. Para el total gastado por
cliente sumamos todas sus líneas y agrupamos por cliente:
SELECT clientes.nombre, SUM(detalles.cantidad * productos.precio) AS total
FROM clientes
JOIN pedidos ON pedidos.cliente_id = clientes.id
JOIN detalles ON detalles.pedido_id = pedidos.id
JOIN productos ON productos.id = detalles.producto_id
GROUP BY clientes.id
ORDER BY total DESC;
Comparar con subconsultas
Una subconsulta es un SELECT dentro de otro. Sirve, por ejemplo, para
comparar cada fila con un valor calculado (como una media):
SELECT nombre FROM productos
WHERE precio > (SELECT AVG(precio) FROM productos);
Orden determinista. sql.js compara el resultado fila a fila, así que siempre cerramos con un
ORDER BYque no deje empates ambiguos (añadiendo elido el nombre como desempate cuando haga falta).