esquema de la base de datos: esquema.txt
datos: datos.txt
Vamos a sacarle jugo a las consultas en SQL.
En realidad, lo más habitual va a ser extraer datos relacionados entre sí pero que se encuentran distribuidos en varias tablas.
Veamos el contenido actual de las tablas ARTICULO y UNIDAD.
select * from articulo;
select * from unidad;
Está claro que ambas tablas están relacionadas por el código de unidad, esa letra que aparece en las columnas llamadas "unidad" en ambas tablas. Cada artículo se maneja en kilos, litros o, simplemente, en unidades, en piezas únicas.
Para dejarlo bonito lo que querríamos es que, en una única tabla, apareciera toda la información de forma coherente. SQL nos permite consultar varias tablas, simplemente se van poniendo en el from separadas por comas:
select * from articulo, unidad;
Solo estamos mostrando unas cuantas, el resultado completo son 100 filas (20 artículos x 5 unidades).
Tengamos cuidado. Lo que vemos es muy confuso. Si nos fijamos en el artículo de código 1, vemos que sus datos se combinan con todas las unidades posibles: litros, kilogramos, gramos… Pero sabemos que su unidad de presentación es la "u", por unidades. Es decir, un jamón lo vendemos como una pieza entera.
Acabamos de combinar todas y cada una de las filas de ARTÍCULO con todas las de UNIDAD. En términos algebraicos, hemos hecho un producto cartesiano.
Entonces, ¿de qué me sirve esto? En realidad, la pregunta debería ser ¿qué me ha faltado?
select *
from articulo, unidad
where articulo.unidad = unidad.unidad;
Ahora sí, cada código de unidad va acompañado de su correcta descripción para cada artículo. Lo que ha ocurrido es que, después de hacer el producto cartesiano, hemos filtrado ese resultado intermedio, solo nos interesan las filas donde ARTICULO.unidad es igual a UNIDAD.unidad.
De hecho, no sería raro buscar el resultado de una consulta como ésta,
select cod,a.nombre,precio,u.nombre
from articulo a, unidad u
where a.unidad = u.unidad;
donde estamos, por así decirlo, reemplazando el código de unidad por su nombre. Al usuario normal le será más fácil comprender la palabra "kilogramo" que símplemente una "k".
Fíjate que hemos introducido alguna cosa nueva, los sinónimos de tabla. Cuando detrás del nombre de una tabla ponemos otro nombre estamos renombrando la tabla. Esto no es permanente, solo vale para esta consulta.
Podemos utilizarlo para escribir menos, que así de vagos somos, pero también para evitar ambigüedades:
select unidad
from articulo a, unidad u
where a.unidad = u.unidad;
Sí, queremos mostrar la columna unidad pero ¿cuál? ¿La de qué tabla? El error es que en las dos tablas hay columnas que se llaman igual. A SQL hay que dárselo todo muy clarito, debemos poner los "apellidos" de la columna, esto es, a qué tabla pertenece la columna. Lo podemos hacer siempre pero es necesario cuando hay problemas de este tipo.
Más claro queda el que quiero comprobar que, efectivamente, las dos columnas unidad tienen el mismo valor en cada fila resultado. Y ya puestos, también le pedimos los nombres, todo bien precedido de la tabla concreta a la que pertenece.
select a.nombre,a.unidad,u.unidad, u.nombre
from articulo a, unidad u
where a.unidad = u.unidad;
El resumen es que, cuando queremos relacionar información de 2 tablas, normalmente necesitaremos una condición de igualdad que dicte cómo combinar las filas de una y otra.
¿Y si necesito 3 tablas? Pues entonces 2 condiciones de igualdad. ¿Y con 4? Pues 3.
Ese es el patrón, todas las tablas estarán enlazadas por una comparación de igualdad. Algo así como ponerlas en orden y enlazar la primera con la segunda, la segunda con la tercera, la tercera con la cuarta… y hasta que no queden tablas.
¡Cuidado! Este es el patrón general pero no siempre ocurre así, depende de lo que estemos consultando. En cualquier caso, y para este curso, nuestras consultas si son del tipo que estamos comentando.
Terminemos con un ejemplo análogo. Queremos un listado de correos y apellidos de los usuarios y nombre de provincia en la que viven. ¿Cómo se lo preguntarías a MariaDB?