Universidad Estatal a Distancia Vicerrectoría Académica Escuela de Ciencias Exactas y Naturales Diplomado en Informática Cátedra Ingeniera del Software Proyecto Programado #2 Bases de Datos Código (00826) Estudiante: Pablo Fabián González Arias Cédula: 1-1192-0456 Centro Universitario: San José Grupo: 01 I Cuatrimestre 2019 Índice 1) Introducción………………………………………………………...3 2) Desarrollo..………………………………………………………….4 2.1) Diagrama Entidad-Relación............…………………4 2.2) Script de Creación de Tablas .………………………5 2.3) Script del proyecto programado 2…………………..12 3) Recomendaciones…………………………………………………18 4) Conclusiones……………………………………………………….19 5) Bibliografía…………………………………………………………..20 2 Introducción En esta segunda parte del proyecto se busca que el estudiante dé un paso muy importante dentro de la temática que hemos venido tratando: la manipulación de una base de datos. Si bien los temas tratados en los instrumentos previos establecieron las bases para visualizar lo que es una base de datos, cómo se debe construir y la importancia de sus diferentes expresiones, hasta el momento se ha mantenido al margen lo que (tal vez) se puede considerar el tema más importante de todos: la interacción con la base de datos por medio del lenguaje SQL. Para meternos de lleno al tema, retomaremos el modelo creado durante el proyecto programado 1; Esto con el objetivo de completar esa estructura que dejamos “a medias” (durante ese proyecto), insertando los datos que permitan darle sentido a las tablas. Una vez que esto sea una realidad, se deberán construir “scripts” que permitan la manipulación de la información ingresada; que permitan, a su vez, insertar datos en la tabla; además, que permitan obtener información seleccionada de las tablas. Estos objetivos no pueden ser cumplidos a menos que el estudiante tenga una cierta “noción” de cómo es que funciona la estructura de una sentencia SQL. Es meta del estudiante que este trabajo refleje ese conocimiento inicial del lenguaje SQL. (Consideración importante sobre este trabajo escrito: el presente documento contiene elementos tanto del proyecto programado 1, así como del proyecto programado 2. Esto para darle contexto al contenido referente al proyecto programado 2) 3 Desarrollo Diagrama Entidad-Relación (proyecto programado 1) 4 Script de Creación de Tablas (proyecto programado 1) (Copiado desde el documento original generado. También se adjuntó ese archivo de texto al proyecto) -- MySQL Workbench Forward Engineering SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_I N_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_S UBSTITUTION'; -- ------------------------------------------------------ Schema GonzalezPabloProyectoProgramado1 -- ----------------------------------------------------- -- ------------------------------------------------------ Schema GonzalezPabloProyectoProgramado1 -- ----------------------------------------------------CREATE SCHEMA IF NOT EXISTS `GonzalezPabloProyectoProgramado1` DEFAULT CHARACTER SET utf8 ; USE `GonzalezPabloProyectoProgramado1` ; -- ------------------------------------------------------ Table `GonzalezPabloProyectoProgramado1`.`ESTUDIANTES` -- ----------------------------------------------------CREATE TABLE IF NOT `GonzalezPabloProyectoProgramado1`.`ESTUDIANTES` ( EXISTS 5 `codigoEstudiante` INT NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(45) NOT NULL, `telefono` INT NOT NULL, `direccion` VARCHAR(45) NOT NULL, `estado` VARCHAR(45) NOT NULL, `sexo` VARCHAR(45) NOT NULL, `fechaNacimiento` DATE NOT NULL, `nacionalidad` VARCHAR(45) NOT NULL, PRIMARY KEY (`codigoEstudiante`)) ENGINE = InnoDB; -- ------------------------------------------------------ Table `GonzalezPabloProyectoProgramado1`.`PROFESORES` -- ----------------------------------------------------CREATE TABLE IF NOT `GonzalezPabloProyectoProgramado1`.`PROFESORES` ( EXISTS `codigoProfesor` INT NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(45) NOT NULL, `telefono` INT NOT NULL, `direccion` VARCHAR(45) NOT NULL, `sexo` VARCHAR(45) NOT NULL, `tituloProfesional` VARCHAR(45) NOT NULL, `fechaNacimiento` DATE NOT NULL, PRIMARY KEY (`codigoProfesor`)) ENGINE = InnoDB; -- ----------------------------------------------------6 -- Table `GonzalezPabloProyectoProgramado1`.`CURSOS` -- ----------------------------------------------------CREATE TABLE IF `GonzalezPabloProyectoProgramado1`.`CURSOS` ( NOT EXISTS `codigoCurso` INT NOT NULL, `nombreCurso` VARCHAR(45) NOT NULL, `Creditos` INT NOT NULL, PRIMARY KEY (`codigoCurso`)) ENGINE = InnoDB; -- ------------------------------------------------------ Table `GonzalezPabloProyectoProgramado1`.`MATRICULAS` -- ----------------------------------------------------CREATE TABLE IF NOT `GonzalezPabloProyectoProgramado1`.`MATRICULAS` ( EXISTS `codigoMatricula` INT NOT NULL AUTO_INCREMENT, `anoPeridoEducativo` YEAR(4) NOT NULL, `numeroCuatrimestre` INT NOT NULL, `fechaMatricula` DATE NOT NULL, `estado` VARCHAR(45) NOT NULL, `notaFinal` DOUBLE NOT NULL, `FK_CodigoEstudiante` INT NOT NULL, `FK_CodigoProfesor` INT NOT NULL, `FK_CodigoCurso` INT NOT NULL, PRIMARY KEY (`codigoMatricula`, `FK_CodigoEstudiante`, `FK_CodigoProfesor`, `FK_CodigoCurso`), INDEX `fk_MATRICULAS_ESTUDIANTES_idx` (`FK_CodigoEstudiante` ASC) VISIBLE, 7 INDEX `fk_MATRICULAS_PROFESORES1_idx` (`FK_CodigoProfesor` ASC) VISIBLE, INDEX `fk_MATRICULAS_CURSOS1_idx` (`FK_CodigoCurso` ASC) VISIBLE, CONSTRAINT `fk_MATRICULAS_ESTUDIANTES` FOREIGN KEY (`FK_CodigoEstudiante`) REFERENCES (`codigoEstudiante`) `GonzalezPabloProyectoProgramado1`.`ESTUDIANTES` ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_MATRICULAS_PROFESORES1` FOREIGN KEY (`FK_CodigoProfesor`) REFERENCES (`codigoProfesor`) `GonzalezPabloProyectoProgramado1`.`PROFESORES` ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_MATRICULAS_CURSOS1` FOREIGN KEY (`FK_CodigoCurso`) REFERENCES (`codigoCurso`) `GonzalezPabloProyectoProgramado1`.`CURSOS` ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; -- ------------------------------------------------------ Table `GonzalezPabloProyectoProgramado1`.`CARRERAS` -- ----------------------------------------------------CREATE TABLE IF NOT `GonzalezPabloProyectoProgramado1`.`CARRERAS` ( EXISTS `codigoCarrera` INT NOT NULL, 8 `nombreCarrera` VARCHAR(45) NOT NULL, `nivel` VARCHAR(45) NOT NULL, PRIMARY KEY (`codigoCarrera`)) ENGINE = InnoDB; -- ------------------------------------------------------ Table `GonzalezPabloProyectoProgramado1`.`CURSOS_POR_CARRERAS` -- ----------------------------------------------------CREATE TABLE IF NOT `GonzalezPabloProyectoProgramado1`.`CURSOS_POR_CARRERAS` ( EXISTS `FK_CodigoCarrera` INT NOT NULL, `FK_CodigoCurso` INT NOT NULL, PRIMARY KEY (`FK_CodigoCarrera`, `FK_CodigoCurso`), INDEX `fk_CARRERAS_has_CURSOS_CURSOS1_idx` ASC) VISIBLE, (`FK_CodigoCurso` INDEX `fk_CARRERAS_has_CURSOS_CARRERAS1_idx` (`FK_CodigoCarrera` ASC) VISIBLE, CONSTRAINT `fk_CARRERAS_has_CURSOS_CARRERAS1` FOREIGN KEY (`FK_CodigoCarrera`) REFERENCES (`codigoCarrera`) `GonzalezPabloProyectoProgramado1`.`CARRERAS` ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_CARRERAS_has_CURSOS_CURSOS1` FOREIGN KEY (`FK_CodigoCurso`) REFERENCES (`codigoCurso`) `GonzalezPabloProyectoProgramado1`.`CURSOS` ON DELETE NO ACTION ON UPDATE NO ACTION) 9 ENGINE = InnoDB; -- ------------------------------------------------------ Table `GonzalezPabloProyectoProgramado1`.`PROFESORES_POR_CURSO` -- ----------------------------------------------------CREATE TABLE IF NOT EXISTS `GonzalezPabloProyectoProgramado1`.`PROFESORES_POR_CURSO` ( `FK_CodigoProfesor` INT NOT NULL, `FK_CodigoCurso` INT NOT NULL, PRIMARY KEY (`FK_CodigoProfesor`, `FK_CodigoCurso`), INDEX `fk_PROFESORES_has_CURSOS_CURSOS1_idx` (`FK_CodigoCurso` ASC) VISIBLE, INDEX `fk_PROFESORES_has_CURSOS_PROFESORES1_idx` (`FK_CodigoProfesor` ASC) VISIBLE, CONSTRAINT `fk_PROFESORES_has_CURSOS_PROFESORES1` FOREIGN KEY (`FK_CodigoProfesor`) REFERENCES (`codigoProfesor`) `GonzalezPabloProyectoProgramado1`.`PROFESORES` ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_PROFESORES_has_CURSOS_CURSOS1` FOREIGN KEY (`FK_CodigoCurso`) REFERENCES (`codigoCurso`) `GonzalezPabloProyectoProgramado1`.`CURSOS` ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB; 10 SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 11 Script del proyecto programado 2 USE GonzalezPabloProyectoProgramado1; -- ----------------SCRIPT PUNTO 1 -------------- -- NOTA: LA BASE DE DATOS ESTA CARGADA CON ESTUDIANTES Y PROFESORES CON NOMBRES DE LA SERIE LOS SIMPSON -- UNA VEZ QUE EL USUARIO EJECUTA EL SCRIPT, LOS ESTUDIANTES Y PROFESORES PASAN A SER FUTBOLISTAS -- APARTE DE ESTO, CAMBIAN OTROS DATOS DE LA BASE DE DATOS (CANTIDADES, FECHAS, ETC) -- DESPUES DE EJECUTAR EL SCRIPT: -- LOS ESTUDIANTES SE LLAMAN KEYLOR NAVAS(LLEVA 4 MATERIAS), LEONEL MESSI (1 LLEVA MATERIA) Y HOPE SOLO (LLEVA 1 MATERIA) -- LOS PROFESORES SE LLAMAN ZINEDINE ZIDANE(IMPARTE 3 CURSOS), PEP GUARDIOLA(IMPARTE 2 CURSOS) Y MIA HAMM(IMPARTE 1 CURSO) -- ESTA PARTE DEL SCRIPT BORRA TODA LA INFORMACION CONTENIDA DENTRO DE LAS TABLAS DE LA BASE DE -- DATOS GonzalezPabloProyectoProgramado1 DELETE FROM matriculas; DELETE FROM profesores_por_curso; DELETE FROM cursos_por_carreras; DELETE FROM carreras; 12 DELETE FROM cursos; DELETE FROM estudiantes; DELETE FROM profesores; INSERT INTO cursos(CODIGOCURSO, NOMBRECURSO, CREDITOS) -- ESTA PARTE DEL SCRIPT POBLA LAS TABLAS DE LA BASE DE DATOS CON DATOS DIFERENTES A LOS QUE TRAIA -- PREVIAMENTE LA TABLA VALUES (101, 'LA CIENCIA EN SU HISTORIA', 3), (202, 'FUNDAMENTOS DE SOCIOLOGIA', 3), (303, 'GLOBALIZACION Y AMBIENTE', 3), (102, 'FRANCES I', 3), (203, 'ESPANOL II', 4), (304, 'HISTORIA II GUERRA MUNDIAL', 3); INSERT INTO carreras(CODIGOCARRERA,NOMBRECARRERA,NIVEL) VALUES (401, 'ESTUDIOS GENERALES', 1), (402, 'BACHILLERATO ED. PREESCOLAR', 2), (403, 'BACHILLERATO EN CIENCIAS POLICIALES', 2), (404, 'BACHILLER EN FRANCES', 1), (405, 'ENSENANZA DEL ESPANOL', 2), (406, 'CIENCIAS POLICIALES', 2); 13 INSERT INTO profesores(CODIGOPROFESOR, NOMBRE,TELEFONO,DIRECCION,SEXO,TITULOPROFESIONAL,FECHANACI MIENTO) values(501,'ZINEDINE ZIDANE',77777777,'GUANACASTE','MASCULINO','BACHILLER', '70/01/01'), (502,'PEP '71/01/01'), GUARDIOLA',88888888,'LIMON','MASCULINO','BACHILLER', (503,'MIA HAMM',99999999,'HEREDIA','FEMENINO','DOCTOR', '72/01/01'); INSERT INTO estudiantes(CODIGOESTUDIANTE,NOMBRE,TELEFONO,DIRECCION,ESTADO, SEXO,FECHANACIMIENTO,NACIONALIDAD) values(601,'KEYLOR NAVAS',11112222,'SAN JOSE','INACTIVO','MASCULINO','91/01/01','COSTARRICENSE'), (602,'LEONEL '92/01/01','ARGENTINO'), MESSI',11113333,'LIMON','REGULAR','MASCULINO', (603,'HOPE SOLO',11114444,'CARTAGO','INACTIVO','FEMENINO','93/01/01','ESTADOUNID ENSE'); INSERT INTO matriculas(CODIGOMATRICULA,ANOPERIDOEDUCATIVO,NUMEROCUATRIME STRE,FECHAMATRICULA,ESTADO, NOTAFINAL,FK_CODIGOESTUDIANTE,FK_CODIGOPROFESOR,FK_CODIGOC URSO) values(701,18,3,'2014/08/18','REPROBADO',45,601,501,101), (702,18,3,'2013/02/01','APROBADO',100,602,502,202), (703,18,3,'2012/01/05','REPROBADO',50,603,503,303), (704,18,3,'2015/08/18','APROBADO',80,601,501,102), (705,18,3,'2011/02/01','APROBADO',100,601,502,203), (706,18,3,'2010/01/05','REPROBADO',50,601,501,304); 14 INSERT INTO FK_CODIGOCURSO) cursos_por_carreras(FK_CODIGOCARRERA, values(401,101), (401,202), (401,303), (404,102), (405,203), (406,304); INSERT profesores_por_curso(FK_CODIGOPROFESOR,FK_CODIGOCURSO) INTO values(501,101), (502,202), (503,303), (501,102), (502,203), (501,304); -- ----------------SCRIPT PUNTO 2 -------------- -- NOTA: LA TABLA QUE SE GENERA CON ESTA PARTE DEL SCRIPT CONTIENE LAS SIGUIENTES COLUMNAS (EN ESE ORDEN): -- CODIGOCURSO / NOMBRECURSO / CODIGOPROFESOR / NOMBRE (PROFESOR) / CODIGOCARRERA / NOMBRECARRERA select cursos.codigoCurso, cursos.nombreCurso, profesores.codigoProfesor, profesores.nombre, carreras.codigoCarrera, carreras.nombreCarrera 15 from cursos, profesores_por_curso, cursos_por_carreras, profesores, carreras where cursos.codigoCurso = cursos_por_carreras.FK_CodigoCurso and cursos.codigoCurso = profesores_por_curso.FK_CodigoCurso and profesores_por_curso.FK_CodigoProfesor = profesores.codigoProfesor and cursos_por_carreras.FK_CodigoCarrera = carreras.codigoCarrera; -- ----------------SCRIPT PUNTO 3 -------------- -- NOTA: LA TABLA QUE SE GENERA CON ESTA PARTE DEL SCRIPT CONTIENE LAS SIGUIENTES COLUMNAS (EN ESE ORDEN): -- CODIGOMATRICULA / ANOPERIODOEDUCATIVO / NUMERCUATRIMESTRE / FECHAMATRICULA / ESTADO / -- NOTAFINAL / NOMBRE(ESTUDIANTE) / NOMBRECURSO / NOMBRE (PROFESOR) / NOMBRE CARRERA / -- CODIGOCARRERA (COLUMNA EXTRA) / CODIGOCURSO (COLUMNA EXTRA) -- ESTAS ULTIMAS 2 COLUMNAS NO SE REQUIREN EN EL ENUNCIADO DEL PROYECTO. SE INCLUYEN CON EL -- OBJETIVO DE QUE EL USUARIO PUEDA COMPROBAR EL ORDEN ESTABLECIDO EN EL SCRIPT SELECT matriculas.codigoMatricula, matriculas.numeroCuatrimestre, matriculas.fechaMatricula, estudiantes.nombre, cursos.nombreCurso, carreras.codigoCarrera, matriculas.anoPeridoEducativo, matriculas.estado, profesores.nombre, matriculas.notaFinal, carreras.nombreCarrera, 16 cursos.codigoCurso FROM matriculas, estudiantes, cursos, profesores, carreras, cursos_por_carreras -- EN LA SIGUIENTE LINEA (DESPUES DE LOS COMENTARIOS) EL USUARIO PUEDE FILTRAR -- EL REPORTE DE MATRICULAS POR: -- ANO DE LA MATRICULA --> matriculas.anoPeridoEducativo = (INGRESAR ANO) -- NUMERO DE CUATRIMESTRE --> (INGRESAR NUMERO CUATRIMESTRE) WHERE matriculas.anoPeridoEducativo matriculas.numeroCuatrimestre = 3 AND matriculas.numeroCuatrimestre = 2018 = AND matriculas.FK_CodigoEstudiante = estudiantes.codigoEstudiante AND matriculas.FK_CodigoCurso = cursos.codigoCurso AND matriculas.FK_CodigoProfesor = profesores.codigoProfesor AND matriculas.FK_CodigoCurso = cursos.codigoCurso AND cursos.codigoCurso = cursos_por_carreras.FK_CodigoCurso AND cursos_por_carreras.FK_CodigoCarrera = carreras.codigoCarrera ORDER BY carreras.codigoCarrera, cursos.codigoCurso; 17 Recomendaciones Durante los primeros intentos para conseguir que el programa MYSQL devolviera resultados (tablas) con la información deseada, se experimentaron resultados fallidos en los que el producto cartesiano (indeseado) resultó una constante. Ante la incertidumbre de no saber donde radicaba el problema (si era en el esquema creado por uno o si era en la sentencia ingresada), un recurso incluido dentro del programa MYSQL resultó de mucha utilidad: la base de datos “Sakila”. La práctica de sentencias con esta base de datos mostró errores puntuales que se estaban cometiendo, a la vez que permitió percatarse del “sentido” que se sigue dentro de la estructura de los query’s. Ya que todas las personas que tienen acceso a MYSQL también tienen acceso a esta base de datos, existe variedad de documentación y material audiovisual de personas interactuando con esta tabla. Estudiar este material permitió comparar resultados, aprender técnicas, comprobar el uso de nuevos comandos (nuevos para uno, al menos), etc. La interacción con esta schema ayudó a desarrollar el conocimiento y la seguridad para poder trabajar los objetivos del proyecto. 18 Conclusiones La conclusión desarrollada para lo que fue el primer proyecto de esta asignatura hace referencia a la importancia que había tenido el “primer acercamiento” hacia el lenguaje SQL: el desarrollar un modelo relacional y el interactuar con el programa MYSQL (para materializar ese modelo). A pesar de lo conseguido con ese instrumento, el conocimiento sobre el lenguaje SQL que uno presentaba (para ese entonces) causaba cierta intimidación ante lo que podría ser la interacción “real” con programas como MYSQL. El trabajo desarrollado en el presente proyecto ha conseguido lograr que el estudiante compruebe (de primera mano) la utilidad real que tiene la manipulación de las bases de datos. La interacción con la estructura de las sentencias, los comandos SELECT, INSERT, DELETE, y la forma en la que las operaciones booleanas son utilizadas dentro de este lenguaje, ha permitido ilustrar una nueva forma de codificación que hasta hace muy poco era desconocida para este estudiante. Con esto también se ha conseguido establecer comparaciones con lenguajes ya aprendidos, y sacar conclusiones respecto al acercamiento que se ha de tener con SQL en futuros proyectos. Después de haber realizado el instrumento, es opinión del estudiante que el lenguaje SQL presenta nuevas oportunidades, pero también ciertos retos. “Oportunidad” por el hecho de cómo se puede sacar jugo a los datos: SQL tiene la capacidad de transformar simples datos en “información”. “Reto” pues es necesario llegar un nivel mayor de comprensión del lenguaje (si es que se desea ver las posibilidades a las que nos puede llevar). 19 Bibliografía Silberschatz A., Korth H., Sudarshan S. (2014). Fundamentos de Bases de Datos. Capitulo 3: Introducción a SQL. E-R. Madrid, España. McGraw-Hill/Interamericana de España, S.L. 654 p. 20