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