4x U4 - Felipe Alanís González

Anuncio
Unidad 4
Introducción a SQL
4.1 Introducción
4.1 Introducción.
4.2 Estructura básica (SELECT, WHERE).
4.3 Funciones de agrupación (GROUP BY, HAVING).
4.4 Consultas sobre múltiples tablas.
4.4.1 Subconsultas.
4.4.2 Operadores JOIN.
4.5 Vistas.
4.6 Manipulación de la base de datos
(INSERT, UPDATE, DELETE).
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
1
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
SQL ha sido tan popular, que aunque es uno
más de los lenguajes de las B.D. Relacionales,
se ha aceptado como “El Lenguaje”.
Los dos Lenguajes que “componen” a SQL:
DDL.
Data Definition Language
DML
Data Manipulation Languaje
En realidad SQL es una parte de DML.
Ing. Felipe Alanís González -ITD-
2
4.2 Estructura Básica
4.1 Introducción
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
X … From
σ … Where
No confundamos select con la operación seleccionar
del álgebra relacional, de hecho la discrepancia es un
error desde la creación de SQL.
Select A1, A2, ..... An from r1, r2, ...., rm where P
Equivale a:
Π A , A , .... A
1
Fund. Bases de Datos
2
n
(
σ
P ( r1 X r2 X .... X rm ) )
Ing. Felipe Alanís González -ITD-
4
4.2 Estructura Básica
4.2 Estructura Básica
relación InasistAlum
IdAlumno
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
σ
hora='16:00'
(InasistAlum)
relación ALUMNOS
Pruebe estas
consultas en
cualquier un
DBMS (por
ejemplo Visual
Fox, Access,
MySQL, etc)
IdAlumno
1
2
3
4
Control
98042151
97041587
97043014
96042121
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Domicilio
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
CURP
LP11
AA22
MM33
BJ44
Πnombre,curp(Alumnos)
select nombre,curp from Alumnos
select * from InasistAlum where hora='16:00'
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
5
4.2 Estructura Básica
4.2 Estructura Básica
relación InasistAlum
IdAlumno
1
1
1
1
3
3
3
4
relación InasistAlum
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
IdAlumno
1
1
1
1
3
3
3
4
Πfecha,motivo,IdAlumno( σhora='16:00' (InasistAlum) )
select fecha,motivo,IdAlumno from InasistAlum
where hora='16:00'
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
7
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
σ
hora≤'12:00'
(InasistAlum)
select * from InasistAlum where hora<='12:00'
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
8
4.2 Estructura Básica
4.2 Estructura Básica
relación ALUMNOS
relación InasistAlum
IdAlumno
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
IdAlumno
1
2
3
4
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Domicilio
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
CURP
LP11
AA22
MM33
BJ44
relación InasistAlum
IdAlumno
Pruebe la expresión de abajo
y lea la explicación de la
página 12
ΠIdAlumno( σhora≤'12:00' (InasistAlum) )
Ing. Felipe Alanís González -ITD-
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
Π nombre,fecha( σ hora='16:00'∧Alumnos.IdAlumno=InasistAlum.IdAlumno
( Π IdA lum no,nom bre (A lu m n o s) X In asistA lu m ) )
select IdAlumno
from InasistAlum where hora<='12:00'
select distinct IdAlumno
from InasistAlum where hora<='12:00'
Fund. Bases de Datos
Control
98042151
97041587
97043014
96042121
9
select nombre,fecha
from (select IdAlumno,nombre from Alumnos),InasistAlum
where hora='16:00' and
Alumnos.IdAlumno=InasistAlum.IdAlumno
4.2 Estructura Básica
relación ALUMNOS
IdAlumno
1
2
3
4
Control
98042151
97041587
97043014
96042121
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Domicilio
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
IdAlumno
Pruebe la expresión de abajo
y lea la explicación de la
página 12
4.2 Estructura Básica
FechaNac CURP
07/02/1981 LP11
24/03/1982 AA22
23/06/1981 MM33
31/03/1982 BJ44
relación InasistAlum
1
1
1
1
3
3
3
4
•
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
Π nom bre,fech a( σ Alu m no s.IdAlu m n o =InasistAlu m .Id Alum n o
(Π IdAlumno,nombre(Alumnos) X
σhora='16:00'(InasistAlum)))
select nombre,fecha
from (select IdAlumno,nombre from Alumnos),
(select * from InasistAlum where hora='16:00')
where Alumnos.IdAlumno=InasistAlum.IdAlumno
Anidamientos como los anteriores (producto cartesiano de
subconsultas) y muchas variantes más de SQL, no
cumplen con el SQL Standard Core (Núcleo del SQL
estándar).
• Conviene usar únicamente expresiones que cumplan con el
Núcleo del Estándar para conservar la portabilidad.
• Muchos DBMS’s cumplen con el estándar, pero por
mercadotecnia, añaden una serie de variantes que no
necesariamente tendrán otros DBMS’s.
Puede verificar sus expresiones en la siguiente liga:
http://developer.mimer.se/validator/parser200x/index.tml
O puede ver una lista de las características del Núcleo de SQL
Estándar en:
http://developer.mimer.se/validator/parser200x/core-sql-200x.tml
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
12
4.2 Estructura Básica
relación ALUMNOS
IdAlumno
1
2
3
4
Control
98042151
97041587
97043014
96042121
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
4.2 Estructura Básica
Domicilio
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
CURP
LP11
AA22
MM33
BJ44
Relación Materias
IdMateria
1
2
3
4
5
relación InasistAlum
IdAlumno
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
Clave
8807
8821
8011
8927
8806
Nombre
Estructuras de Datos I
Bases de Datos I
Matemáticas IV
Bases de Datos I
Programación II
ΠMaterias.nombre (σMaterias.nombre=Mat2.nombre∧Materias.IdMateria≠Mat2.IdMateria (
Materias X
Πnombre,fecha( σhora='16:00'∧Alumnos.IdAlumno=InasistAlum.IdAlumno
( A lu m n o s X I n a s is tA lu m ) )
select nombre,fecha
from Alumnos,InasistAlum
where hora='16:00' and Alumnos.IdAlumno=InasistAlum.IdAlumno
Renombrar
Fund. Bases de Datos
Domicilio
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
Aquiles Serdán 1102
Victoria 345
Juarez 543
IdAlumno
1
2
3
4
5
6
7
Colonia
Centro
Del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Centro
ΠAlumnos.nombre,Alumnos.domicilio
(σAlumnos.colonia=Alum2.colonia∧Alumnos.IdAlumno≠Alum2.IdAlumno∧Alum2.control='96042121'
(AlumnosXρAlum2(Alumnos)))
14
relación ALUMNOS
relación ALUMNOS
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Ing. Felipe Alanís González -ITD-
4.2 Estructura Básica
4.2 Estructura Básica
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
) )
select distinct Materias.nombre
from Materias, Materias Mat2
where Materias.nombre=Mat2.nombre and
Materias.IdMateria<>Mat2.IdMateria
Esta alternativa es la mejor ya que es la mas simple para el usuario ... además
cumple con el Núcleo de SQL estándar
IdAlumno
1
2
3
4
5
6
7
ρMat2(Materias)
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Domicilio
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
Aquiles Serdán 1102
Victoria 345
Juarez 543
Colonia
Centro
Del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Centro
Π A lum no s .no m b re ,A lum no s .do m ic ilio
(
σ
A lu m 2 .co n tr ol= '9 60 4 01 21 ' ∧ A lu m n os .c olo n ia =A lu m 2 .c olo nia ∧ A lu m n os .Id A lu m n o ≠ A lum 2.IdA lu m n o
( A lu m n o s
X
(
ρ A lu m 2 ( A lu m n o s ) ) )
)
select Alumnos.nombre,Alumnos.domicilio
from Alumnos,(select * from Alumnos Alum2 where control='96042121')
where Alumnos.colonia=Alum2.colonia and Alumnos.IdAlumno<>Alum2.IdAlumno
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
no cumple con el Núcleo de SQL estándar ...
Esta expresión cumple con el Núcleo de SQL estándar
4.2 Estructura Básica
Alumnos
IdAlumno
1
2
3
4
5
6
7
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Calle
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
Aquiles Serdán 1102
Victoria 345
Juárez 543
Colonia
Centro
Del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Centro
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
20/03/1979
11/04/1980
24/09/1981
CURP
LP11
AA22
MM33
JB44
RH99
OY88
HH66
4.2 Estructura Básica
Pruebe la expresión de consulta de la página anterior añadiendo lo
que está en color rojo:
Maestros
IdMaestro
1
2
3
4
5
6
CURP
X11
A22
T44
RH99
B33
F77
Nombre
Xavier Lopez Chabelo
Aristóteles
Tchaikovski
Robin Houd
Botticelli Sandro
Fernández José Ramón
Calle
Templo Atenea 111
Coliseo 122
Insurgentes 1000
Aquiles Serdán 1102
Cataluña 343
Coapa 3221
FechaNac
17/12/1961
20/11/1965
03/05/1964
20/03/1979
29/03/1963
31/07/1953
select nombre,day(FechaNac) as dia from Alumnos where
month(FechaNac)=3
union
Π nombre,dianac(σmesnac=3(Alumnos)) ∪ Π nombre,dianac(σmesnac=3(Maestros))
Los nombres de las
Los DBMS’s cuentan con atributos tipo fecha, por lo que hay funciones
que usar
una
day, month,
yearla
pueden
variar en
función para obtener por separado cada una de las partes de
fecha:
cada DBMS
select nombre,day(FechaNac) from Alumnos where month(FechaNac)=3
union
select nombre,day(FechaNac) from Maestros where month(FechaNac)=3
select nombre,day(FechaNac) as dia from Maestros where
month(FechaNac)=3
Fund. Bases de Datos
4.2 Estructura Básica
Ing. Felipe Alanís González -ITD-
4.2 Estructura Básica
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.
Relación Materias
IdMateria Clave Nombre
Creditos
1
8807 Estructuras de Datos I
8
2
8821 Bases de Datos I
6
3
8011 Matemáticas IV
4
4
8927 Bases de Datos I
8
5
8806 Programación II
10
6
8126 Bioingeniería
10
relación InasistAlum
IdAlumno
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
select distinct IdAlumno from InasistAlum where
En vez de:
select * from Materias where creditos>=6 and creditos<=8
Se busca que SQL se parezca más al lenguaje natural para facilidad del
usuario
Ing. Felipe Alanís González -ITD-
19
MySQL
fecha between '2001/03/06' and '2001/03/08'
Puede escribirse:
select * from Materias where creditos between 6 and 8
Fund. Bases de Datos
18
select distinct IdAlumno from InasistAlum where
VisualFox
fecha between ctod('06/03/2001' ) and ctod('08/03/2001')
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
20
4.2 Estructura Básica
4.2 Estructura Básica
Alumnos
Operador LIKE
Es útil cuando no es posible resolver consultas aunque
los atributos tengan dominio atómicos.
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)
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
IdAlumno
1
2
3
4
5
6
7
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
20/03/1979
11/04/1980
24/09/1981
CURP
LP11
AA22
MM33
JB44
RH99
OY88
HH66
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.
21
4.2 Estructura Básica
Relación Materias
Maestros
CURP
X11
A22
T44
RH99
B33
F77
Colonia
Centro
Del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Centro
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).
4.2 Estructura Básica
IdMaestro
1
2
3
4
5
6
Calle
Zarco 123
Negrete 1002
Fresno 1410
Patoni 100
Aquiles Serdán 1102
Victoria 345
Juárez 543
Nombre
Xavier Lopez Chabelo
Aristóteles
Tchaikovski
Robin Hood
Botticelli Sandro
Fernández José Ramón
Calle
Templo Atenea 111
Coliseo 122
Insurgentes 1000
Aquiles Serdán 1102
Cataluña 343
Coapa 3221
IdMateria
1
2
3
4
5
6
FechaNac
17/12/1961
20/11/1965
03/05/1964
20/03/1979
29/03/1963
31/07/1953
Clave
8807
8821
8011
8927
8806
8126
Nombre
Creditos
Estructuras de Datos I
8
Bases de Datos I
6
Matemáticas IV
4
Bases de Datos I
8
Programación II
10
Bioingeniería
10
MySQL
select * from Maestros where Calle like 'C%'
select * from Materias where nombre like '%datos%'
select * from Materias where nombre like '%DATOS%'
select Nombre from Maestros where Nombre like '_o%'
VisualFox
select * from Materias where lower(nombre) like '%datos%'
select * from Materias where upper(nombre) like '%DATOS%'
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
24
4.2 Estructura Básica
4.2 Estructura Básica
Alumnos
IdAlumno
1
2
3
4
5
6
7
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atomic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Domicilio
Zarco 123, Centro
Negrete 1002, Fracc. Del Lago
Fresno 1410, Col. Real del Prado
Patoni 100, Centro
Aquiles Serdán 1102, Col. Nueva Vizcaya
Victoria 345, Centro
Calle Real # 300 Int. 1 Col. Loma Dorada
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
20/03/1979
11/04/1980
24/09/1981
Alumnos
CURP
LP11
AA22
MM33
JB44
RH99
OY88
HH66
IdAlumno
1
2
3
4
5
6
7
Encontrar los nombres de los alumnos que viven en la calle “Real”.
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atom ic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Calle
Zarco
Negrete
Fresno
Patoni
Aquiles Serdán
Victoria
Real
NumExt
123
1002
1410
100
1102
345
300
NumInt
B
1
Colonia
Centro
Fracc. del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Loma Dorada
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
20/03/1979
11/04/1980
24/09/1981
CURP
LP11
AA22
MM33
JB44
RH99
OY88
HH66
select nombre from Alumnos where calle='Real'
select nombre from Alumnos where domicilio like '%Real%'
El resultado de esta
consulta no es
satisfactorio.
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.
4.2 Estructura Básica
Cláusula Order by
4.2 Estructura Básica
Cláusula Order by
Alumnos
Alumnos
IdAlumno
1
2
3
4
5
6
7
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atom ic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Calle
Zarco
Negrete
Fresno
Patoni
Aquiles Serdán
Victoria
Real
NumExt
123
1002
1410
100
1102
345
300
NumInt
B
1
Colonia
Centro
Fracc. del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Loma Dorada
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
20/03/1979
11/04/1980
24/09/1981
CURP
LP11
AA22
MM33
JB44
RH99
OY88
HH66
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
IdAlumno
1
2
3
4
5
6
7
Control
98042151
97041587
97043014
96042121
96044350
97111432
98042012
Nombre
Pato Lucas
Atom ic Ant
Mickey Mouse
Johnny Bravo
Robin Hood
Oso Yogui
Hércules
Calle
Zarco
Negrete
Fresno
Patoni
Aquiles Serdán
Victoria
Real
NumExt
123
1002
1410
100
1102
345
300
NumInt
B
1
Colonia
Centro
Fracc. del Lago
Real del Prado
Centro
Nueva Vizcaya
Centro
Loma Dorada
FechaNac
07/02/1981
24/03/1982
23/06/1981
31/03/1982
20/03/1979
11/04/1980
24/09/1981
CURP
LP11
AA22
MM33
JB44
RH99
OY88
HH66
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.
4.3 Funciones de Agrupación
4.3 Funciones de Agrupación
Operan sobre grupos de tuplas.
Funciones:
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-
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 relación resultante aparecerá una tupla por
cada grupo formado.
29
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
30
4.3 Funciones de Agrupación
4.3 Funciones de Agrupación
Número de alumnos que vive en cada colonia.
Contar el número de materias
select colonia,count(*) from Alumnos group by colonia
select count(*) from Materias
select count(nombre) from Materias
select count(creditos) from Materias
Número de tuplas de cada grupo
(en este caso con la misma
colonia).
Contar el número distinto de créditos de las materias
Relación de los motivos de inasistencia y el total de
inasistencias por cada motivo ordenada en forma
descendente por el total.
select count(distinct creditos) from Materias
No llevan group by, por lo que solo
formará un grupo (con todas las tuplas).
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
31
select motivo,count(*) from InasistAlum
group by motivo order by 2 desc
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
32
4.3 Funciones de Agrupación
4.3 Funciones de Agrupación
Igual a la anterior (que se muestra aquí abajo) pero en la
relación resultante solo incluir los motivos mayores a 1
inasistencia.
select motivo,count(*) from InasistAlum
group by motivo order by 2 desc
select IdAlumno,month(fecha) as mes,count(*) as faltas
from InasistAlum where motivo="Deportes"
group by IdAlumno,mes order by faltas desc
select motivo,count(*) as faltas from InasistAlum
group by motivo order by faltas desc
having faltas>1
Ing. Felipe Alanís González -ITD-
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 motivo,count(*) from InasistAlum
group by motivo order by 2 desc
having count(*)>1
Fund. Bases de Datos
Número de inasistencias en total de cada alumno.
33
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
34
4.3 Funciones de Agrupación
4.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.
relación InasistAlum
IdAlumno
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
Relación RESULTANTE
TotDias
TotFaltas IdAlumno
4
4
1
1
3
3
1
1
4
select IdAlumno, count(distinct fecha) as TotDias,
count(*) as TotFaltas
from InasistAlum group by IdAlumno
order by TotDias desc,TotFaltas desc
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
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
36
4.4 Consultas sobre Múltiples Tablas
4.4.1 Subconsultas
Diferencia
4.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.
Π Alumnos.control
(σAlumnos.curp=Temporal.curp(Alumnos X
ρTemporal(Πcurp(Alumnos) -
Πcurp(Maestros))))
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
Como en el Núcleo de SQL Estándar no se permiten subconsultas
en from, para apegamos a la expresión en Algebra Relacional del
problema anterior, se puede enviar la primera relación resultante a
una tabla temporal.
La consulta siguiente está expresada en Visual Fox:
Subconsulta
select curp from Alumnos ;
where curp not in (select curp from Maestros) ;
into dbf Temp
select Alumnos.control from Alumnos,Temp ;
where Alumnos.curp=Temp.curp
drop table Temp
37
4.4.1 Subconsultas
4.4.1 Subconsultas
Diferencia
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)
A continuación 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 expresión resultará en todas las personas
que no son maestros (no solo los alumnos)
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
39
4.4.1 Subconsultas
4.4.1 Subconsultas
Encontrar el número de créditos mayor de la relación
materias.
Si no tuvieramos: select max(creditos) from Materias
Desde luego lo mejor es usar funciones de agrupación
(que acabamos de estudiar páginas atrás):
select max(creditos) from Materias
Probablemente trataríamos de apegarnos a la expresión:
Y para obtener los nombres y claves de las materias con
mayor número de creditos, la expresión en SQL sería
simple:
Π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)
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
select nombre,clave from Materias
where creditos in (select max(creditos) from Materias)
41
4.4.1 Subconsultas
4.4.1 Subconsultas
Operador in
Intersección
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)
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
43
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 jovenes 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-
44
4.4.1 Subconsultas
4.4.1 Subconsultas
Operadores para comparación de Conjuntos
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)
Consulta:
select distinct creditos from Materias
where creditos>=all (select creditos from Materias)
x >=all y significa: el
atributo x sea mayor o
igual
a
todos
los
elementos del conjunto y
Fund. Bases de Datos
select clave,nombre from Materias
where creditos<=all (select creditos from Materias)
>all no produciría ningún
resultado (en esta consulta
particular) ya que no hay
un valor mayor a sí mismo.
Ing. Felipe Alanís González -ITD-
Obtener las claves y nombres de las materias con
menor número de créditos:
45
Fund. Bases de Datos
División
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 valor
del atributo x sea mayor al
menos a uno de los elementos
del conjunto y
Ing. Felipe Alanís González -ITD-
46
4.4.1 Subconsultas
4.4.1 Subconsultas
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
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
temp1 ← ΠR1-R2(r1)
temp2 ← temp1 X r2
temp3 ← ΠR1-R2(temp2 − r1)
r1 ÷ r2 ← temp1 − temp3
Ejemplo:
Encontrar la Id de aquellos maestros que han asistido a
todos los cursos de actualización impartidos.
47
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
48
4.4.1 Subconsultas
4.4.1 Subconsultas
División
División
Puede escribirse un programa, utilizando código SQL, en el lenguaje del DBMS
(Este ejemplo es de Visual Fox):
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
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
49
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
Fund. Bases de Datos
4.4.1 Subconsultas
División
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
Ing. Felipe Alanís González -ITD-
50
4.4.1 Subconsultas
División
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
close all
drop table r1
drop table r2
drop table temp1
drop table temp2
drop table temp3
drop table temp4
51
Fund. Bases de Datos
Se crea el programa con
MODIFY COMMAND
<nombre> .....
........ y se ejecuta con
DO <nombre>
Ing. Felipe Alanís González -ITD-
52
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
Relación Horarios
IdHorario IdGrupo Dia Hora1 Hora2 Salon
1
1
L 16:00 17:00
T1
2
1
Ma 16:00 17:00
T1
3
1
Mi 16:00 17:00
T1
4
1
J 16:00 17:00
T1
5
2
L 17:00 18:00
T1
6
2
Ma 17:00 18:00
T1
7
2
Mi 17:00 19:00
LC2
8
2
J 17:00 18:00
T1
9
2
V 17:00 18:00
T1
10
3
L 10:00 11:00
S4
11
3
Ma 10:00 11:00
S4
12
3
Mi 10:00 11:00
S4
13
3
J 10:00 11:00
S4
14
3
V 10:00 11:00
S4
15
4
J 07:00 10:00
T7
16
4
V 07:00 10:00
T7
17
5
V 07:00 11:00
T9
Relación
DiasLaborables
Dia
L
Ma
Mi
J
V
select * from Alumnos inner join InasistAlum
on 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
4.4.2 Operadores JOIN
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.
select * from Alumnos left outer join InasistAlum
on 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.
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
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
56
4.4.2 Operadores JOIN
4.4.2 Operadores JOIN
Grupos
IdGrupo
1
2
3
4
5
6
7
8
IdMateria IdPeriodo Paquete
5
5
4B
2
5
4Z
3
3
6X
3
1
6X
4
7
3C
4
7
3D
1
2
3X
1
2
3Y
IdGpoMae IdGrupo IdMaestro
1
2
3
4
7
6
Horario
L Ma Mi J V S 7-9 T9
L Ma Mi J V S 9-11 T4
L Ma Mi J 10-11 T1
L Ma J V 11-12 T5
L Mi J V 7-8 T1
L Mi J V 16-17 T10
L Ma Mi J 10-11 T1
L Ma Mi J 9-10 T9
select IdMaestro,IdMateria,IdPeriodo,Paquete,Horario
from Grupos,GposMaes
where Grupos.IdGrupo=GposMaes.IdGrupo
Maestros
GposMaes
1
2
3
4
5
6
Maxalum
35
30
30
35
35
30
25
25
2
2
1
5
6
2
IdMaestro
1
2
3
4
5
6
Nombre
Xavier Lopez Chabelo
Aristóteles
Tchaikovski
Robin Hood
Botticelli Sandro
Fernández José Ramón
Domicilio
Templo ……
Coliseo ……
Insurgentes ….
Aquiles …..
Cataluña …
Coapa …
FechaNac
17/12/1961
20/11/1965
03/05/1964
20/03/1979
29/03/1963
31/07/1953
CURP
X11
A22
T44
RH99
B33
F77
select IdMaestro,IdMateria,IdPeriodo,Paquete,Horario
from Grupos left join GposMaes
on 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.
4.5 Vistas
4.4.2 Operadores JOIN
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.
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
59
La creación de vistas permite al DBA, mostrar al usuario los datos
que requiere en la forma más conveniente de acuerdo al nivel de
cada persona.
Se crean a partir de expresiones de consulta, por lo tanto, son
consultas.
Las tablas deben estar agrupadas en una base de datos, por lo
que hay que usar create/open database, create/add table.
Ejemplos:
en Visual Fox se debe
escribir create sql
view
create view FaltasAlumnos as
select control,paterno,materno,nombre,fecha,hora,motivo
from InasistAlum,Alumnos
where InasistAlum.IdAlumno=Alumnos.IdAlumno
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
60
Una vista como esta
hace innecesario el
producto natual, ya
que cuando deseemos
combinados los
Como una vista es una consulta y lasverconsultas
son
datos de las tablas
relaciones, pueden usarse como tales
dentro de
Alumnos e
otra expresión SQL.InasistAlum, solo
debemos usar la Vista
FaltasAlumnos como si
select * from FaltasAlumnos
fuera una tabla
4.5 Vistas
4.5 Vistas
select nombre,paterno,fecha from FaltasAlumno
where hora='16:00'
create view ResumenFaltasAlumnos as
select control,paterno,materno,nombre,count(*) as total
from FaltasAlumnos
group by control order by total desc
Cuando se abre una vista, en ese momento se realiza
la consulta correspondiente.
La ventaja más grande de las vistas es que simplifican
el esquema a los usuarios.
select * from FaltasAlumnos order by control
where motivo=“Injustificada”
Fund. Bases de Datos
Se pueden crear vistas sobre vistas para resumir datos:
Ing. Felipe Alanís González -ITD-
61
4.5 Vistas
Un buen esquema para datos de maestros y alumnos podría ser el siguiente, pero
para manipular más fácilmente los dayos, conviene crear vistas adecuadas para
reunir los atributos de personas con alumnos y personas con maestros.
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
62
4.5 Vistas
A los usuarios de la BD sería mas sencillo ver los datos y manipularlos
de la siguiente forma:
Tabla PERSONAS
IdPersona
1
2
3
4
5
6
7
8
9
10
Nombre
Parejita
Johannes
Benito
Luis
Padre
José
Lorena
Aristóteles
Pyotr Ilich
Sandro
Apellidos
López
Gutenberg
Juárez
Pasteur
Abraham
Revueltas
Ochoa
De Tesalónica
Tchaikovski
Botticelli
Tabla ALUMNOS
IdAlumno
1
2
3
4
5
Control
98040151
97040587
97040014
96040121
98040150
EscuelaProcede
Prepa PUMAS
Palacio Nacional
Colegio Vizcaya
LPGA
Colegio Alemán
Fund. Bases de Datos
Calle
Zarco
Negrete
Patoni
Patoni
Oriente
Negrete
Fresno
Pino Suárez
Zaragoza
Juárez
Numero
123
650
100
234
347
1002
1410
542
471
870
FechaNac
07-02-1981
12-01-1901
31-03-1982
20-03-1850
11-04-1890
24-03-1982
23-06-1981
23-07-1905
13-08-1920
07-09-1919
Teléfono
819-27-37
823-15-00
800-25-25
818-04-11
818-98-75
803-17-13
800-06-06
801-00-00
874-65-02
830-77-55
Tabla MAESTROS
GradoEstudios
IdPersona IdMaestro RFC
1
PP11
Doctorado
1
2
AA00
Licenciatura
3
3
AA11
Licenciatura
6
4
GG22
Maestría
7
5
TT44
Maestría
2
6
BB99
Maestría
Ing. Felipe Alanís González -ITD-
CURP
L1
G2
J4
P1
A0
R7
O1
A1
T4
B9
Sueldo
15,000
12,000
12,500
13,000
25,000
20,000
IdPersona
4
5
8
2
9
10
63
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 (aunque fuera alumno de maestría y
profesor de licenciatura).
Algunos DBMS’s incluso permiten a los usuarios hacer modificaciones a través de las vistas
Más sencillo para el usuario ya que los atributos los tiene en sola “tabla”.
Ideal para el DBA ya que puede diseñar correctamente.
4.6 Manipulación de la Base de Datos
4.5 Vistas
Comandos de DDL: CREATE DATABASE, OPEN DATABASE,
CREATE TABLE, ADD TABLE, ALTER TABLE, etc.
Un subesquema más sencillo aún, sería:
create database Escuela
Nombre de la Base de Datos
create table Alumnos (
IdAlumno int auto_increment primary key,
control char(8) unique,
curp char(18) unique)
El DBMS
paterno char(20),
impedirá que se
materno char(20),
añadan tuplas
nombre char(20),
con valores
calle char(15),
iguales en las
numeroExt numeric(8),
llaves “unique”
numeroInt char(6),
y “primary”
colonia char(15),
fechaNac date )
Fund. Bases de Datos
4.6 Manipulación de la Base de Datos
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
66
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),
IdAlumno e
horasTeori numeric(2),
IdMateria
son
horasPrac numeric(2))
foreign keys
(llaves foráneas)
create table Califics (
IdAlumno int references Alumnos,
IdMateria int references Materias,
oport char(1),
resultado numeric(3),
primary key (IdAlumno,IdMateria))
Ing. Felipe Alanís González -ITD-
Para Visual Fox
use
control+claveMat
tag calific
67
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 tutor
select * from Alumnos
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
68
4.6 Manipulación de la Base de Datos
4.6 Manipulación de la Base de Datos
relación InasistAlum
INSERT (Añadir tuplas).
IdAlumno
insert into <tabla> values (<lista de valores>)
1
1
1
1
3
3
3
4
Materias
IdMateria
1
2
3
4
5
6
Clave
1810
1533
1001
1805
1806
1813
Nombre
Estructuras de Datos
Inv. De Operaciones II
Matemáticas I
Probabilidad y Estadística
Programación orientada a objetos
Fundamentos de Bases de Datos
Creditos
10
8
8
6
8
8
HorasTeo
4
4
4
3
3
4
HorasPra
2
0
0
0
2
0
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
delete from <relación> where <expresión>
Ejemplo:
Eliminar la inasistencias de los alumnos que tuvieron solo una
Ejemplo:
insert into Materias values ( 7,'1215', 'Dibujo',4,0,4 )
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
69
delete from InasistAlum where IdAlumno in
(select IdAlumno from InasistAlum
group by IdAlumno having count(*)=1)
Fund. Bases de Datos
4.6 Manipulación de la Base de Datos
Ing. Felipe Alanís González -ITD-
Califics
relación InasistAlum
IdAlumno
Clave
1810
1533
1001
1805
1806
1813
Nombre
Estructuras de Datos
Inv. De Operaciones II
Matemáticas I
Probabilidad y Estadística
Programación orientada a objetos
Fundamentos de Bases de Datos
Creditos
10
8
8
6
8
8
HorasTeo
4
4
4
3
3
4
HorasPra
2
0
0
0
2
0
Update <relación>
set <expresión asignación> where <condición>
update Materias
set creditos=HorasTeo*3+HorasPra*2
where clave like '18%'
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
70
4.6 Manipulación de la Base de Datos
Materias
IdMateria
1
2
3
4
5
6
Si su DBMS no soporta esta
sintáxis, hay que guardar la
subconsulta en una tabla
temporal para poder
completarla
71
1
1
1
1
3
3
3
4
Fecha
Hora
Motivo
05/03/2001
06/03/2001
07/03/2001
08/03/2001
01/03/2001
01/03/2001
01/03/2001
09/03/2001
16:00
16:00
16:00
16:00
09:00
10:00
11:00
16:00
Deportes
Enfermedad
Injustificada
Injustificada
Enfermedad
Injustificada
Injustificada
Enfermedad
IdAlumno IdMateria
1
1
1
2
1
5
2
1
2
3
2
4
3
1
3
2
3
3
4
2
4
5
4
6
5
1
6
2
6
4
7
2
update Califics
set resultado = resultado - 1
where IdAlumno in
(select IdAlumno from InasistAlum
group by IdAlumno having count(*)>2)
Fund. Bases de Datos
Ing. Felipe Alanís González -ITD-
Result
100
90
77
100
98
0
87
99
76
100
90
80
88
66
82
100
72
Descargar