Datos y relaciones de la base de datos.

En la anterior clase, vimos como crear una base de datos mysql y sus estructuras de datos en forma de tablas con una serie de valores. En esta práctica vamos a rellenar y administrar sus relaciones.

Recuerda que en la clase teórica tuvimos que quitar la relación de clave foránea porque no nos permitía guardar datos en la tabla. Así que la eliminamos y creamos cierto contenido a las tablas de la base de datos almacen.

Tablas creadas con contenido de la base almacen

Falta rellenar la tabla proveedores que de momento no hace falta. Pero si que nos hace falta modificar y relacionar las tablas clientes y facturacion.

En mysql existe la propiedade describe que indica al motor SQL que haga una descripción de un objeto en cuestión. Así por ejemplo si ponemos describe clientes;, nos mostrará las propiedades técnicas de dicha tabla:

Tabla cliente con describe te permite saber cuales son las propiedades de la tabla

Como puedes ver en la tabla existe una clave primaria en el campo Id. Pero existe un valor de NIF que será también único en los clientes y por lo tanto, como el cliente se asignará a la compra de ciertos productos, es mejor relacionar el cliente mediante su NIF que mediante su Id. Por eso vamos a cambiar la clave primaria de la tabla clientes.

Usaremos la sintaxis de alter table y añadiremos el campo que queremos que sea el nuevo primary key. En MySQL puede ocurrir dos cosas:

La forma más sencilla es asignar el nuevo campo de primary key

Esta forma de proceder a cambiar la clave primaria suele funcionar a nivel de tabla cuando en la creación de la tabla no se ha creado un campo como clave primaria. Esto no suele ser habitual, ya que una de las exigencias de creación de tablas es que tenga un campo clave (anque hay casos en los que no es obligatorio declararlo porque se supone que vas a trabajar con ella y se crea de forma temporal).

La más habitual suele ser eliminar la clave primaria y crearla de nuevo asignándola al campo correspondiente. El problema está que si se ha creado la clave primaria en la definición de la tabla, no te va a permitir eliminarla porque no puede existir una tabla sin clave primaria.

Problemas al intentar eliminar la clave primary key en Mysql

El problema en ambos casos es que la tabla clientes se especifico con un atributo auto_increment que va ligado a una clave primaria, y esto, hace que no se pueda eliminar la clave primaria sino se elimina antes el atributo auto_increment. Por eso vamos a eliminarlo, y después eliminaremos la clave primaria.

Eliminar atributo de auto_increment en MySQL

Y ahora con esto ya podemos quitar la clave primaria.

alter table clientes drop primary key;
alter table clientes add primary key(NIF);

Si hacemos ahora un describe para ver como ha quedado la tabla clientes podemos ver que ahora la clave primaria está en el campo NIF:

Nueva clave primaria en tabla clientes

Crear relaciones.

Una relación es una dependencia según el nivel de relación entre los datos de las tablas. Por lo tanto vamos a crear una clave foránea para la tabla facturación (que va a ser la tabla que esté asignada a los productos que compran los clientes). Para ello si haces un describe de la tabla facturación verás que no tiene clave foránea, sino clave primaria.

En la tabla facturación no existe la clave foranea

Para crearla, usa la sintáxis siguiente:

alter table facturacion add foreign key(ClienteNIF) references clientes(NIF) on delete cascade on update cascade;

Agregas la clave foránea al campo ClienteNIF de la tabla clientes y al campo NIF de dicha tabla. Con eso ya has creado tu clave foránea en la tabla facturacion.

Para relacionar las tablas y hacer una consulta satisfactoria, los campos de las tablas tienen que coincidir y llamando con la cláusula FROM a ambas tablas y ambos campos relacionados:

Formas de comprobar la relación entre tablas

Como ambas tablas nos devuelven el mismo registro, esto nos indica que la relación se ha creado satisfactoriamente. Y ahora podemos empezar a jugar con los select. Por ejemplo, si hacemos la selección de las dos tablas, por defecto nos mostrará los productos que ha comprado cada cliente:

Selección de todos los registros de las tablas clientes y facturación

Podemos hacer una consulta mejor si ordenamos por Nombre ASC o incluso si filtramos por Nombre y NIF:

Selección de todos los registros de las tablas clientes y facturación ordenados por nombre

Así en esta consulta, puedes ver que he consultado a un cliente concreto y los productos que ha comprado. En esta consulta, puedes ver que cada cliente solo tiene una compra, pero si se aplicara más registros y se asociara al NIF del cliente en el campo ClienteNIF, aparecería en esta búsqueda.

En la siguiente consulta he introducido un nuevo producto para el usuario Pascual Gomez del Pino, que ha comprado chinchetas de carpintero. Como puedes ver cuando hago la consulta por Nombre y NIF ya me muestra los productos que ha comprado este usuario:

Esta select se puede personalizar para que devuelva el número de productos que ha comprado un cliente

Esta forma de consultas múltiples nos permiten establecer un gran número de consultas. Pero aún así se pueden mejorar mediante la instrucción JOIN.

Relaciones JOIN.

Las tablas relacionan sus datos mediante relaciones en sus columnas conocidas como clave foránea. Con SELECT simples y llamando al campo y a la tabla específica, podemos aprovechar un montón de información. Pero existe otra forma de llamar a las tablas y sus datos mediante uniones JOIN.

MySQL en concreto admite los siguientes tipos de uniones:

● Innerjoin.
● Left join.
● Right join.
● Cross join.

Veamos estas opciones.

Inerr JOIN.
La cláusula de INNER JOIN une dos tablas en función de una columna común comparando cada fila de la primera tabla con cada fila de la segunda tabla.

Si los valores de ambas filas coinciden, la cláusula de INNER JOIN crea una nueva fila cuya columna contiene todas las columnas de las dos filas de ambas tablas e incluye esta nueva fila en el conjunto de resultados. La cláusula de INNER JOIN solo incluye filas coincidentes de ambas tablas como se puede ver en el siguiente ejemplo:

Inner join hace lo mismo que select cruzado, pero de una forma más eficaz

INNER JOIN solo incluye filas coincidentes. Y lo habitual es que llame a campos que son identicos en diferentes tablas (no como en esta que ClienteNIF = NIF), pero bueno se puede quedar así.

Diagrama de Venn en cuanto a Inner JOIN

LEFT JOIN.
El LEFT JOIN es similar al INNER JOIN, solo que al seleccionarlo muestra todos los valores de la tabla de la izquierda aunque no tenga correspondencia en la tabla de la derecha. Para cada fila de la tabla de la izquierda el LEFT JOIN compara cada fila de la tabla de la derecha.

Si el valor de las dos filas cumple la condición del JOIN, la cláusula de LEFT JOIN crea una nueva fila que contiene todas las columnas de las dos tablas incluyendo aquellas que no cumplen la condición de la unión. Si el valor no coincide, el LEFT JOIN crea igualmente una fila que contiene todos los datos de la tabla de la izquierda y la correspondencia con la tabla de la derecha se completa con NULL.

La cláusula de LEFT JOIN incluye todas las filas de la tabla de la izquierda como se puede ver en el siguiente ejemplo:

Left join hace lo mismo que inner join, pero ordenando los valores

Observa que left join ordena los registros mediante Id, mientras que inner join lo hacía por cliente y NIF.

Diagrama de Venn en cuanto a left JOIN

Rigth join.
El RIGHT JOIN es similar al INNER JOIN, solo que al seleccionarlo muestra todos los valores de la tabla de la derecha, aunque no tenga correspondencia en la tabla de la izquierda. Para cada fila de la tabla de la derecha el RIGHT JOIN compara cada fila de la tabla de la izquierda.

Si el valor de las dos filas cumple la condición del JOIN, la cláusula de RIGHT JOIN crea una nueva fila que contiene todas las columnas de las dos tablas incluyendo aquellas que no cumplen la condición de la unión. La cláusula de RIGHT JOIN incluye todas las filas de la tabla de la derecha como se puede ver en el siguiente ejemplo:

Inner join hace lo mismo que select cruzado, pero de una forma más eficaz

En este caso el right join hace lo mismo que el inner join. Como Pero su diagrama de Venn es diferente.

Diagrama de Venn en cuanto a right JOIN

Cross JOIN.
El CROSS JOIN es un tipo especial de JOIN que devuelve el producto cartesiano entre las tablas que forman parte de la unión. Se comporta igual que el INNER JOIN como si no tuviera la parte del ON:

cross join te devuelve todos los productos comprados por los clientes en el tiempo

Diagrama de Venn en cuanto a cross JOIN

En la proxima clase aprenderás a tratar y manejar los datos de forma más eficaz. Espero que te hay servido esta clase y si quieres colaborar conmigo, comparte este enlace en tus redes sociales. Así me ayudarás a crecer. Gracias y saludos.