6.1 Introducción - felipealanis.org ITD/Fundamentos de Bases de Datos... · “control” fuera de...
Transcript of 6.1 Introducción - felipealanis.org ITD/Fundamentos de Bases de Datos... · “control” fuera de...
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 1
6.1 Introducción
SQL es más amigable para el usuario,
a diferencia de Algebra Relacional,
Aunque está basado principalmente en él.
Es el lenguaje comercial más popular.
Es el lenguaje estándar de las Bases de Datos
Relacionales.
Significa Structured Query Language
Su nombre original era SEQUEL desarrollado
como parte del proyecto del sistema R de IBM.
Sequential English QUEry Language
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 2
6.1 Introducción
SQL es parte del Lenguaje de Manipulación de
Datos (DML) y no a la inversa como a veces
se dice.
DML consta de instrucciones para añadir,
modificar, eliminar, datos a la base de datos,
además de las instrucciones de consulta
correspondientes a SQL.
Otro lenguaje importante de los manejadores
de Bases de Datos es DDL (Lenguaje de
Definición de Datos) que es el lenguaje que
permite crear o modificar el esquema de una
BD.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 3
Una consulta en SQL consta de tres cláusulas: select, from y where
… Select
… From
… Where
No confundamos select con la operación seleccionardel álgebra relacional, de hecho la discrepancia es unerror desde la creación de SQL.
X
Equivale a:
6.1 Introducción
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 4
6.3 Estructura Básica
Pruebe estas consultas en cualquier un DBMS (SQL
Server, MySQL, etc)
Esta es la expresión más simple para resolver este problema, ya que solo se emplea un operador de cada tipo. Las expresiones de las páginas siguientes, son más complejas y además, no cumplen con el núcleo de SQL estándar
select nombre,fechafrom Alumnos,InasistAlumwhere hora='16:00' and Alumnos.IdAlumno=InasistAlum.IdAlumno
6.2 Estructura Básica
select nombre,fechafrom (select IdAlumno,nombre from Alumnos),InasistAlumwhere hora='16:00' and Alumnos.IdAlumno=InasistAlum.IdAlumno
Pruebe la expresión de abajo y lea la explicación de la
página 12
6.2 Estructura Básica
select nombre,fechafrom (select IdAlumno,nombre from Alumnos),
(select * from InasistAlum where hora='16:00')where Alumnos.IdAlumno=InasistAlum.IdAlumno
Pruebe la expresión de abajo y lea la explicación de la
página 12
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 12
Puede verificar sus expresiones de consulta en:https://www.eversql.com/sql-syntax-check-validator/
• Expresiones de consulta anidadas como las anteriores deben tener un nombre asignado para que cumplan con el SQL Standard Core (Núcleo del SQL estándar).
• El estándar de SQL proporciona las especificaciones que el lenguaje debe cumplir para asegurar sobre todo la portabilidad, eficiencia y facilidad de uso.
• Algunos DBMS’s cumplen con el estándar, pero por mercadotecnia, añaden una serie de variantes fuera del estándar que no necesariamente tendrán otros DBMS’s. Si se usan, se puede perder la capacidad de portabilidad.
6.2 Estructura Básica
6.2 Estructura Básica
Para adecuar las expresiones anteriores al estándar, hay que usar el equivalente en SQL a la operación Renombrar del Álgebra Relacional.
select nombre,fechafrom (select IdAlumno,nombre from Alumnos) Alum2,InasistAlum where hora='16:00' and Alum2.IdAlumno=InasistAlum.IdAlumno
select nombre,fechafrom (select IdAlumno,nombre from Alumnos) Alum2,
(select * from InasistAlum where hora='16:00') Inasist2where Alum2.IdAlumno=Inasist2.IdAlumno
Renombrar
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 14
select distinct Materias.nombre from Materias, Materias Mat2where Materias.nombre=Mat2.nombre andMaterias.IdMateria<>Mat2.IdMateria
Renombrar
Materias.nombre (Materias.nombre=Mat2.nombreMaterias.IdMateriaMat2.IdMateria (
Materias X Mat2(Materias) ) )
6.2 Estructura Básica
select Alumnos.nombre,Alumnos.domicilio from Alumnos,(select * from Alumnos Alum2 where control='96042121') where Alumnos.colonia=Alum2.colonia and Alumnos.IdAlumno<>Alum2.IdAlumno
no cumple con el Núcleo de SQL estándar ...
6.2 Estructura Básica
select Alumnos.nombre,Alumnos.calle,Alumnos.numero from Alumnos,Alumnos Alum2 where Alum2.control='96042121' and Alumnos.colonia=Alum2.colonia and Alumnos.IdAlumno<>Alum2.IdAlumno
Esta expresión cumple con el Núcleo de SQL estándar
6.2 Estructura Básica
Los DBMS’s cuentan con atributos tipo fecha, por lo que hay que usar una función para obtener por separado cada una de las partes de la fecha:
select nombre,day(FechaNac) from Alumnos where month(FechaNac)=3
union
select nombre,day(FechaNac) from Maestros where month(FechaNac)=3
Los nombres de las funciones day, month, year pueden variar en
cada DBMS
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 18
Pruebe la expresión de consulta de la página anterior añadiendo lo que
está en color rojo:
select nombre,day(FechaNac) as dia from Alumnos where
month(FechaNac)=3
union
select nombre,day(FechaNac) as dia from Maestros where
month(FechaNac)=3
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 19
En vez de:
select * from Materias where creditos>=6 and creditos<=8
Puede escribirse:
select * from Materias where creditos between 6 and 8
Se busca que SQL se parezca más al lenguaje natural para facilidad del usuario
El Operador BETWEEN permite simplificar consultas que contienen una cláusula where que especifica que cierto atributo se encuentre dentro de un rango de
valores.
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 20
select distinct IdAlumno from InasistAlum where
fecha between '2001/03/06' and '2001/03/08'
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 21
Operador LIKE
Es útil cuando no es posible resolver consultas aunque los atributos tengan dominio atómico.
Se aplica a atributos char empleando los símbolos % y _ para representar secciones del valor del atributo.
Caracter % (representa una subcadena de cualquier tamaño dentro del valor del atributo)
Caracter _ (representa a cualquier carácter dentro del valor del atributo)
6.2 Estructura Básica
Encontrar a los alumnos que tienen un número de control que no corresponde al I.T.D. (valor distinto de '04' en las posiciones
3 y 4).
select * from Alumnos where control not like '_ _04%'
Esta consulta no sería resuelta tan fácilmente si el atributo “control” fuera de tipo numérico.
6.2 Estructura Básica
select * from Maestros where Calle like 'C%'
select Nombre from Maestros
where Nombre like '_o%'
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 24
select * from Materias where nombre like '%datos%'
select * from Materias where nombre like '%DATOS%'
6.2 Estructura Básica
Encontrar los nombres de los alumnos que viven en la calle “Real”.
select nombre from Alumnos where domicilio like '%Real%'
El resultado de esta consulta no es satisfactorio.
6.2 Estructura Básica
Los esquemas que cuentan con todos los atributos con dominio atómico, facilitan la obtención de consultas precisas. Observe que no se requiere usar LIKE.
select nombre from Alumnos where calle='Real'
6.2 Estructura Básica
Cláusula Order by
Obtener una relación de los alumnos ordenada en base a la colonia.
select * from Alumnos order by Colonia
o
select * from Alumnos order by 7
6.2 Estructura Básica
Cláusula Order by
Obtener una relación con el domicilio y nombre de los alumnos ordenada en primer lugar por la colonia, en 2º lugar
por la calle y por último números exterior e interior.
select Colonia,Calle,NumeroExt,NumeroInt,Nombre
from Alumnos
order by Colonia,Calle,NumeroExt,NumeroInt
Añada tuplas con colonia y calle iguales para observar el efecto de la expresión.
6.2 Estructura Básica
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 29
6.3 Funciones de Agrupación
Operan sobre grupos de tuplas.
Funciones:
Avg(atributo).
Calcula la media de los valores de un atributo
numérico para un grupo de tuplas.
Min(atributo).
Determina el valor menor de un atributo de un
grupo de tuplas.
Max(atributo).
Determina el valor mayor de un atributo de un
grupo de tuplas.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 30
6.3 Funciones de Agrupación
Funciones:
Sum(atributo).
Calcula la suma de todos los valores de un
atributo de un grupo de tuplas.
Count(atributo) o Count(*).
Cuenta el número de tuplas que hay en un grupo.
Antes de "atributo" puede ir la palabra “distinct”.
Se debe indicar el criterio de agrupación usando la
cláusula group by.
En la tabla resultante aparecerá una tupla por cada
grupo formado.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 31
6.3 Funciones de Agrupación
Contar el número de materias
select count(*) from Materiasselect count(nombre) from Materiasselect count(creditos) from Materias
Contar el número distinto de créditos de las materias
select count(distinct creditos) from Materias
Al no llevar group by, se formará solo un grupo (con todas las tuplas).
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 32
Número de alumnos que vive en cada colonia.
select colonia,count(*) from Alumnos group by colonia
Número de tuplas de cada grupo (en este caso con la misma
colonia).
Relación de los motivos de inasistencia y el total de inasistencias por cada motivo ordenada en forma descendente por el total.
select motivo,count(*) from InasistAlumgroup by motivo order by 2 desc
6.3 Funciones de Agrupación
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 33
Igual a la anterior (que se muestra aquí abajo) pero en larelación resultante solo incluir los motivos mayores a 1inasistencia.
select motivo,count(*) from InasistAlumgroup by motivo order by 2 desc
select motivo,count(*) from InasistAlumgroup by motivo having count(*)>1order by 2 desc
select motivo,count(*) as faltas from InasistAlumgroup by motivo having faltas>1order by faltas desc
6.3 Funciones de Agrupación
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 34
Número de inasistencias en total de cada alumno.
select IdAlumno,count(*) as faltas from InasistAlum
group by IdAlumno order by faltas desc
Número de inasistencias de cada alumno por mes, ordenadas de más a menos considerando solo las inasistencias por motivos deportivos.
select IdAlumno,month(fecha) as mes,count(*) as faltas
from InasistAlum where motivo="Deportes"
group by IdAlumno,mes order by faltas desc
6.3 Funciones de Agrupación
Número de inasistencias en total de cada alumno y número de días en los que tuvo faltas ordenado en primer lugar en base al número total de
días en los que tuvo faltas.
select IdAlumno, count(*) as TotFaltas ,
count(distinct fecha) as TotDias
from InasistAlum group by IdAlumno
order by TotDias desc,TotFaltas desc
6.3 Funciones de Agrupación
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 36
Encontrar el número máximo de créditos.
select max(creditos) from Materias
Número mínimo de créditos.
select min(creditos) from Materias
Número de créditos promedio de todas las materias.
select avg(creditos) from Materias
o
select sum(creditos)/count(*) from Materias
6.3 Funciones de Agrupación
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 37
6.4 Consultas sobre Múltiples Tablas6.4.1 Subconsultas
Diferencia
La operación minus era parte del SQL original pero se hizo innecesaria por la incorporación del operador de
conjuntos in (not in se emplea en vez de minus).
Ejemplo: Números de Control de alumnos que no son maestros (el esquema no contiene una tabla Personas).
Como en el Núcleo de SQL Estándar no se permiten subconsultas en from, para apegamos a la expresión en Algebra Relacional de la página anterior, se puede crear
una Vista.
create view CurpSoloAlumnos as
select curp from Alumnos
where curp not in (select curp from Maestros)
select Alumnos.control from Alumnos, CurpSoloAlumnos
where Alumnos.curp= CurpSoloAlumnos.curp
6.4.1 Subconsultas
Diferencia
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 39
Sin embargo no es necesaria la complejidad de la
expresión anterior ya que el operador in (usado en
este caso con not) nos permite expresar consultas
como esa de manera más simple:
select control from Alumnos
where curp not in (select curp from Maestros)
6.4.1 Subconsultas
Diferencia
Unos ejemplos más:
select paterno,materno,nombre from Alumnos
where curp not in (select curp from Maestros)
select paterno,materno,nombre from Personas
where IdPersona
not in (select IdPersona from Maestros)
Esta última expresión resultará en todas las personas que no son maestros (no solo los alumnos)
6.4.1 Subconsultas
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 41
Encontrar el número de créditos mayor de la relación
materias.
Si no tuvieramos: select max(creditos) from Materias
Probablemente trataríamos de apegarnos a la expresión:
creditos(Materias)
- Materias.creditos(Materias.creditos<Materias2.creditos(Materias X
Materias2(Materias)))
select distinct creditos from Materias where creditos not in (select Materias.creditos from Materias,Materias Mat2 where Materias.creditos<Mat2.creditos)
6.4.1 Subconsultas
Desde luego lo mejor es usar funciones de agrupación (que acabamos de estudiar páginas atrás):
select max(creditos) from Materias
Y para obtener los nombres y claves de las materias con mayor número de creditos, la expresión en SQL sería
simple:
select nombre,clave from Materias
where creditos in (select max(creditos) from Materias)
6.4.1 Subconsultas
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 43
La misma función de la operación intersect se logra mediante el operador de conjuntos in
(Aunque algunos DBMS’s incluyen intersect por mercadotecnia, no pertenece al Núcleo de SQL Estándar)
Encontrar las IdPersona de aquellos maestros que son también alumnos.
IdPersona(Maestros) IdPersona(Alumnos)
select IdPersona from Maestros
where IdPersona in (select IdPersona from Alumnos)
6.4.1 Subconsultas
Intersección
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 44
6.4.1 Subconsultas
Operador in
Alumnos con el primer apellido de “la lista”
select nombre,paterno,materno from Alumnos
where paterno
in (select min(paterno) from Alumnos)
Lista de los alumnos más jóvenes de toda la escuela
select paterno,materno,nombre from Alumnos
where fechanac
in (select max(fechanac) from Alumnos)
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 45
4.4.1 Subconsultas
Operadores para comparación de Conjuntos
Consulta: Encontrar el número de créditos mayor de la
relación materias
(usando el operador de comparación de conjuntos all)
select distinct creditos from Materias
where creditos>=all (select creditos from Materias)
x >=all y significa: elatributo x sea mayor oigual a todos loselementos del conjunto y
>all no produciría ningúnresultado (en esta consultaparticular) ya que no hayun valor mayor a sí mismo.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 46
4.4.1 SubconsultasOperadores para comparación de Conjuntos
Consulta:
Obtener las claves y nombres de las materias con
menor número de créditos:
select clave,nombre from Materias
where creditos<=all (select creditos from Materias)
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 47
4.4.1 Subconsultas
Consulta:
Encontrar a todos los Profesores que sean de menor edad
que al menos un Alumno.
select * from Maestros
where fechanac>some(select fechanac from Alumnos)
x > some y significa: el valordel atributo x sea mayor almenos a uno de los elementosdel conjunto y
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 48
No existe en el Núcleo de SQL estándar (al menos al
momento de escribir estas notas) un operador equivalente a
la división del Algebra Relacional
4.4.1 SubconsultasDivisión
Ejemplo:
Encontrar la Id de aquellos maestros que han asistido a todos los cursos de actualización impartidos.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 49
SQL (Visual Fox):
select IdMaesAsist,NombreCurs from CursosActualizacion into dbf r1
select distinct NombreCurs from CursosActualizacion into dbf r2
select distinct IdMaesAsist from r1 into dbf temp1
select * from temp1,r2 into dbf temp2
select distinct IdMaesAsist from temp2 where IdMaesAsist+NombreCurs ;
not in (select IdMaesAsist+NombreCurs from r1) into dbf temp3
select * from temp1 where IdMaesAsist not in (select * from temp3)
drop table r1
drop table r2
drop table temp1
drop table temp2
drop table temp3
4.4.1 SubconsultasDivisión
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 50
Puede escribirse un programa, utilizando código SQL, en el lenguaje del DBMS(Este ejemplo es de Visual Fox):
local m_fecha1
local m_fecha2
set date french
set century on
clear
m_fecha1 = ctod('')
m_fecha2 = ctod('')
@0,0 say 'Este Programa obtiene los datos de los profesores que han asistido'
@1,0 say ‘a todos los cursos de actualización impartidos durante cierto período’
@3,0 say 'Fecha Inicial:' get m_fecha1
@4,0 say 'Fecha Final:' get m_fecha2
read
if lastkey()=27
return
endif
4.4.1 SubconsultasDivisión
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 51
select IdMaesAsist,NombreCurs from CursosActualizacion ;
where (Fechaini>=m_fecha1) and (Fechaini<=m_fecha2);
into dbf r1
select distinct NombreCurs from CursosActualizacion ;
where (Fechaini>=m_fecha1) and (Fechaini<=m_fecha2);
into dbf r2
select distinct IdMaesAsist from r1 into dbf temp1
select * from temp1,r2 into dbf temp2
select distinct IdMaesAsist from temp2 ;
where IdMaesAsist+NombreCurs not in ;
(select IdMaesAsist+NombreCurs from r1) into dbf temp3
select * from temp1 where IdMaesAsist not in (select * from temp3) ;
into dbf temp4
select IdMaesAsist,Nombre from temp4,Maestros ;
where temp4.IdMaesAsist=Maestros.IdMaestro
4.4.1 SubconsultasDivisión
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 52
close all
drop table r1
drop table r2
drop table temp1
drop table temp2
drop table temp3
drop table temp4
Se crea el programa con MODIFY COMMAND
<nombre> ............. y se ejecuta con
DO <nombre>
4.4.1 SubconsultasDivisión
4.4.1 Subconsultas
División
Modifique el programa anterior para resolver el problema siguiente:
Encontrar las Id de los grupos que tienen sesiones todos los días laborables de la
semana.
4.4.2 Operadores JOIN
select * from Alumnos inner join InasistAlumon Alumnos.IdAlumno=InasistAlum.IdAlumno
• inner (interno) es una palabra opcional, join por si solo implica una junta.
• La expresión de arriba (con inner join o join unicamente) equivale exactamente a:
select * from Alumnos,InasistAlum where Alumnos.IdAlumno=InasistAlum.IdAlumno
4.4.2 Operadores JOIN
select * from Alumnos left outer join InasistAlumon Alumnos.IdAlumno=InasistAlum.IdAlumno
• outer (externo) es una palabra opcional, ya que left o right implican una junta (join) externa.
• left signfica que deben aparecer todas las tuplas de la relación de la izquierda aunque no tengan tuplas correspondientes de la relación de la derecha.
• right significa que deben aparecer todas las tuplas de la relación de la derecha aunque no tengan tuplas correspondientes a la relacion de la izquierda.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 56
4.4.2 Operadores JOIN
select Alumnos.Control,Nombre,InasistAlum.Fecha from Alumnos left join InasistAlum on Alumnos.IdAlumno=InasistAlum.IdAlumno order by 3
Se obiene una relación que contiene una lista de todos los alumnos, hayan tenido o no inasistencias, ordenada por la fecha de
inasistencia
Observe que esta consulta con right join no tendría sentido, de hecho
equivale a join ya que no hay tuplas en InasistAlum que no correspondan
a ningún Alumno.
4.4.2 Operadores JOIN
select IdMaestro,IdMateria,IdPeriodo,Paquete,Horariofrom Grupos,GposMaeswhere Grupos.IdGrupo=GposMaes.IdGrupo
select IdMaestro,IdMateria,IdPeriodo,Paquete,Horariofrom Grupos left join GposMaeson Grupos.IdGrupo=GposMaes.IdGrupo
Con la consulta con from se obiene una relación que incluye solo los grupos que tienen profesor asignado, con left join se obtiene una lista de todos los grupos, tengan
profesor o no.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 59
natural join es una característica que no pertenece al núcleo de SQL estándar ….
Aunque algunos DBMS’s lo incluyen como un equivalente al Producto Natural
Por lo tanto, hay que usar, como siempre, un producto cartesiano, una selección y una proyección.
Con las Vistas (que veremos posteriormente) se pueden simplificar las consultas sin necesidad de
natural join.
4.4.2 Operadores JOIN
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 60Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 60
4.5 Vistas
La creación de vistas permite al DBA, poner adisposición de los usuarios sofisticados y de losprogramadores, los datos de una forma másconveniente, simplificando los esquemas.
Lo anterior se refiere a que, de acuerdo a los criteriosde diseño, los datos se encuentran dispersos en variastablas pero conviene mostrarlos en la menor cantidadde tablas posible, para simplificar la obtención deconsultas.
En realidad, hasta al mismo DBA se le facilita lamanipulación de los datos usando este concepto.
Las vistas se crean a partir de expresiones deconsulta, por lo tanto, son consultas.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 61
Ejemplo:
Un buen esquema para datos de maestros y alumnos podría ser el siguiente, pero para manipular más fácilmente los datos, conviene crear vistas adecuadas para reunir los atributos de personas con alumnos y personas con maestros.
4.5 Vistas
IdPersona Nombre Apellidos Calle Numero FechaNac Teléfono CURP
1 Parejita López Zarco 123 07-02-1981 819-27-37 L1
2 Johannes Gutenberg Negrete 650 12-01-1901 823-15-00 G2
3 Benito Juárez Patoni 100 31-03-1982 800-25-25 J4
4 Luis Pasteur Patoni 234 20-03-1850 818-04-11 P1
5 Padre Abraham Oriente 347 11-04-1890 818-98-75 A0
6 José Revueltas Negrete 1002 24-03-1982 803-17-13 R7
7 Lorena Ochoa Fresno 1410 23-06-1981 800-06-06 O1
8 Aristóteles De Tesalónica Pino Suárez 542 23-07-1905 801-00-00 A1
9 Pyotr Ilich Tchaikovski Zaragoza 471 13-08-1920 874-65-02 T4
10 Sandro Botticelli Juárez 870 07-09-1919 830-77-55 B9
Tabla PERSONAS
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 62Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 62
Ejemplos vistas:
create view DatosAlumnos as
select idAlumno,control,
concat(nombre,' ',apellidos) NombreCompleto,
concat_ws(' ',calle,numext,concat('Int.',numint),concat('Col.',colonia)) Domicilio,
fechanac,curp
from alumnos,personas
where alumnos.idpersona=personas.idpersona order by idalumno
|
select * from DatosAlumnos
Una vista como esta hace innecesario el producto natual, ya que cuando deseemos ver combinados los datos de las tablas Alumnos y Personas, solo debemos usar la Vista DatosAlumnos como si fuera una tabla
idAlumno control NombreCompleto Domicilio fechaNac curp
1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11
2 97041587 Atomic Ant Negrete 1002 Col.Fracc. del Lago 1982-03-24 AA22
3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33
4 96042121 Johnny Bravo Patoni 100 Col.Centro 1982-03-31 BJ44
5 96044350 Robin Hood Aquiles Serdán 1102 Col.Nueva Vizcaya 1979-03-20 RH99
6 97111432 Oso Yogui Victoria 345 Col.Centro 1980-04-11 OY88
7 98042012 Hércules Real 300 Int.1 Col.Olimpo 1981-09-24 HH66
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 63Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 63
create view DatosMaestros as
select idMaestro,rfc,concat(nombre,' ',apellidos) NombreCompleto,
concat_ws(' ',calle,numext,concat('Int.',numint),concat('Col.',colonia)) Domicilio,
fechanac,curp
from maestros,personas
where maestros.idpersona=personas.idpersona
order by idmaestro
select * from DatosMaestros
4.5 Vistas
idMaestro rfc NombreCompleto Domicilio fechanac curp
1 X1 Xavier Lopez Chabelo Templo Atenea 111 Col.Chapultepec 1961-12-17 X11
2 A2 Aristóteles Coliseo 122 Int.1 Col.Tesalónica 1965-11-20 A22
3 T4 Pyotr Ilich Tchaikovski Insurgentes 1000 Col.Kremlin 1964-05-03 T44
4 R9 Robin Hood Aquiles Serdán 1102 Col.Nueva Vizcaya 1979-03-20 RH99
5 B3 Sandro Botticelli Via Benneto 343 Col.Roma 1963-03-29 B33
6 F7 José Ramón Fernández Amarilla 3221 Col.Coapa 1953-07-31 F77
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 64Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 64
4.5 Vistas
create view InasistenciasAlumnos as
select IdInasistAlum,fecha,hora,motivo,
DatosAlumnos.idalumno,control,nombreCompleto,
domicilio,fechanac,curp
from InasistAlum,DatosAlumnos
where InasistAlum.idalumno=DatosAlumnos.idalumno
IdInasistAlum fecha hora motivo idAlumno control nombreCompleto domicilio fechanac curp
1 2001-03-05 16:00:00 Deportes 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11
2 2001-03-06 16:00:00 Enfermedad 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11
3 2001-03-07 16:00:00 Injustificada 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11
4 2001-03-08 16:00:00 Injustificada 1 98042151 Pato Lucas Zarco 123 Col.Centro 1981-07-02 LP11
5 2001-03-01 09:00:00 Enfermedad 3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33
6 2001-03-01 10:00:00 Injustificada 3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33
7 2001-03-01 11:00:00 Injustificada 3 97043014 Mickey Mouse Fresno 1410 Col.Real del Prado 1981-06-23 MM33
8 2001-03-09 16:00:00 Enfermedad 4 96042121 Johnny Bravo Patoni 100 Col.Centro 1982-03-31 BJ44
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 65Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 65
4.5 Vistas
Cuando se abre una vista, en ese momento se realiza la consulta correspondiente.La redundancia aparente no afecta de ninguna
manera ya que internamente el nombre, domicilio, etc etc solo se encuentran una vez en la base de datos, por cada persona.Algunos DBMS’s permiten a los usuarios hacer
modificaciones a través de las vistasMás sencillo para el usuario ya que los atributos los
tiene en sola “tabla”.Ideales para el DBA ya que puede diseñar
correctamente con todas las tablas necesarias pero manipular los datos usando pocas “tablas”.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 66Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 66
4.5 Vistas
Algunos otros ejemplos:
select nombreCompleto,fecha
from InasistenciasAlumnos where hora='16:00'
select * from InasistenciasAlumnos order by control
where motivo=“Injustificada”
select control,domicilio,nombreCompleto,count(*) Total
from InasistenciasAlumnos
group by control order by total desc
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 67
4.6 Manipulación de la Base de Datos
create database Itd
use Itd
create table Alumnos (IdAlumno int auto_increment primary key,control char(8) unique,curp char(18) unique)paterno char(20),materno char(20),nombre char(20),calle char(15),numeroExt numeric(8),numeroInt char(6),colonia char(15),fechaNac date )
La llave primaria permite
establecer integridad referencial
Comandos de DDL
Nombre de la Base de Datos
Los comandos se referirán a esta Base de Datos
El DBMS impedirá que se añadan tuplas con
valores iguales en las llaves
únicas
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 68
4.6 Manipulación de la Base de Datos
create table Materias (IdMateria int auto_increment primary key,
Clave char(4) unique, nombre char(20),creditos numeric(2),horasTeori numeric(2),horasPrac numeric(2))
create table Califics (IdAlumno int references Alumnos,IdMateria int references Materias,
oport char(1),resultado numeric(3),primary key (IdAlumno,IdMateria))
IdAlumno e IdMateria son foreign keys
(llaves foráneas)
Mediante esta sintaxis, se
establece integridad referencial.
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 69
alter table Alumnos add tutor char (30)select * from Alumnos
alter table Alumnos modify column tutor char(45)select * from Alumnos
alter table Alumnos drop tutorselect * from Alumnos
4.6 Manipulación de la Base de Datos
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 70
Comandos DML
INSERT (Añadir tuplas).
insert into <tabla> values (<lista de valores>)
Ejemplo:
insert into Materias values ( 0,'1215', 'Dibujo',4,0,4 )
4.6 Manipulación de la Base de Datos
Un cero instruye a MySQL que IdMateria tome el consecutivo
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 71Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 71
delete from <relación> where <expresión>
Ejemplo:
Eliminar la inasistencias de los alumnos que tuvieron solo una
delete from InasistAlum where IdAlumno in
(select IdAlumno from InasistAlum
group by IdAlumno having count(*)=1)
Si su DBMS no soporta esta sintáxis, hay que guardar la subconsulta en una tabla
temporal para poder completarla
4.6 Manipulación de la Base de Datos
Fund. Bases de Datos Ing. Felipe Alanís González -ITD- 72
Update <relación>
set <expresión asignación> where <condición>
update Materias
set creditos=HorasTeo*3+HorasPra*2
where clave like '18%'
4.6 Manipulación de la Base de Datos