Subido por Gblogger Antihomofobia

SolucionarioProyecto2

Anuncio
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
Descargar