TEMA: CREAR BASES DE DATOS RECUPERACIÓN DE DATOS PARTE 1: Crear la base de datos /*
******************************************************************** CREACION DE LA BASE DE DATOS ******************************************************************** */ CREATE DATABASE ControlAcademico ON (NAME = ControlAcademico ControlAcademico, , -- Primary data file FILENAME = 'C:\Data\ControlAcademico.mdf' 'C:\Data\ControlAcademico.mdf', , SIZE = 3MB 3MB, , MAXSIZE = 20MB 20MB, , FILEGROWTH = 5MB 5MB ) LOG ON (NAME = ControlAcademico_Log ControlAcademico_Log, , -- Log file FILENAME = 'C:\Data\ControlAcademico.ldf' 'C:\Data\ControlAcademico.ldf', , SIZE = 1MB 1MB, , MAXSIZE = 20MB 20MB, , FILEGROWTH = 2MB 2MB ) GO
PARTE 2: CREAR TIPOS /*
******************************************************************** CREACION DE TIPOS ******************************************************************** */ USE ControlAcademico CREATE CREATE CREATE CREATE CREATE
TYPE TYPE TYPE TYPE TYPE
TCodCP FROM nvarchar nvarchar( (2) not null TCodAlumno FROM nvarchar nvarchar( (10) 10) not null TCodAsignatura FROM nvarchar nvarchar( (5) not null TCodDocente FROM nvarchar nvarchar( (10) 10) not null TSemestre FROM nvarchar nvarchar( (6) not null
GO
PARTE 3: CREAR LAS TABLAS /*
******************************************************************** CREACION DE TABLAS ******************************************************************** */ USE ControlAcademico create table taCarreraProfesional ( CodCP TCodCP, TCodCP , NombreCP nvarchar( nvarchar (60) 60) Primary key (CodCP CodCP) ) )
null,
create table taAlumno ( codAlumno TCodAlumno, aPaterno nVarchar(40) not null, aMaterno nVarchar(40) not null, Nombres nVarchar(40) not null, codCP TCodCP, Primary key (CodAlumno), Foreign key (CodCP) references taCarreraProfesional(CodCP) ) create table taDocente ( codDocente aPaterno aMaterno Nombres Categoria
TCodDocente, nVarchar(40) not null, nVarchar(40) not null, nVarchar(40) not null, nVarchar(2) default 'PR' Check (Categoria in ('PR','AS','AU','JP','CO')), Regimen nVarchar(4) default 'DE' Check (Regimen in ('DE','TC','TP20','TP10')), Primary key (CodDocente)
) create table taAsignatura ( CodAsignatura TCodAsignatura, CodCP TCodCP, NombreAsignatura Varchar(100) not null, Categoria Varchar(4) default 'OE' Check (Categoria in ('OE','EE','OCG','ECG','PPP')), Creditos Int default 1 Check (Creditos > 0), Primary key (CodAsignatura, CodCP) ) create table taCatalogo ( Semestre TSemestre, CodAsignatura TCodAsignatura, CodCP TCodCP, Grupo nvarchar(1), CodDocente TCodDocente, Primary key (Semestre, CodAsignatura, CodCP, Grupo), Foreign key (CodAsignatura, CodCP) references taAsignatura(CodAsignatura, CodCP), Foreign key (CodDocente) references taDocente(CodDocente) ) create table taMatricula ( Semestre TSemestre, CodAsignatura TCodAsignatura, CodCP TCodCP, Grupo nvarchar(1), CodAlumno TCodAlumno, Nota nVarchar(3) default 'NSP' Check (Nota in ('NSP','00', '01','02','03','04','05','06','07','08','09','10', '11','12','13','14','15','16','17','18','19','20')), Primary key (Semestre,CodAsignatura,CodCP,Grupo,CodAlumno), Foreign key (Semestre, CodAsignatura, CodCP, Grupo) references taCatalogo(Semestre,CodAsignatura, CodCP, Grupo), Foreign key (CodAlumno) references taAlumno(CodAlumno) ) GO
PARTE 4: CONSULTAS DE UNA ÚNICA TABLA
Obtener la relación de alumnos de la Carrera “IS”, con los siguientes atributos
R(codAlumno,aPaterno,aMaterno,Nombres) select codAlumno,aPaterno,aMaterno,Nombres from taAlumno where codCp = 'IS'
Obtener el número de alumnos La sentencia SELECT es: select count(codAlumno) as NroAlumno from taAlumno
Obtener el número de alumno s de la Carrera “IS” La sentencia SELECT es: select count(codAlumno) as NroAlumno from taAlumno where codCP = 'IS'
Obtener la relación de carreras con sus respectivos números de alumnos. Con los siguientes atributos: R(codCP,NroAlumnos) La sentencia SELECT es: Select codCp,Count(CodAlumno) as NroAlumnos from taAlumno group by codCp
Obtener la relación de asignaturas ofrecidas en el semestre 2010- 1 en la carrera “IS”, que tengan menos de 7 alumnos. La relación resúltate debe estar ordenado por el número de alumnos y tener los siguientes atributos: R(codAsignatura,codCP,Grupo,NroAlumnos) La sentencia SELECT es: select codAsignatura,codCp,Grupo,Count(codAlumno) as NroAlumnos from taMAtricula where (Semestre = '2010-1') and (codCp ='IS') group by codAsignatura,codcp,Grupo having count(codAlumno) < 7 order by NroAlumnos
PARTE 5: COMPOSICIÓN I
Obtener la relación de asignaturas en las que se matriculo el estudiante de código ‘009200528A’, con los siguientes atributos: R(codAsignatura,codCP,Grupo,nombreAsignatura,Categoria,Creditos,Nota) El resultado de este ejercicio se podría utilizar como base para emitir una ficha de seguimiento. select m.codAsignatura,m.codcp,m.grupo,a.nombreAsignatura, a.categoria,a.creditos,m.nota from taMatricula m inner join taAsignatura a on (m.codAsignatura = a.codAsignatura) and (m.codCp = a.codCp) where (m.codAlumno = '009200528A')
Obtener la relación de número de alumnos por carrera, con los siguientes atributos R(codCP,nombreCP,NroAlumnos) select a.codCp,c.nombreCp,count(codAlumno) as NroAlumno from taAlumno a inner join TaCarreraProfesional C on (a.codCp = c.codCp) group by a.codCp, c.nombreCp
Obtener la relación de numero de créditos acumulados por cada uno de los estudiantes de la carrea profesional ‘IS’, con los siguientes atributos. R(codALumno,aPaterno,aMaterno,Nombres,Creditos) select m.codAlumno,l.aPaterno,l.aMaterno,l.Nombres,sum(creditos) as NroCreditos from taMatricula m inner join taAsignatura a on (m.codAsignatura = a.codAsignatura) and (m.codCp = a.codCp) inner join taAlumno l on m.codAlumno = l.codAlumno where (Nota in ('11','12','13','14','15','16','17','18','19','20')) group by m.codAlumno,l.aPaterno,l.aMaterno,l.nombres
Obtener la relación de alumnos de la asignatura de código ‘ME201’, grupo A, de la carrera ‘IS’, dictadas en semestre ‘2010-1’.
La relación resultante puede ser considerada como base para la emisión de actas, y debe tener los siguientes atributos R(codALumno,aPaterno,aMaterno,nombres,Nota,Observaciones) En la columna Observaciones debe mostrar: APROBADO si la nota esta entre 11 y 20, DESAPROBADO si esta entre 07 y 10, REPROBADO si esta entre 0 y 6, y NO SE PRESENTO si la nota es igual a NSP.
select m.codAlumno,a.aPaterno,a.aMaterno,a.nombres, m.nota,"Observaciones" = case when m.nota = 'NSP' then 'NO SE PRESENTO' when Cast(m.nota as integer) <= 6 then 'REPROBADO' when Cast(m.nota as integer) <= 10 then 'DESAPROBADO' else 'APROBADO' end from taMatricula m inner join taAlumno a on (m.codAlumno = a.codAlumno) where (m.codAsignatura = 'ME201') and (M.Grupo = 'A') and (m.codCp = 'IS') and (m.semestre = '2010-1')
PARTE 6. MODULARIDAD Y SENTENCIAS SQL
Obtener la relación de alumnos de Ingeniería de Sistemas que hayan aprobado todas sus asignaturas en el semestre ‘2010-1’. La relación resultante debe tener los siguientes atributos: R(codAlumno,ApellidoPaterno,ApellidoMaterno,Nombres) Solucion: a) Primer Algoritmo La idea central de este algoritmo es comparar el número de asignaturas en las que se matriculo cada alumno, con el número de asignaturas que aprobó, Si estas son iguales, entonces el alumno ha aprobado todas sus asignaturas. A continuación se descompone esta idea en unidades lógicas:
o
Determinar relación de alumnos de la carrera profesional ‘IS’ matriculados en el semestre ‘20101’, con sus respectivas notas. select codAlumno,codAsignatura,nota into #Alumnos_is from taMatricula where (semestre = '2010-1') and (codCp = 'IS')
Esta sentencia da como resultado un tabla temporal con el siguiente resultado: #ALUMNOS_IS(codAlumno,codAsignatura,Nota) o
Utilizando la tabla temporal anterior, determinar la relación de alumnos con el número de asignaturas en las que se matriculo: select codAlumno,count(codAsignatura) NroAsignaturasMatricula into #Asignaturas_Matricula from #Alumnos_IS group by CodAlumno
Esta sentencia da como resultado una tabla temporal con el siguiente resultado: #Asignaturas_Matricula(codAlumno,NroAsignaturasMatricula) o
Utilizando la tabla temporal #ALUMNOS_IS, determinar la relación de alumnos con el número de asignaturas aprobadas:
select codalumno,count(codasignatura) NroAsignaturasAprobadas into #Asignaturas_Aprobadas from #Alumnos_is where (Nota in ('11','12','13','14','15','16','17','18','19','20')) group by codalumno
La sentencia anterior da como resultado una tabla temporal con el siguiente resultado: #Asignaturas_Aprobadas(codAlumno,NroAsignaturasAprobadas) o
Los alumnos han aprobado todas las asignaturas en el semestre dado, si el número de asignaturas en las que se matriculo es igual al número de asignaturas que aprobó. Entonces utilizando las tablas temporales #Asignaturas_Matricula y #Asignaturas_Aprobadas, se determina la relación de alumnos que aprobaron todas sus asignaturas.
select m.codalumno into #Alumnos_invictos from #Asignaturas_matricula m inner join #Asignaturas_Aprobadas a on (m.codalumno = a.codalumno) and (m.nroasignaturasmatricula = a.nroasignaturasAprobadas)
Esta sentencia da como resultado una tabla con los códigos de los alumnos invictos: #Alumnos_invictos o
Finalmente, utilizando la última tabla temporal y la tabla taALUMNO, se determina la relación pedida:
select i.codAlumno, a.apaterno as ApellidoPaterno,a.amaterno as ApellidoMaterno,a.Nombres from #alumnos_invictos i inner join taalumno a on i.codalumno = a.codalumno
b) La idea de este algoritmo es determinar que alumno se matricularon en el semestre dado y determinar a los que tengan ninguna asignatura desaprobada. A continuación se descompone esta idea central en unidades lógicas: o
Determinar relación de alumnos de la carrera profesional ‘IS’ matriculados en el semestre ‘20101’.
select codalumno,apaterno,amaterno,nombres into #alumnos_matriculados from taalumno where codalumno in (select distinct codalumno from tamatricula where (semestre = '2010-1') and (codcp = 'IS'))
Esta sentencia da como resultado alumnos de la Carrera profesional ‘IS’ matriculados en el semestre ‘2010-1’ en una tabla temporal con la siguiente estructura: #alumnos_matriculados(codAlumno,aPaterno,aMaterno,Nombres) o
Utilizando la tabla temporal anterior, determinar la relación de alumnos que aprobaron todas las asignaturas en las que se matricularon:
select * from #alumnos_matriculados where codalumno not in (select distinct codalumno from taMatricula where (semestre = '2010-1') and (codcp = 'IS') and (Nota not in ('11','12','13','14','15','16','17','18','19','20')))
-
Calcular el promedio ponderado para los alumnos invictos:
select a.codalumno,a.apaterno,a.amaterno,a.nombres, (sum(cast(m.nota as integer)*s.creditos)/sum(s.creditos)) PromedioPonderado from taAlumno a inner join #alumnos_invictos ai on a.codAlumno = ai.codAlumno inner join taMatricula m on a.codalumno = m.codalumno inner join taAsignatura s on (m.codasignatura = s.codasignatura) and (m.codcp = s.codcp) where (m.semestre = '2010-1') group by a.codalumno,a.apaterno,a.amaterno,a.nombres
PARTE 7. COMPOSICIÓN II
Obtener la relación de alumnos de la carrera profesional ‘IS’ con el número de créditos aprobados, con la
siguiente información: R(codAlumno, aPAterno,aMaterno,Nobres,NroCreditos) Primero determinamos la relación de alumnos de la carrera de ‘IS’ con la relación de asignaturas aprobadas. select codalumno,codasignatura,codcp into #Matricula from taMatricula where (codcp = 'IS') and (Nota in ('11','12','13','14','15','16','17','18','19','20'))
Lugo, determinamos el número de créditos aprobados por cada alumno. select m.codalumno,sum(a.creditos) NRoCreditos into #NroCreditos from #Matricula m inner join taAsignatura a on (m.codasignatura = a.codasignatura) and (m.codcp = a.codcp) group by m.codalumno
Finalmente, agregamos los datos adicionales del alumno: select a.*,isnull(c.nrocreditos,0)NroCreditos from taAlumno a left outer join #NroCreditos c on (a.codalumno = c.codalumno) where a.codcp = 'IS'