lunes, 19 de abril de 2021

Bases de Datos (19/04/2021)

 Repaso Proyecto, Continuación Lenguaje de Manipulación de Datos

En la clase de hoy hemos empezado haciendo un repaso de algunos conceptos relacionados con la 1º Evaluación de cara a la mejora/recuperación de la 1º Fase del Proyecto de Bases de Datos: el diagrama de entidad/relación y el S.I o análisis de requisitos. 

Después hemos continuado ya con el temario de la 3º Evaluación sobre el Lenguaje de Manipulación de Datos, sobre funciones del tipo "Group By" y "Having". Como recordatorio hay que tener cuidado de no caer en el denominado "Producto Cartesiano", a la hora de escribir el código, debido a que esto es un suspenso inmediato, esto se producía cuando al ejecutar el código aparecen datos de más repetidos. Se puede revisar esto haciendo, a través del MySQLWorkbench, el paso a tablas, utilizando la ingeniería inversa. Para corregir esto hay que añadir al código, por ejemplo un "WHERE", de esta manera:

"SELECT *

FROM imparte, asignaturas

WHERE imparte.asignatura=asignaturas.codigo;" (Usamos WHERE para enlazar tablas por columnas y elimina ciertas filas del cálculo para evitar el Producto Cartesiano).

Por ejemplo, se ha visto si, utilizando la base de datos "Ejemplo", podemos unir las tablas "asignaturas" e "imparte" en una consulta para obtener datos, con resultados positivos, teniendo cuidado de no cometer el "Producto Cartesiano". Luego se ha visto si se pueden unir dos tablas, en una consulta, que no están unidas o relacionadas entre si, por ejemplo "asignaturas" y "profesores" observando las tablas con la ingeniería inversa en MySQLWorkbench. Tras intentarlo se produce el producto cartesiano siempre, a no ser que se enlace con la tabla "imparte", siendo la tabla común entre ambas y se utilice la función "AND", por ejemplo:

"SELECT *

FROM profesores, asignaturas

WHERE asignaturas.codigo=imparte.asignatura 

AND profesores.dni=imparte.dni;"

Mediante el uso de la función "SUM", hemos calculado, por ejemplo, la suma de los créditos de las asignaturas que se imparten, escribiendo: 

"SELECT SUM(creditos)

FROM asignaturas, imparte

WHERE asignaturas.codigo=imparte.asignatura;" 

(RECORDATORIO: siempre que hagamos consultas o introduzcamos datos para nuestro proyecto, examen, etc., en las consultas del SGBD, debemos añadir comentarios al principio del código, utilizando para ello el doble guion "--").

Con la clausula "GROUP BY" podemos crear grupos para enlazar o unir registros por ejemplo, luego si es necesario podemos sumarlos con el "SUM" por ejemplo o cualquier otro cálculo necesario. Si no se utiliza para luego hacer algún cálculo, no tiene mucho sentido utilizar el "GROUP BY". Consulta:

"-- El total de creditos de las asignaturas que imparte cada profesor (comentario en consulta)

SELECT SUM(creditos)

FROM asignaturas, imparte

WHERE asignaturas.codigo=imparte.asignatura

GROUP BY dni;

Queremos añadir nuevas asignaturas a varios profesores, creando nuevas filas en la tabla "imparte", tras hacerlo si volvemos a ejecutar la consulta anterior, debería de actualizarse correctamente los créditos que imparte cada profesor, demostrando que se ha escrito correctamente la consulta. Si añadimos el "DNI" en la zona de consulta donde está el "SELECT", podemos ver cada DNI de los profesores y los créditos de las asignaturas que realiza cada uno. Ya si queremos añadir los nombres de los profesores también al resultado de la consulta, debemos añadir al código lo siguiente:

"-- El total de creditos de las asignaturas que imparte cada profesor

SELECT p.nombre, p.dni, SUM(creditos)

FROM asignaturas, imparte, profesores p

WHERE asignaturas.codigo=imparte.asignatura AND p.dni=imparte.dni

GROUP BY p.dni, p.nombre;"

Podemos realizar la misma consulta, pero quitando del cálculo una de las asignaturas, además podemos acortar la consulta dejando de usar el "GROUP BY" y realizando todo a través del "WHERE", de la siguiente manera:

"-- El total de creditos de las asignaturas que imparte cada profesor sin contar el FBD

SELECT dni, SUM(creditos) 

FROM asignaturas, imparte

WHERE asignaturas.codigo=imparte.asignatura AND asignaturas.codigo !='FBD';"

No hay comentarios:

Publicar un comentario

Entrada de Bienvenida al Blog