Hola buenas hoy os traigo un pequeño ejercicio de bases de datos relacionales, el cual os voy a enseñar el resultado del código programado.
Comenzamos con el código, la primera parte que mostrare será el diseño físico de la base de datos:
/**********************************************************************************************************************************************************************/
/*********************************************** FÍSICO *********************************************************************/
DROP TABLE IF EXISTS DDM_TUTORES;
CREATE TABLE IF NOT EXISTS DDM_TUTORES(
id INT PRIMARY KEY,
NombreResponsable VARCHAR(255) NOT NULL,
Parentesco VARCHAR(50) NOT NULL,
TelefonoResponsable CHAR(9) NOT NULL
)ENGINE=INNODB CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
DESCRIBE DDM_TUTORES;
DROP TABLE IF EXISTS DDM_ALUMNOS;
CREATE TABLE IF NOT EXISTS DDM_ALUMNOS(
id INT PRIMARY KEY,
NombreAlumno VARCHAR(250) NOT NULL,
FechaNacimiento DATE NOT NULL,
tutor INT NOT NULL,
numexpedientes INT NOT NULL DEFAULT 0,
CONSTRAINT FK1ALUMNOSTUTORES FOREIGN KEY(tutor) REFERENCES DDM_TUTORES(id) ON UPDATE CASCADE ON DELETE NO ACTION
)ENGINE=INNODB CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
DESCRIBE DDM_ALUMNOS;
DROP TABLE IF EXISTS DDM_EXPEDIENTES;
CREATE TABLE IF NOT EXISTS DDM_EXPEDIENTES(
id INT PRIMARY KEY,
alumno INT NOT NULL,
FechaExpediente DATE NOT NULL,
MotivoExpediente VARCHAR(250) NOT NULL,
CONSTRAINT FK2EXPEDIENTES FOREIGN KEY(alumno) REFERENCES DDM_ALUMNOS(id) ON UPDATE CASCADE ON DELETE NO ACTION
)ENGINE=INNODB CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
DESCRIBE DDM_EXPEDIENTES;
DROP TABLE IF EXISTS DDM_TOTALES;
CREATE TABLE IF NOT EXISTS DDM_TOTALES(
id INT PRIMARY KEY,
totalumnos INT NOT NULL DEFAULT 0,
totexpedientes INT NOT NULL DEFAULT 0,
tottutores INT NOT NULL DEFAULT 0
)ENGINE=INNODB CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;
DESCRIBE DDM_TOTALES;
INSERT INTO DDM_TOTALES(id) VALUES
(1);
/**********************************************************************************************************************************************************************/
/*********************************************** TRIGGERS ****************************************************************/
DROP TRIGGER IF EXISTS CUENTAEXPEDIENTES;
DELIMITER //
CREATE TRIGGER CUENTAEXPEDIENTES AFTER INSERT ON DDM_EXPEDIENTES
FOR EACH ROW
BEGIN
UPDATE DDM_ALUMNOS
SET numexpedientes = numexpedientes + 1
WHERE DDM_ALUMNOS.id = NEW.alumno;
UPDATE DDM_TOTALES
SET totexpedientes = totexpedientes + 1
WHERE DDM_TOTALES.id = 1;
END //
DELIMITER ;
/* ***********************************************************************************************/
DROP TRIGGER IF EXISTS CUENTATUTORES;
DELIMITER //
CREATE TRIGGER CUENTATUTORES AFTER INSERT ON DDM_TUTORES
FOR EACH ROW
BEGIN
UPDATE DDM_TOTALES
SET tottutores = tottutores + 1
WHERE DDM_TOTALES.id = 1;
END //
DELIMITER ;
/* ***********************************************************************************************/
DROP TRIGGER IF EXISTS CUENTAALUMNOS;
DELIMITER //
CREATE TRIGGER CUENTAALUMNOS AFTER INSERT ON DDM_ALUMNOS
FOR EACH ROW
BEGIN
UPDATE DDM_TOTALES
SET totalumnos = totalumnos + 1
WHERE DDM_TOTALES.id = 1;
END //
DELIMITER ;
/**********************************************************************************************************************************************************************/
/*********************************************** INSERTS ****************************************************************/
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(1,’Alberto Grau López’,’Padre’,’600600600′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(2,’Ana Méndez Sanz’,’Madre’,’612612612′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(3,’Lucía Álvarez Rilo’,’Madre’,’699699699′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(4,’Antonio Abad Pérez’,’Padre’,’634634634′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(5,’Elena Pérez Pérez’,’Madre’,’600700800′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(6,’Alicia Vázquez Egea’,’Madre’,’654654654′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(7,’Alberto López Gala’,’Tutor Legal’,’678678678′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(8,’José Mateo Soto’,’Padre’,’677677677′);
INSERT INTO DDM_TUTORES(id, NombreResponsable, Parentesco, TelefonoResponsable) VALUES
(9,’Rosa Aledo Muñoz’,’Madre’,’611611611′);
SELECT * FROM DDM_TUTORES;
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(1,’Alba Grau Pérez’,’1998-02-05′,’1′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(2,’Pablo Gea Sanz’,’1997-03-19′,’2′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(3,’Rafael Gil Rilo’,’1997-04-01′,’3′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(4,’Ana Abad Lara’,’1998-01-03′,’4′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(5,’Eva Abad Lara’,’1999-07-20′,’4′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(6,’Carla Rojo Sala’,’2000-05-05′,’5′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(7,’José Pardo Olmo’,’2000-10-19′,’6′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(8,’Beatriz Vera Cobos’,’1999-12-12′,’7′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(9,’Pablo Mateo Lara’,’2000-08-14′,’8′);
INSERT INTO DDM_ALUMNOS(id, NombreAlumno, FechaNacimiento, tutor) VALUES
(10,’Carlos Pino Sabina’,’1999-06-06′,’9′);
SELECT * FROM DDM_ALUMNOS;
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(1,’1′,’2013-10-14′,’Agresión verbal a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(2,’2′,’2014-01-27′,’Agresión física a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(3,’3′,’2014-02-20′,’Hurto de material del centro’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(4,’4′,’2014-02-26′,’agresión verbal a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(5,’5′,’2014-03-02′,’Rotura del mobiliario de clase’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(6,’6′,’2014-05-03′,’Agresión verbal a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(7,’1′,’2015-01-23′,’Agresión verbal a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(8,’7′,’2015-02-03′,’Rotura del mobiliario de clase’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(9,’8′,’2015-02-17′,’Agresión física a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(10,’9′,’2015-03-07′,’Hurto de material del centro’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(11,’10’,’2015-04-15′,’Agresión verbal a un compañero’);
INSERT INTO DDM_EXPEDIENTES(id, alumno, FechaExpediente, MotivoExpediente) VALUES
(12,’1′,’2015-05-23′,’Hurto de material del centro’);
SELECT * FROM DDM_EXPEDIENTES;
SELECT * FROM DDM_ALUMNOS;
SELECT * FROM DDM_TOTALES;
TABLA DDM_ALUMNOS CON EL FUNCIONAMIENTO DE LOS TRIGGER:
TABLA DDM_TOTALES CON EL FUNCIONAMIENTO DE TODOS LOS TRIGGER:
/**********************************************************************************************************************************************************************/
/*********************************************** CONSULTAS ****************************************************************/
SELECT DDM_ALUMNOS.NombreAlumno AS ‘nombre’, DDM_ALUMNOS.FechaNacimiento AS ‘fechanacimiento’, DDM_EXPEDIENTES.FechaExpediente AS ‘fecha’, DDM_EXPEDIENTES.MotivoExpediente AS ‘motivo’, DDM_TUTORES.NombreResponsable AS ‘nombre’, DDM_TUTORES.Parentesco AS ‘parentesco’, DDM_TUTORES.TelefonoResponsable AS ‘telefono’
FROM DDM_ALUMNOS, DDM_EXPEDIENTES, DDM_TUTORES
WHERE DDM_ALUMNOS.id = DDM_EXPEDIENTES.alumno AND DDM_TUTORES.id = DDM_ALUMNOS.tutor;
SELECT COUNT(DDM_ALUMNOS.id) AS ‘Nº TOTAL DE ALUMNOS’, A.E AS ‘Nº TOTAL DE EXPEDIENTES’
FROM DDM_ALUMNOS, (SELECT COUNT(DDM_EXPEDIENTES.id) AS ‘E’
FROM DDM_EXPEDIENTES) A;
SELECT COUNT(DDM_EXPEDIENTES.id) AS ‘Nº TOTAL DE EXPEDIENTES’, C.A AS ‘Nº DE EXPEDIENTES 2014’, Q.A AS ‘Nº DE EXPEDIENTES 2015’
FROM DDM_EXPEDIENTES, (SELECT COUNT(DDM_EXPEDIENTES.id) AS ‘A’
FROM DDM_EXPEDIENTES
WHERE YEAR(DDM_EXPEDIENTES.FechaExpediente) = ‘2014’) C, (SELECT COUNT(DDM_EXPEDIENTES.id) AS ‘A’
FROM DDM_EXPEDIENTES
WHERE YEAR(DDM_EXPEDIENTES.FechaExpediente) = ‘2015’) Q;
SELECT COUNT(DDM_ALUMNOS.id) AS ‘Nº TOTAL DE ALUMNOS’, S.A AS ‘Nº DE ALUMNOS MAYORES DE EDAD’, ROUND ((S.A/COUNT(DDM_ALUMNOS.NombreAlumno))*100,2) AS ‘PORCENTAJE’
FROM DDM_ALUMNOS, (SELECT COUNT(DDM_ALUMNOS.NombreAlumno) AS ‘A’
FROM DDM_ALUMNOS
WHERE TRUNCATE((TO_DAYS(SYSDATE()) – TO_DAYS(DDM_ALUMNOS.Fechanacimiento)) / 365.25,0) > 17) S;
SELECT DDM_ALUMNOS.NombreAlumno AS ‘Alumno Más Viejo’, DDM_ALUMNOS.FechaNacimiento AS ‘Nacimiento Alumno Más Viejo’, A.B AS ‘Alumno Más Joven’, A.C AS ‘Nacimiento Alumno Más Joven’
FROM DDM_ALUMNOS, (SELECT DDM_ALUMNOS.NombreAlumno AS ‘B’, DDM_ALUMNOS.FechaNacimiento AS ‘C’
FROM DDM_ALUMNOS
WHERE DDM_ALUMNOS.FechaNacimiento IN(SELECT MAX(DDM_ALUMNOS.FechaNacimiento)
FROM DDM_ALUMNOS)) A
WHERE DDM_ALUMNOS.FechaNacimiento IN(SELECT MIN(DDM_ALUMNOS.FechaNacimiento)
FROM DDM_ALUMNOS);
SELECT DDM_TUTORES.NombreResponsable , DDM_TUTORES.parentesco, COUNT(DDM_ALUMNOS.tutor) AS ‘Nº de DDM_ALUMNOS tutelados’
FROM DDM_TUTORES,DDM_ALUMNOS
WHERE DDM_TUTORES.id = DDM_ALUMNOS.tutor
GROUP BY DDM_TUTORES.NombreResponsable, DDM_TUTORES.parentesco
HAVING COUNT(DDM_ALUMNOS.tutor) = (SELECT MAX(GG.A) FROM (
SELECT COUNT(DDM_ALUMNOS.tutor) AS A
FROM DDM_TUTORES,DDM_ALUMNOS
WHERE DDM_TUTORES.id = DDM_ALUMNOS.tutor
GROUP BY DDM_TUTORES.NombreResponsable, DDM_TUTORES.parentesco) GG);
/**********************************************************************************************************************************************************************/
/*********************************************** FUNCIONES Y PROCEDURES ****************************************************************/
DROP PROCEDURE IF EXISTS NUMEXPEDIENTES;
DELIMITER //
CREATE PROCEDURE NUMEXPEDIENTES(IN nombre VARCHAR(250), OUT expediente TEXT)
BEGIN
DECLARE motivo TEXT DEFAULT «»;
DECLARE contador INT DEFAULT 0;
DECLARE numexp INT DEFAULT 0;
SET numexp = (SELECT COUNT(DDM_EXPEDIENTES.alumno)
FROM DDM_EXPEDIENTES, DDM_ALUMNOS
WHERE DDM_EXPEDIENTES.alumno = DDM_ALUMNOS.id AND DDM_ALUMNOS.NombreAlumno LIKE nombre);
IF numexp > 0 THEN
SET expediente = CONCAT(‘El alumno ‘,nombre,’ TIENE ‘,numexp,’ expedientes\n’);
ELSE
SET expediente = CONCAT(‘El alumno ‘,nombre,’ tiene’,numexp,’ expedientes’);
END IF;
WHILE contador < numexp DO
SET motivo = (SELECT DDM_EXPEDIENTES.MotivoExpediente
FROM DDM_EXPEDIENTES, DDM_ALUMNOS
WHERE DDM_EXPEDIENTES.alumno = DDM_ALUMNOS.id AND DDM_ALUMNOS.NombreAlumno LIKE nombre LIMIT contador,1);
SET expediente = CONCAT(expediente,’….’,contador+1,’ +’,motivo,’\n’);
SET contador = contador + 1;
END WHILE;
END //
DELIMITER ;
CALL NUMEXPEDIENTES(‘Alba Grau Pérez’,@a);
SELECT @a;
CALL NUMEXPEDIENTES(‘Pablo Gea Sanz’,@a);
SELECT @a;
CALL NUMEXPEDIENTES(‘Rafael Gil Rilo’,@a);
SELECT @a;
DROP PROCEDURE IF EXISTS TUTORES;
DELIMITER //
CREATE PROCEDURE TUTORES(IN nombre VARCHAR(250), OUT resultado TEXT)
BEGIN
DECLARE tutor TEXT DEFAULT «»;
DECLARE contador INT DEFAULT 0;
DECLARE numtute INT DEFAULT 0;
SET numtute = (SELECT COUNT(DDM_ALUMNOS.id)
FROM DDM_ALUMNOS, DDM_TUTORES
WHERE DDM_ALUMNOS.tutor = DDM_TUTORES.id AND DDM_TUTORES.NombreResponsable LIKE nombre);
IF numtute > 0 THEN
SET resultado = CONCAT(‘El tutor: ‘,nombre,’ tiene ‘,numtute,’ tutelados.\n’);
ELSE
SET resultado = CONCAT(‘El tutor: ‘,nombre,’ tiene ‘,numtute,’ tutelado.\n’);
END IF;
WHILE contador < numtute DO
SET tutor = (SELECT DDM_ALUMNOS.NombreAlumno
FROM DDM_ALUMNOS, DDM_TUTORES
WHERE DDM_ALUMNOS.tutor = DDM_TUTORES.id AND DDM_TUTORES.NombreResponsable LIKE nombre LIMIT contador, 1);
SET resultado = CONCAT(resultado,’…’,contador + 1,’ +’,tutor,’\n’);
SET contador = contador + 1;
END WHILE;
END //
DELIMITER ;
CALL TUTORES(‘Alberto López Gala’,@b);
SELECT @b;
CALL TUTORES(‘Antonio Abad Pérez’,@b);
SELECT @b;
CALL TUTORES(‘Alicia Vázquez Egea’,@b);
SELECT @b;
CALL TUTORES(‘José Mateo Soto’,@b);
SELECT @b;
DROP FUNCTION IF EXISTS FTUTORES;
DELIMITER //
CREATE FUNCTION FTUTORES( nombre VARCHAR(250) )
RETURNS TEXT
BEGIN
DECLARE alum TEXT DEFAULT «»;
DECLARE contador INT DEFAULT 0;
DECLARE numalu INT DEFAULT 0;
DECLARE resultado TEXT DEFAULT «»;
SET numalu = (SELECT COUNT(DDM_TUTORES.id)
FROM DDM_TUTORES, DDM_ALUMNOS
WHERE DDM_ALUMNOS.tutor = DDM_TUTORES.id AND DDM_TUTORES.NombreResponsable LIKE nombre);
IF numalu > 0 THEN
SET resultado = CONCAT(‘El tutor: ‘,nombre,’ tiene ‘,numalu,’ tutelados\n’);
ELSE
SET resultado = CONCAT(‘El tutor: ‘,nombre,’ no tiene ningun alumno tutelado\n’);
END IF;
WHILE contador < numalu DO
SET alum = (SELECT DDM_ALUMNOS.NombreAlumno
FROM DDM_ALUMNOS, DDM_TUTORES
WHERE DDM_ALUMNOS.tutor = DDM_TUTORES.id AND DDM_TUTORES.NombreResponsable LIKE nombre LIMIT contador, 1);
SET resultado = CONCAT(resultado,’—>’,contador + 1,’ +’,alum,’\n’);
SET contador = contador + 1;
END WHILE;
RETURN(resultado);
END //
DELIMITER ;
SELECT FTUTORES(‘José Mateo Soto’);
SELECT FTUTORES(‘Alicia Vázquez Egea’);
SELECT FTUTORES(‘Antonio Abad Pérez’);
SELECT FTUTORES(‘Alberto López Gala’);
/* ************************************************************************************************************ */
/* ************************************ CASE **************************************************************** */
DROP FUNCTION IF EXISTS NOMBRETUTOR;
DELIMITER //
CREATE FUNCTION NOMBRETUTOR(nombre INT)
RETURNS TEXT
BEGIN
DECLARE nombretotal TEXT DEFAULT ‘NO FUNCIONA’;
CASE nombre
WHEN 1 THEN SET nombretotal = ‘Jose’;
WHEN 2 THEN SET nombretotal = ‘David’;
ELSE
SET nombretotal = ‘EL NUMERO DEL MES INTRODUCIDO ES INCORRECTO DEBE SER UN NUMERO DEL 1 AL 2’;
END CASE;
RETURN(nombretotal);
END //
DELIMITER ;
SELECT NOMBRETUTOR(‘1’);
SELECT NOMBRETUTOR(‘2’);
/*************************************************************************************************************/
/********************************************** MID procedure ***********************************************/
DROP PROCEDURE IF EXISTS NOMBREMID;
DELIMITER //
CREATE PROCEDURE NOMBREMID(IN nombre VARCHAR(250), OUT resultado TEXT)
BEGIN
DECLARE contador INT DEFAULT 0;
DECLARE numletras TEXT DEFAULT «»;
DECLARE consumid TEXT DEFAULT «»;
SET numletras = (SELECT CHARACTER_LENGTH(nombre));
SET resultado = CONCAT(‘El nombre introducido tiene: ‘,numletras,’caracteres\n’);
WHILE contador < numletras DO
SET consumid = (SELECT MID(nombre,contador + 1,1));
SET resultado = CONCAT(resultado,’ Letra: ‘,consumid);
SET contador = contador + 1;
END WHILE;
END //
DELIMITER ;
CALL NOMBREMID(‘David’,@c);
SELECT @c;
CALL NOMBREMID(‘Jara’,@c);
SELECT @c;
CALL NOMBREMID(‘Fernando’,@c);
SELECT @c;
CALL NOMBREMID(‘Jose’,@c);
SELECT @c;
CALL NOMBREMID(‘Adrian’,@c);
SELECT @c;
/*************************************************************************************************************/
/********************************************** MID FUNCION ***********************************************/
DROP FUNCTION IF EXISTS NOMBREMIDF;
DELIMITER //
CREATE FUNCTION NOMBREMIDF(nombre VARCHAR(250))
RETURNS TEXT
BEGIN
DECLARE contador INT DEFAULT 0;
DECLARE numletras TEXT DEFAULT «»;
DECLARE consumid TEXT DEFAULT «»;
DECLARE resultado TEXT DEFAULT «»;
SET numletras = (SELECT LENGTH(nombre));
SET resultado = CONCAT(‘El nombre introducido: ‘,nombre,’ tiene ‘,numletras,’ caracteres. \n’);
WHILE contador < numletras DO
SET consumid = (SELECT MID(nombre,contador + 1,1));
SET resultado = CONCAT(resultado,’ Letra: ‘,consumid);
SET contador = contador + 1;
END WHILE;
RETURN(resultado);
END //
DELIMITER ;
SELECT NOMBREMIDF(‘David’);
SELECT NOMBREMIDF(‘Jara’);
SELECT NOMBREMIDF(‘Fernando’);
SELECT NOMBREMIDF(‘Jose’);
SELECT NOMBREMIDF(‘Adrian’);
Gracias por leer el blog. Saludos, @DavidDeMaya.
I like this specific website it’s a master model! Glad I discovered this particular by the search engines.