Sei sulla pagina 1di 18

Unidad 4 Introduccin a SQL

4.1 Introduccin. 4.2 Estructura bsica (SELECT, WHERE). 4.3 Funciones de agrupacin (GROUP BY, HAVING). 4.4 Consultas sobre mltiples tablas. 4.4.1 Subconsultas. 4.4.2 Operadores JOIN. 4.5 Vistas. 4.6 Manipulacin de la base de datos (INSERT, UPDATE, DELETE).
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD1

4.1 Introduccin
SQL es ms amigable para el usuario, a diferencia de Algebra Relacional, Aunque est basado principalmente en l. Es el lenguaje comercial ms popular. Es el lenguaje estndar 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 Alans Gonzlez -ITD2

4.1 Introduccin SQL ha sido tan popular, que aunque es uno ms 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.
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD3

4.2 Estructura Bsica


Una consulta en SQL consta de tres clusulas: select, from y where

Select

X From Where

No confundamos select con la operacin seleccionar del lgebra relacional, de hecho la discrepancia es un error desde la creacin de SQL.

Select A1, A2, ..... An from r1, r2, ...., rm where P


Equivale a:

A , A , .... A
1 2
Fund. Bases de Datos

P ( r1 X r2 X .... X rm ) )
4

Ing. Felipe Alans Gonzlez -ITD-

4.2 Estructura Bsica


relacin InasistAlum
IdAlumno Fecha Hora Motivo

4.2 Estructura Bsica


Deportes Enfermedad Injustificada Injustificada Enfermedad Injustificada Injustificada Enfermedad
relacin 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 FechaNac 07/02/1981 24/03/1982 23/06/1981 31/03/1982 CURP LP11 AA22 MM33 BJ44

1 1 1 1 3 3 3 4

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

Fund. Bases de Datos

hora='16:00'

(InasistAlum)

Pruebe estas consultas en cualquier un DBMS (por ejemplo Visual Fox, Access, MySQL, etc)

nombre,curp(Alumnos)
select nombre,curp from Alumnos

select * from InasistAlum where hora='16:00'


Ing. Felipe Alans Gonzlez -ITD5

4.2 Estructura Bsica


relacin InasistAlum
IdAlumno Fecha Hora Motivo IdAlumno Fecha

4.2 Estructura Bsica


relacin InasistAlum
Hora Motivo

1 1 1 1 3 3 3 4

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

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 Alans Gonzlez -ITD7

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 Alans Gonzlez -ITD8

4.2 Estructura Bsica


relacin InasistAlum
IdAlumno Fecha Hora Motivo

4.2 Estructura Bsica


relacin 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 FechaNac 07/02/1981 24/03/1982 23/06/1981 31/03/1982 CURP LP11 AA22 MM33 BJ44

1 1 1 1 3 3 3 4

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

relacin InasistAlum
IdAlumno Fecha Hora Motivo

Pruebe la expresin de abajo y lea la explicacin de la pgina 12

IdAlumno( hora'12:00' (InasistAlum) )


select IdAlumno from InasistAlum where hora<='12:00' select distinct IdAlumno from InasistAlum where hora<='12:00'
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD9

1 1 1 1 3 3 3 4

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 nombre,fecha from (select IdAlumno,nombre from Alumnos),InasistAlum where hora='16:00' and Alumnos.IdAlumno=InasistAlum.IdAlumno

4.2 Estructura Bsica


relacin 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 FechaNac CURP 07/02/1981 LP11 24/03/1982 AA22 23/06/1981 MM33 31/03/1982 BJ44 relacin InasistAlum
IdAlumno Fecha Hora Motivo

4.2 Estructura Bsica


Anidamientos como los anteriores (producto cartesiano de subconsultas) y muchas variantes ms de SQL, no cumplen con el SQL Standard Core (Ncleo del SQL estndar). Conviene usar nicamente expresiones que cumplan con el Ncleo del Estndar para conservar la portabilidad. Muchos DBMSs cumplen con el estndar, pero por mercadotecnia, aaden una serie de variantes que no necesariamente tendrn otros DBMSs. Puede verificar sus expresiones en la siguiente liga:

Pruebe la expresin de abajo y lea la explicacin de la pgina 12

nom bre,fech a( Alu m no s.IdAlu m n o =InasistAlu m .Id Alum n o


( IdAlumno,nombre(Alumnos) X
select nombre,fecha from (select IdAlumno,nombre from Alumnos), (select * from InasistAlum where hora='16:00') where Alumnos.IdAlumno=InasistAlum.IdAlumno

1 1 1 1 3 3 3 4

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)))

http://developer.mimer.se/validator/parser200x/index.tml O puede ver una lista de las caractersticas del Ncleo de SQL Estndar en: http://developer.mimer.se/validator/parser200x/core-sql-200x.tml
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD12

relacin ALUMNOS
IdAlumno 1 2 3 4 Control 98042151 97041587 97043014 96042121

4.2 Estructura Bsica


Domicilio Zarco 123 Negrete 1002 Fresno 1410 Patoni 100
IdAlumno

4.2 Estructura Bsica


FechaNac 07/02/1981 24/03/1982 23/06/1981 31/03/1982
Hora

Nombre Pato Lucas Atomic Ant Mickey Mouse Johnny Bravo

CURP LP11 AA22 MM33 BJ44


Motivo

Relacin Materias
IdMateria 1 2 3 4 5 Clave 8807 8821 8011 8927 8806 Nombre Estructuras de Datos I Bases de Datos I Matemticas IV Bases de Datos I Programacin II

relacin InasistAlum
Fecha

nombre,fecha( hora='16:00'Alumnos.IdAlumno=InasistAlum.IdAlumno

1 1 1 1 3 3 3 4

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

Materias.nombre (Materias.nombre=Mat2.nombreMaterias.IdMateriaMat2.IdMateria (
Materias X

Mat2(Materias)

) )

( 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


Esta alternativa es la mejor ya que es la mas simple para el usuario ... adems cumple con el Ncleo de SQL estndar

select distinct Materias.nombre from Materias, Materias Mat2 where Materias.nombre=Mat2.nombre and Materias.IdMateria<>Mat2.IdMateria
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD-

Renombrar

14

4.2 Estructura Bsica


relacin 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 Hrcules Domicilio Zarco 123 Negrete 1002 Fresno 1410 Patoni 100 Aquiles Serdn 1102 Victoria 345 Juarez 543 Colonia Centro Del Lago Real del Prado Centro Nueva Vizcaya Centro Centro

4.2 Estructura Bsica


relacin 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 Hrcules Domicilio Zarco 123 Negrete 1002 Fresno 1410 Patoni 100 Aquiles Serdn 1102 Victoria 345 Juarez 543 Colonia Centro Del Lago Real del Prado Centro Nueva Vizcaya Centro Centro

Alumnos.nombre,Alumnos.domicilio
(Alumnos.colonia=Alum2.coloniaAlumnos.IdAlumnoAlum2.IdAlumnoAlum2.control='96042121' (AlumnosXAlum2(Alumnos)))
select Alumnos.nombre,Alumnos.domicilio from Alumnos,(select * from Alumnos Alum2 where control='96042121') where Alumnos.colonia=Alum2.colonia and Alumnos.IdAlumno<>Alum2.IdAlumno
(

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

A lu m 2 ( A lu m n o s ) ) )

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 expresin cumple con el Ncleo de SQL estndar

no cumple con el Ncleo de SQL estndar ...

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 Hrcules

4.2 Estructura Bsica


Calle Zarco 123 Negrete 1002 Fresno 1410 Patoni 100 Aquiles Serdn 1102 Victoria 345 Jurez 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 Bsica

Maestros
IdMaestro 1 2 3 4 5 6 CURP X11 A22 T44 RH99 B33 F77 Nombre Xavier Lopez Chabelo Aristteles Tchaikovski Robin Houd Botticelli Sandro Fernndez Jos Ramn Calle Templo Atenea 111 Coliseo 122 Insurgentes 1000 Aquiles Serdn 1102 Catalua 343 Coapa 3221 FechaNac 17/12/1961 20/11/1965 03/05/1964 20/03/1979 29/03/1963 31/07/1953

Pruebe la expresin de consulta de la pgina anterior aadiendo 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

nombre,dianac(mesnac=3(Alumnos)) nombre,dianac(mesnac=3(Maestros))
Los DBMSs cuentan con atributos tipo fecha, por lo que hay funciones que usar una , day, month year pueden variar en funcin para obtener por separado cada una de las partes de la fecha:
cada DBMS Los nombres de las

select nombre,day(FechaNac) from Alumnos where month(FechaNac)=3 union select nombre,day(FechaNac) from Maestros where month(FechaNac)=3

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

18

4.2 Estructura Bsica


El Operador BETWEEN permite simplificar consultas que contienen una clusula where que especifica que cierto atributo se encuentre dentro de un rango de valores. Relacin Materias IdMateria Clave Nombre Creditos 1 8807 Estructuras de Datos I 8 2 8821 Bases de Datos I 6 3 8011 Matemticas IV 4 4 8927 Bases de Datos I 8 5 8806 Programacin II 10 6 8126 Bioingeniera 10

4.2 Estructura Bsica


relacin InasistAlum
IdAlumno Fecha Hora Motivo

1 1 1 1 3 3 3 4

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

En vez de:

select distinct IdAlumno from InasistAlum where fecha between '2001/03/06' and '2001/03/08' select distinct IdAlumno from InasistAlum where

MySQL

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 ms al lenguaje natural para facilidad del usuario
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD19

VisualFox

fecha between ctod('06/03/2001' ) and ctod('08/03/2001')


Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD20

4.2 Estructura Bsica


Operador LIKE

4.2 Estructura Bsica

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 Hrcules Calle Zarco 123 Negrete 1002 Fresno 1410 Patoni 100 Aquiles Serdn 1102 Victoria 345 Jurez 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

Es til cuando no es posible resolver consultas aunque los atributos tengan dominio atmicos. Se aplica a atributos char empleando los smbolos % y _ para representar secciones del valor del atributo.
Caracter % (representa una subcadena de cualquier tamao dentro del valor del atributo) Caracter _ (representa a cualquier carcter dentro del valor del atributo)
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD21

Encontrar a los alumnos que tienen un nmero 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 sera resuelta tan fcilmente si el atributo control fuera de tipo numrico.

4.2 Estructura Bsica

4.2 Estructura Bsica


Relacin Materias
IdMateria 1 2 3 4 5 6 Clave 8807 8821 8011 8927 8806 8126 Nombre Creditos Estructuras de Datos I 8 Bases de Datos I 6 Matemticas IV 4 Bases de Datos I 8 Programacin II 10 Bioingeniera 10

Maestros
IdMaestro 1 2 3 4 5 6 CURP X11 A22 T44 RH99 B33 F77 Nombre Xavier Lopez Chabelo Aristteles Tchaikovski Robin Hood Botticelli Sandro Fernndez Jos Ramn Calle Templo Atenea 111 Coliseo 122 Insurgentes 1000 Aquiles Serdn 1102 Catalua 343 Coapa 3221 FechaNac 17/12/1961 20/11/1965 03/05/1964 20/03/1979 29/03/1963 31/07/1953

MySQL

select * from Maestros where Calle like 'C%' select Nombre from Maestros where Nombre like '_o%'

select * from Materias where nombre like '%datos%' select * from Materias where nombre like '%DATOS%'

VisualFox
select * from Materias where lower(nombre) like '%datos%' select * from Materias where upper(nombre) like '%DATOS%'
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD24

4.2 Estructura Bsica

4.2 Estructura Bsica

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 Hrcules Domicilio Zarco 123, Centro Negrete 1002, Fracc. Del Lago Fresno 1410, Col. Real del Prado Patoni 100, Centro Aquiles Serdn 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 CURP LP11 AA22 MM33 JB44 RH99 OY88 HH66

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 Hrcules Calle Zarco Negrete Fresno Patoni Aquiles Serdn Victoria Real NumExt 123 1002 1410 100 1102 345 300 NumInt 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

Encontrar los nombres de los alumnos que viven en la calle Real.

select nombre from Alumnos where calle='Real'


Los esquemas que cuentan con todos los atributos con dominio atmico, facilitan la obtencin de consultas precisas. Observe que no se requiere usar LIKE.

select nombre from Alumnos where domicilio like '%Real%'


El resultado de esta consulta no es satisfactorio.

4.2 Estructura Bsica

Clusula Order by
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 Hrcules Calle Zarco Negrete Fresno Patoni Aquiles Serdn Victoria Real NumExt 123 1002 1410 100 1102 345 300 NumInt 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

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 Hrcules

4.2 Estructura Bsica Clusula Order by


Calle Zarco Negrete Fresno Patoni Aquiles Serdn Victoria Real NumExt 123 1002 1410 100 1102 345 300 NumInt 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 relacin de los alumnos ordenada en base a la colonia.

Obtener una relacin con el domicilio y nombre de los alumnos ordenada en primer lugar por la colonia, en 2 lugar por la calle y por ltimo nmeros exterior e interior.
select Colonia,Calle,NumeroExt,NumeroInt,Nombre from Alumnos order by Colonia,Calle,NumeroExt,NumeroInt
Aada tuplas con colonia y calle iguales para observar el efecto de la expresin.

select * from Alumnos order by Colonia o select * from Alumnos order by 7

4.3 Funciones de Agrupacin


Operan sobre grupos de tuplas. Funciones: Avg(atributo). Calcula la media de los valores de un atributo numrico 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 Alans Gonzlez -ITD29

4.3 Funciones de Agrupacin


Funciones: Sum(atributo). Calcula la suma de todos los valores de un atributo de un grupo de tuplas. Count(atributo) o Count(*). Cuenta el nmero de tuplas que hay en un grupo. Antes de "atributo" puede ir la palabra distinct. Se debe indicar el criterio de agrupacin usando la clusula group by. En la relacin resultante aparecer una tupla por cada grupo formado.
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD30

4.3 Funciones de Agrupacin

4.3 Funciones de Agrupacin


Nmero de alumnos que vive en cada colonia.

Contar el nmero de materias


select colonia,count(*) from Alumnos group by colonia

select count(*) from Materias select count(nombre) from Materias select count(creditos) from Materias

Nmero de tuplas de cada grupo (en este caso con la misma colonia).

Contar el nmero distinto de crditos de las materias


select count(distinct creditos) from Materias

Relacin de los motivos de inasistencia y el total de inasistencias por cada motivo ordenada en forma descendente por el total.
select motivo,count(*) from InasistAlum group by motivo order by 2 desc
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD32

No llevan group by, por lo que solo formar un grupo (con todas las tuplas).
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD31

4.3 Funciones de Agrupacin


Igual a la anterior (que se muestra aqu abajo) pero en la relacin resultante solo incluir los motivos mayores a 1 inasistencia.

4.3 Funciones de Agrupacin


Nmero de inasistencias en total de cada alumno.

select motivo,count(*) from InasistAlum group by motivo order by 2 desc select motivo,count(*) from InasistAlum group by motivo order by 2 desc having count(*)>1 select motivo,count(*) as faltas from InasistAlum group by motivo order by faltas desc having faltas>1
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD33

select IdAlumno,count(*) as faltas from InasistAlum group by IdAlumno order by faltas desc
Nmero de inasistencias de cada alumno por mes, ordenadas de ms 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
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD34

4.3 Funciones de Agrupacin

4.3 Funciones de Agrupacin


Nmero de inasistencias en total de cada alumno y nmero de das en los que tuvo faltas ordenado en primer lugar en base al nmero total de das en los que tuvo faltas.
relacin InasistAlum
IdAlumno Fecha Hora Motivo

1 1 1 1 3 3 3 4

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

Encontrar el nmero mximo de crditos. select max(creditos) from Materias Nmero mnimo de crditos. select min(creditos) from Materias Nmero de crditos promedio de todas las materias. select avg(creditos) from Materias o select sum(creditos)/count(*) from Materias
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD36

Relacin 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

4.4 Consultas sobre Mltiples Tablas


4.4.1 Subconsultas Diferencia La operacin minus era parte del SQL original pero se hizo innecesaria por la incorporacin del operador de conjuntos in (not in se emplea en vez de minus). Ejemplo: Nmeros de Control de alumnos que no son maestros.

4.4.1 Subconsultas Diferencia

Como en el Ncleo de SQL Estndar no se permiten subconsultas en from, para apegamos a la expresin en Algebra Relacional del problema anterior, se puede enviar la primera relacin 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

Alumnos.control
(Alumnos.curp=Temporal.curp(Alumnos X

Temporal(curp(Alumnos) -

curp(Maestros))))
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD37

4.4.1 Subconsultas Diferencia

4.4.1 Subconsultas

Sin embargo no es necesaria la complejidad de la expresin anterior ya que el operador in (usado en este caso con not) nos permite expresar consultas como esa de manera ms simple: select control from Alumnos where curp not in (select curp from Maestros)

A continuacin unos ejemplos ms: 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 expresin resultar en todas las personas que no son maestros (no solo los alumnos)

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

39

4.4.1 Subconsultas

4.4.1 Subconsultas

Encontrar el nmero de crditos mayor de la relacin materias. Si no tuvieramos: select max(creditos) from Materias Probablemente trataramos de apegarnos a la expresin:

Desde luego lo mejor es usar funciones de agrupacin (que acabamos de estudiar pginas atrs): select max(creditos) from Materias Y para obtener los nombres y claves de las materias con mayor nmero de creditos, la expresin en SQL sera simple: select nombre,clave from Materias where creditos in (select max(creditos) from Materias)

creditos(Materias)
- Materias.creditos(Materias.creditos<Materias2.creditos(Materias

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 Alans Gonzlez -ITD41

4.4.1 Subconsultas

4.4.1 Subconsultas

Interseccin
La misma funcin de la operacin intersect se logra mediante el operador de conjuntos in (Aunque algunos DBMSs incluyen intersect por mercadotecnia, no pertenece al Ncleo de SQL Estndar) Encontrar las IdPersona de aquellos maestros que son tambin alumnos. IdPersona(Maestros) IdPersona(Alumnos)

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 ms 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 Alans Gonzlez -ITD44

select IdPersona from Maestros where IdPersona in (select IdPersona from Alumnos)
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD43

4.4.1 Subconsultas

Operadores para comparacin de Conjuntos


Consulta: Encontrar el nmero de crditos mayor de la relacin materias (usando el operador de comparacin de conjuntos all)

4.4.1 Subconsultas
Operadores para comparacin de Conjuntos Consulta: Obtener las claves y nombres de las materias con menor nmero de crditos:
select clave,nombre from Materias where creditos<=all (select creditos from Materias)

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 >all no producira ningn resultado (en esta consulta particular) ya que no hay un valor mayor a s mismo.

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

45

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

46

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)

4.4.1 Subconsultas
Divisin
No existe en el Ncleo de SQL estndar (al menos al momento de escribir estas notas) un operador equivalente a la divisin del Algebra Relacional

x > some y significa: el valor del atributo x sea mayor al menos a uno de los elementos del conjunto y
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD47

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 actualizacin impartidos.
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD48

4.4.1 Subconsultas
Divisin
SQL (Visual Fox):

4.4.1 Subconsultas
Divisin
Puede escribirse un programa, utilizando cdigo SQL, en el lenguaje del DBMS (Este ejemplo es de 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 Alans Gonzlez -ITD49

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 actualizacin impartidos durante cierto perodo @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 Ing. Felipe Alans Gonzlez -ITD50

4.4.1 Subconsultas
Divisin
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
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD51

4.4.1 Subconsultas
Divisin
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>

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

52

4.4.1 Subconsultas Divisin


Modifique el programa anterior para resolver el problema siguiente: Encontrar las Id de los grupos que tienen sesiones todos los das laborables de la semana.

4.4.2 Operadores JOIN


select * from Alumnos inner join InasistAlum on Alumnos.IdAlumno=InasistAlum.IdAlumno

Relacin 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

Relacin DiasLaborables
Dia L Ma Mi J V

inner (interno) es una palabra opcional, join por si solo implica una junta. La expresin 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 tendra sentido, de hecho equivale a join ya que no hay tuplas en InasistAlum que no correspondan a ningn 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 relacin de la izquierda aunque no tengan tuplas correspondientes de la relacin de la derecha. right significa que deben aparecer todas las tuplas de la relacin 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 relacin 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 Alans Gonzlez -ITD56

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 Maxalum 35 30 30 35 35 30 25 25 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

4.4.2 Operadores JOIN

select IdMaestro,IdMateria,IdPeriodo,Paquete,Horario from Grupos,GposMaes where Grupos.IdGrupo=GposMaes.IdGrupo select IdMaestro,IdMateria,IdPeriodo,Paquete,Horario from Grupos left join GposMaes on Grupos.IdGrupo=GposMaes.IdGrupo
Con la consulta con from se obiene una relacin que incluye solo los grupos que tienen profesor asignado, con left join se obtiene una lista de todos los grupos, tengan profesor o no.

GposMaes
IdGpoMae IdGrupo IdMaestro

Maestros
2 2 1 5 6 2
IdMaestro 1 2 3 4 5 6 Nombre Xavier Lopez Chabelo Aristteles Tchaikovski Robin Hood Botticelli Sandro Fernndez Jos Ramn Domicilio Templo Coliseo Insurgentes . Aquiles .. Catalua 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

1 2 3 4 5 6

1 2 3 4 7 6

4.4.2 Operadores JOIN


natural join es una caracterstica que no pertenece al ncleo de SQL estndar .

4.5 Vistas
La creacin de vistas permite al DBA, mostrar al usuario los datos que requiere en la forma ms 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.

Aunque algunos DBMSs lo incluyen como un equivalente al Producto Natural Por lo tanto, hay que usar, como siempre, un producto cartesiano, una seleccin y una proyeccin. Con las Vistas (que veremos posteriormente) se pueden simplificar las consultas sin necesidad de natural join.
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD59

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 Alans Gonzlez -ITD60

Una vista como esta hace innecesario el producto natual, ya que cuando deseemos ver combinados los Como una vista es una consulta y las consultas son datos de las tablas relaciones, pueden usarse como tales dentro de Alumnos e otra expresin SQL. InasistAlum, solo debemos usar la Vista FaltasAlumnos como si select * from FaltasAlumnos fuera una tabla

4.5 Vistas

4.5 Vistas

Se pueden crear vistas sobre vistas para resumir datos: 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 ms grande de las vistas es que simplifican el esquema a los usuarios.

select nombre,paterno,fecha from FaltasAlumno where hora='16:00' select * from FaltasAlumnos order by control where motivo=Injustificada
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD61

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

62

4.5 Vistas
Un buen esquema para datos de maestros y alumnos podra ser el siguiente, pero para manipular ms fcilmente los dayos, conviene crear vistas adecuadas para reunir los atributos de personas con alumnos y personas con maestros.
Tabla PERSONAS
IdPersona 1 2 3 4 5 6 7 8 9 10 Nombre Parejita Johannes Benito Luis Padre Jos Lorena Aristteles Pyotr Ilich Sandro Apellidos Lpez Gutenberg Jurez Pasteur Abraham Revueltas Ochoa De Tesalnica Tchaikovski Botticelli Calle Zarco Negrete Patoni Patoni Oriente Negrete Fresno Pino Surez Zaragoza Jurez 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 Telfono 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 CURP L1 G2 J4 P1 A0 R7 O1 A1 T4 B9

4.5 Vistas A los usuarios de la BD sera mas sencillo ver los datos y manipularlos de la siguiente forma:

Tabla ALUMNOS
IdAlumno 1 2 3 4 5 Control 98040151 97040587 97040014 96040121 98040150 EscuelaProcede Prepa PUMAS Palacio Nacional Colegio Vizcaya LPGA Colegio Alemn

Tabla MAESTROS GradoEstudios IdPersona IdMaestro RFC 1 PP11 Doctorado 1 2 AA00 Licenciatura 3 3 AA11 Licenciatura 6 4 GG22 Maestra 7 5 TT44 Maestra 2 6 BB99 Maestra
Ing. Felipe Alans Gonzlez -ITD-

Sueldo 15,000 12,000 12,500 13,000 25,000 20,000

IdPersona 4 5 8 2 9 10
63

Fund. Bases de Datos

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 maestra y profesor de licenciatura). Algunos DBMSs incluso permiten a los usuarios hacer modificaciones a travs de las vistas Ms sencillo para el usuario ya que los atributos los tiene en sola tabla. Ideal para el DBA ya que puede disear correctamente.

4.6 Manipulacin de la Base de Datos


4.5 Vistas

Un subesquema ms sencillo an, sera:

Comandos de DDL: CREATE DATABASE, OPEN DATABASE, CREATE TABLE, ADD TABLE, ALTER TABLE, etc.

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), aadan 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 Ing. Felipe Alans Gonzlez -ITD66

4.6 Manipulacin 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 forneas) create table Califics ( IdAlumno int references Alumnos, IdMateria int references Materias, oport char(1), resultado numeric(3), primary key (IdAlumno,IdMateria))
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD-

4.6 Manipulacin de la Base de Datos

alter table Alumnos add tutor char (30) select * from Alumnos

alter table Alumnos modify column tutor char(45) select * from Alumnos

Para Visual Fox use control+claveMat tag calific


67

alter table Alumnos drop tutor select * from Alumnos

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

68

4.6 Manipulacin de la Base de Datos


INSERT (Aadir tuplas).

4.6 Manipulacin de la Base de Datos


relacin InasistAlum
IdAlumno Fecha Hora Motivo

insert into <tabla> values (<lista de valores>)


Materias
IdMateria 1 2 3 4 5 6 Clave 1810 1533 1001 1805 1806 1813 Nombre Estructuras de Datos Inv. De Operaciones II Matemticas I Probabilidad y Estadstica Programacin 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

1 1 1 1 3 3 3 4

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 <relacin> where <expresin>


Ejemplo: Eliminar la inasistencias de los alumnos que tuvieron solo una

Ejemplo: insert into Materias values ( 7,'1215', 'Dibujo',4,0,4 )

delete from InasistAlum where IdAlumno in (select IdAlumno from InasistAlum group by IdAlumno having count(*)=1)
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD-

Si su DBMS no soporta esta sintxis, hay que guardar la subconsulta en una tabla temporal para poder completarla
70

Fund. Bases de Datos

Ing. Felipe Alans Gonzlez -ITD-

69

4.6 Manipulacin de la Base de Datos


Materias
IdMateria 1 2 3 4 5 6 Clave 1810 1533 1001 1805 1806 1813 Nombre Estructuras de Datos Inv. De Operaciones II Matemticas I Probabilidad y Estadstica Programacin 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
IdAlumno

4.6 Manipulacin de la Base de Datos


relacin InasistAlum
Fecha Hora Motivo

Califics

1 1 1 1 3 3 3 4

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

Update <relacin> set <expresin asignacin> where <condicin> update Materias set creditos=HorasTeo*3+HorasPra*2 where clave like '18%'
Fund. Bases de Datos Ing. Felipe Alans Gonzlez -ITD71

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 Alans Gonzlez -ITD-

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

Result 100 90 77 100 98 0 87 99 76 100 90 80 88 66 82 100

72

Potrebbero piacerti anche