Consultando varias tablas
esquema de la base de datos: esquema.txt
datos: datos.txt
Es habitual tener que consultar varias tablas porque la información se encuentra distribuida entre ellas.
Sabemos que los artículos se venden empaquetados, junto con otros artículos o no, y en una cierta cantidad cada uno. Pero ¿qué contiene cada EMPAQUETADO? Pues veamos que hay en ARTICULO y en EMPAQUETADO
use tienda;
select * from articulo;
select * from empaquetado;
Examinando esas dos tablas no vemos cómo podemos enlazar una y otra. Cuidado, ARTICULO.cod y EMPAQUETADO.cod no son lo mismo, son códigos diferentes aunque se puedan comparar. Si ejecutamos la siguiente orden no obtenemos nada, cero filas.
select *
from articulo a, empaquetado e
where a.cod = e.cod;
Mirando el esquema nos damos cuenta de que necesitamos CONTIENE, el verdadero enlace entre ARTICULO y EMPAQUETADO.
select *
from articulo a, empaquetado e, contiene c
where a.cod = c.articulo and c.empaquetado = e.cod;
Como ya hemos dicho anteriormente, se trata de emparejar todas las tablas hasta que no quede ninguna sin enlazar. En este caso, 3 tablas, 2 emparejamientos. Aquí es más fácil imaginar que primero ponemos la tabla CONTIENE y le vamos pegando la información a la que se hace referencia.
Lo mismo pero quitando columnas.
select a.cod,a.nombre,a.precio,c.cantidad,e.cod,e.nombre,e.pvp
from articulo a, empaquetado e, contiene c
where a.cod = c.articulo and c.empaquetado = e.cod;
Ahora ordenando por código de EMPAQUETADO para que se vea mejor en qué consiste la relación con ARTICULO.
select a.cod,a.nombre,a.precio,c.cantidad,e.cod,e.nombre,e.pvp
from articulo a, empaquetado e, contiene c
where a.cod = c.articulo and c.empaquetado = e.cod
order by e.cod,a.cod;
Estamos viendo qué artículos contiene cada paquete. Si nos detenemos en el paquete 4, tenemos 2 filas con un artículo diferente en cada una. El paquete 4 contiene los artículos 4 y 5, chorizos y morcillas La Asturiana.
¿Y si queremos añadir el nombre completo de la unidad de comercialización de cada artículo? Eso está en la tabla UNIDAD. Nueva tabla, nuevo enlace.
select a.cod,a.nombre,a.precio,c.cantidad,u.nombre,e.cod,e.nombre,e.pvp
from articulo a, empaquetado e, contiene c, unidad u
where a.cod = c.articulo and c.empaquetado = e.cod and a.unidad = u.unidad
order by e.cod,a.cod;
Evidentemente, podemos añadir los filtros que queramos. Solo vamos a mostrar los artículos, y el paquete al que pertenecen, que se comercialicen por kilos.
select a.cod,a.nombre,a.precio,c.cantidad,u.nombre,e.cod,e.nombre,e.pvp
from articulo a, empaquetado e, contiene c,unidad u
where a.cod = c.articulo and c.empaquetado = e.cod and a.unidad = u.unidad and a.unidad = 'k'
order by e.cod,a.cod;
Obtendremos el mismo resultado si usamos el nombre descriptivo de la unidad.
select a.cod,a.nombre,a.precio,c.cantidad,u.nombre,e.cod,e.nombre,e.pvp
from articulo a, empaquetado e, contiene c, unidad u
where a.cod = c.articulo and c.empaquetado = e.cod and a.unidad = u.unidad and u.nombre = 'kilogramos'
order by e.cod,a.cod;