Você está na página 1de 42

Prctica 3: Lenguaje SQL

1 Parte: Manipulacin de Bases de Datos

Silvia Abraho - DSIC curso 2010/2011

Objetivos
! Presentar ! Ver

la sintaxis del lenguaje SQL (slo del Lenguaje de Manipulacin). algunos ejemplos sencillos para clarificar la semntica del SQL. las bases de datos CICLISMO, MSICA y BIBLIOTECA. de menor a mayor complejidad consultas SQL sobre dichas bases de datos. todo lo anterior usando la herramienta SQL del sistema de gestin de bases de datos ORACLE.

! Presentar ! Realizar ! Realizar

Lenguaje de Manipulacin del SQL


Se presentan las instrucciones que se pueden ejecutar desde un intrprete de SQL, lo que se denomina SQL interactivo. SQL es un lenguaje muy expresivo y, en general, permite muchas formas de expresar las mismas rdenes. Las cuatro instrucciones que componen el lenguaje de manipulacin de datos son las siguientes:
!! SELECT: permite la declaracin de consultas para la recuperacin de informacin de una o ms tablas de una base de datos. !! INSERT: realiza la insercin de una o varias filas sobre una tabla. !! DELETE: permite efectuar el borrado de una o varias filas de una tabla. !! UPDATE: realiza una modificacin de los valores de una o ms columnas de una o varias filas de una tabla.

1.1. Consultas: instruccin SELECT


SELECT [ALL | DISTINCT] comalista_item_seleccionado | * FROM comalista_referencia_tabla [WHERE expresin_condicional] [GROUP BY comalista_referencia_col] [HAVING expresin_condicional] [ORDER BY comalista_referencia_col]
"! "! "! "! "! "!

comalista_item_seleccionado: informacin a obtener de la base de datos. FROM comalista_referencia_tabla: especifica de qu tablas se obtiene la informacin buscada. WHERE expresin_condicional: expresa una condicin que deben cumplir las filas de la consulta resultante. GROUP BY comalista_referencia_col: permite formar consultas agrupadas para extraer informacin global sobre los grupos formados. HAVING expresin_condicional: condicin sobre los grupos formados. ORDER BY comalista_referencia_col: ordena por una o varias columnas.

1.1.1. Condiciones en consultas simples


SELECT [ALL | DISTINCT] comalista_tem_seleccionado | * FROM tabla [WHERE expresin_condicional] [ORDER BY comalista_referencia_col]
"! "! "! "!

ALL : Permite la aparicin de filas idnticas (valor por defecto). DISTINCT: No permite la aparicin de filas idnticas. La expresin_condicional est formada por un conjunto de predicados combinados con las conectivas lgicas AND, OR y NOT. Los predicados utilizados permiten comparar columnas: predicados de comparacin: =, <>, >, <, >=, <=. predicado LIKE: permite comparar una tira de caracteres con un patrn. predicado BETWEEN: permite comprobar si un escalar est en un rango. predicado IN: permite comprobar si el valor est dentro de un conjunto. predicado IS NULL: permite comprobar si el valor es nulo.

Ciclismo
EQUIPO (nom_eq: d_eq, director: d_dir) Clave Primaria: {nom_eq} CICLISTA (dorsal: d_dor, nombre: d_nom, edad: d_edad, nom_eq: d_eq)) Clave Primaria: {dorsal} CAj: {nom_eq} hace referencia a EQUIPO VNN: {nom_eq} ETAPA (netapa: d_n, km: d_km, salida: d_sal, llegada: d_lleg, dorsal: d_dor) Clave Primaria: {netapa} CAj: {dorsal} hace referencia a CICLISTA PUERTO (nombre:d_nom,altura:d_alt,categora:d_cat, netapa:d_n,dorsal: d_dor) Clave Primaria: {nombre} CAj: {netapa} hace referencia a ETAPA CAj: {dorsal} hace referencia a CICLISTA VNN: {netapa} MAILLOT (cdigo: d_cdigo, tipo: d_tipo, premio: d_pre, color: d_col) Clave Primaria: {cdigo} LLEVAR (dorsal: entero, netapa: d_n, cdigo: d_cdigo) Clave Primaria: {netapa, cdigo} CAj: {netapa} hace referencia a ETAPA CAj: {dorsal} hace referencia a CICLISTA CAj: {cdigo} hace referencia a MAILLOT VNN: {dorsal}

Ciclismo
Equipo nomeq director Ciclista dorsal nombre edad Llevar dorsal netapa codigo Maillot codigo tipo premio color

Etapa
netapa km salida llegada dorsal

nomeq

Puerto nompuerto
altura categoria pendiente netapa dorsal

Esquema de Prcticas.

EJEMPLO: Obtener el nombre y la altura de todos los puertos de 1 categora. 1. En qu tablas se encuentra la informacin? 2. Qu condicin deben cumplir las filas resultantes? 3. Que informacin queremos visualizar? 4. Queremos ordenar el resultado por alguna columna?

SELECT nombre, altura FROM Puerto WHERE categoria = 1;

EJEMPLO: Obtener el nombre y la edad de todos los ciclistas.


SELECT nombre, edad FROM Ciclista;

EJEMPLO: Obtener el nombre de los ciclistas cuya edad est entre 20 y 30 aos.
SELECT nombre FROM Ciclista WHERE edad BETWEEN 20 AND 30;

(*) El predicado BETWEEN es equivalente a una condicin con comparaciones de la siguiente forma: exp between exp1 and exp2 ! (exp >= exp1) and (exp <= exp2)

EJEMPLO: Obtener el nmero de las etapas donde el nombre de la ciudad de llegada tenga por segunda letra una O o donde el nombre de la ciudad de salida lleve dos o ms As.
SELECT netapa FROM Etapa WHERE llegada LIKE _O% OR salida LIKE %A%A%;

EJEMPLO: Obtener el nombre de los puertos de 1, 2 o 3 categora. SELECT nompuerto FROM Puerto
WHERE categora IN ( 1, 2, 3 ) ;
(*) Tambin el predicado IN es derivado y la expresin equivalente es: exp in (exp1, exp2, , expn) ! (exp=exp1) or (exp=exp2) oror (exp=expn)

EJEMPLO: Obtener todos los datos de aquellos ciclistas de los que se desconoca su edad.
SELECT * FROM Ciclista WHERE edad IS NULL;

COMPARACIN DE VALORES NULOS


Las comparaciones entre cualquier valor y NULL resultan en indefinido. Ejemplo:

select * from T where atrib1 > atrib2


Si en una fila se diera el caso que atrib1 = 50 y atrib2 fuera nulo, el resultado de la comparacin sera indefinido y por tanto dicha fila no se incluira en la seleccin.

Ejemplo de consulta incorrecta (error de sintaxis) SELECT nomeq FROM Equipo WHERE director = null La consulta correcta sera SELECT nomeq FROM Equipo WHERE director IS NULL

MS EJEMPLOS DE COMPARACIONES
Uso de operadores aritmticos: + (suma), - (diferencia), * (producto), / (divisin), etc. EJEMPLO: Obtener de los maillots el tipo y el premio en dlares (supongamos que est en pesetas) ($1 = 150 ptas.) de aquellos maillots cuyo premio supere los 100 dlares. SELECT tipo, premio / 150 FROM Maillot WHERE premio / 150 > 100;

Uso de LIKE
EJEMPLO: Obtener el nombre y la edad de los ciclistas que pertenezcan a equipos cuyo nombre contenga la cadena 100%. SELECT nombre, edad FROM Ciclista WHERE nomeq LIKE %100\%% ESCAPE \ Se ha utilizado \ para indicar que el carcter comodn tiene su valor %

CONSULTAS DE VALORES AGREGADOS


La sintaxis de una referencia a una funcin agregada es la siguiente: { avg | max | min | sum | count } ( [all | distinct] expresin_escalar ) | count(*)
"! "! "! "! "! "! "!

Las funciones agregadas no se pueden anidar. Para las funciones SUM y AVG los argumentos deben ser numricos. DISTINCT indica que los valores redundantes sean eliminados antes de que se realice el clculo correspondiente. La funcin especial COUNT(*), en la que no est permitido incluir DISTINCT ni ALL, da como resultado el cardinal del conjunto de filas de la seleccin. Los clculos se realizan despus de la seleccin y aplicar las condiciones. Los valores nulos son eliminados antes de realizar los clculos (incl. count). Si el nmero de filas de la seleccin es 0, la funcin COUNT devuelve el valor 0 y las otras funciones el valor nulo.

FUNCIONES AGREGADAS EN CONSULTAS NO AGRUPADAS


EJEMPLO:
SELECT Nm. de ciclistas =, COUNT(*), Media Edad =, AVG(edad) FROM Ciclista WHERE nomeq = Banesto;

En consultas no agrupadas, la seleccin slo podr incluir referencias a funciones agregadas o literales ya que las funciones van a devolver un nico valor. EJEMPLO INCORRECTO:
SELECT nombre, AVG(edad) FROM Ciclista WHERE nomeq = ONCE;

Ejercicios:
Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas sobre una sola relacin de las bases de datos Ciclismo y Msica

CONSULTAS SIMPLES SOBRE VARIAS TABLAS


Cuando la informacin que se desea obtener de la base de datos se encuentra almacenada en ms de una tabla se hace indispensable el declarar una consulta que manipule estas tablas.

EJEMPLO: Obtener pares de nmeros de etapas y nombres de puertos ganados por el mismo ciclista.

1. En qu tablas se encuentra la informacin?


FROM Etapa, Puerto

2. Qu condicin deben cumplir las filas resultantes?


WHERE etapa.dorsal = puerto.dorsal;

3. Qu informacin queremos visualizar?


SELECT etapa.netapa, nompuerto En esta expresin es obligatorio que la referencia a la columna dorsal de Etapa y Puerto sea calificada con el nombre de la tabla, si no es ambigua. ==> SELECT etapa.netapa, nompuerto FROM Etapa, Puerto WHERE etapa.dorsal = puerto.dorsal;

Ejemplo: SELECT * FROM T1, T2 WHERE T1.n = T2.n T1 n


a1 a2 a3 b1 b2 b3 c1 c2

T2 n
d1 b2

T1 x T2 n
X X X "! X X

n
c1 c2 c1 c2 c1 c2 d1 b2 d1 b2 d1 b2

a1 a1 a2 a2 a3 a3

b1 b1 b2 b2 b3 b3

Cont. Consulta en varias tablas


"!

Cuando se va a trabajar con una tabla para hacer consulta entre diferentes tuplas de ella, entonces se utilizan las variables de recorrido

[tabla | variable_recorrido].columna
Es una instancia de la tabla. Es virtual
"!

Por tanto, permiten dar un nombre alternativo a la misma tabla dentro de una consulta. La manera de declarar una variable de recorrido es:

FROM tabla [as] variable_recorrido

10

EJEMPLO: Obtener el nombre de los ciclistas compaeros de equipo de Miguel Indurin que sean ms jvenes que l.

1. En qu tablas se encuentra la informacin?


FROM Ciclista Pero, como se requiere comparar con tuplas de la misma tabla, entonces se necesita tener varias imgenes de ella

FROM Ciclista C1, Ciclista C2

2. Qu condicin deben cumplir las filas resultantes?


WHERE C2.nombre=Miguel Indurin AND C1.nomeq = C2.nomeq AND C1.edad < C2.edad;

3. Qu informacin queremos visualizar?


SELECT DISTINCT C1.nombre ==> SELECT DISTINCT C1.nombre FROM Ciclista C1, Ciclista C2 WHERE C2.nombre=Miguel Indurin AND C1.nomeq = C2.nomeq AND C1.edad < C2.edad;

USO DE CLAVES AJENAS EN CONSULTAS DE VARIAS TABLAS


Si existen claves ajenas, lo normal es que se d una igualdad entre la clave ajena y los atributos correspondientes de la tabla a la que se hace referencia. EJEMPLO: Obtener los nombres de los ciclistas pertenecientes al equipo dirigido por lvaro Pino. SELECT C.nombre FROM Ciclista C, Equipo E WHERE C.nomeq = E.nomeq AND E.director = lvaro Pino; EJEMPLO: Obtener pares nombre de ciclista, nmero de etapa, de tal forma que dicho ciclista haya ganado dicha etapa. Adems la etapa debe superar los 150 km. de recorrido. SELECT C.nombre, E.netapa FROM Ciclista C, Etapa E WHERE C.dorsal = E.dorsal AND E.km > 150;

11

Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas sobre varias tablas de las bases de datos Ciclismo y Msica

CONSULTAS COMPLEJAS: SUBCONSULTAS


Si la informacin que se est buscando est incluida en una tabla y la condicin de bsqueda de esta informacin requiere acceder a otras tablas, entonces tambin se pueden utilizar las subconsultas para expresar este tipo de condiciones. EJEMPLO: Obtener el nombre de los ciclistas compaeros de equipo de Miguel Indurin que sean ms jvenes que l. (Es el mismo enunciado de antes) SELECT C1.nombre FROM Ciclista C1 Tablas que se requieren para el Select precedente WHERE C1.nomeq IN (SELECT C2.nomeq FROM Ciclista C2 WHERE C2.nombre=Miguel Indurin) Se ver ms adelante AND C1.edad < (SELECT C2.edad FROM Ciclista C2 WHERE C2.nombre=Miguel Indurin);

12

EJEMPLO: Obtener los nombres de los ciclistas pertenecientes al equipo dirigido por lvaro Pino.
Antes, se haban usado igualdades: SELECT C.nombre FROM Ciclista C, Equipo E WHERE C.nomeq = E.nomeq AND E.director = lvaro Pino; Usando subconsultas, sera: SELECT C.nombre FROM Ciclista C C.nomeq = (SELECT E.nomeq FROM Equipo E WHERE E.director = lvaro Pino); WHERE

Esto es posible porque la informacin que se requiere, nombre del ciclista, no est en la tabla de la subconsulta (Equipo) y porque la subconsulta

retorna un nico valor.

PREDICADOS QUE ACEPTAN SUBCONSULTAS


Las subconsultas pueden aparecer en las condiciones de bsqueda, como argumentos de algunos predicados, tanto de la clusula WHERE como de la HAVING. Los predicados que pueden llevar como argumentos subconsultas son los siguientes: ! predicados de comparacin (=, <>, >, <, >=, <=). ! IN: comprueba que un valor pertenece a una coleccin dada mediante una subconsulta. ! predicados de comparacin cuantificados (ANY y ALL): permitir comparar un valor con un conjunto de valores. ! MATCH: comprueba si un valor es idntico a algn valor de una coleccin. ! EXISTS: equivalente al cuantificador existencial, comprueba si una subconsulta devuelve alguna fila. ! UNIQUE: comprueba si una subconsulta no devuelve filas repetidas.

13

PREDICADOS DE COMPARACIN (=, <>, >, <, >=, <=)


Cada uno de los dos lados de un predicado de comparacin debe ser una nica tupla formada por el mismo nmero de columnas. Es decir: (A1, A2, !, An) predicado_comparacin (B1, B2, !, Bn) Las subconsultas pueden ser argumentos, siempre y cuando devuelvan una

nica fila y el nmero de columnas coincida en nmero y tipo con el otro lado del predicado de comparacin.
Llamaremos constructor_fila a una lista de atributos entre parntesis o una subconsulta. constructor_fila predicado_comparacin constructor_fila En el caso que la subconsulta est vaca, se convierte a una fila con valores nulos en todas las columnas. Para poder comparar dos constructor_fila de ms de una columna, existe una forma definida de realizar esta comparacin para cada uno de los predicados de comparacin (=, <>, >, <, <=, >=). Pero, en general se vern subconsultas de una nica columna, como el ejemplo anterior.

EJEMPLO: Obtener los nombres de los puertos cuya altura es mayor que la media de altura de los puertos de 2 categora.

1. En qu tablas se encuentra la informacin? Puerto


==> FROM Puerto

2. Qu condicin deben cumplir las filas resultantes?


altura > AVG(altura) de los Puertos de segunda categora Es un valor - una fila ==> WHERE altura > (SELECT AVG(altura) FROM Puerto WHERE categoria = 2 ); Compara cada valor de altura con el valor obtenido en avg(altura)

14

EJEMPLO: Obtener los nombres de los puertos cuya altura es mayor que la media de altura de los puertos de 2 categora. 1. En qu tablas se encuentra la informacin? Puerto
==> FROM Puerto

2. Qu condicin deben cumplir las filas resultantes?


altura > avg(altura) de los Puertos de segunda categora ==> WHERE altura > (SELECT AVG(altura) FROM Puerto WHERE categoria = 2 );

3. Qu informacin queremos visualizar?


nompuerto ==> ==> SELECT nompuerto SELECT nompuerto FROM Puerto WHERE altura > (SELECT AVG(altura) FROM Puerto WHERE categoria = 2 );

Qu hace el siguiente ejemplo? Es correcto?


SELECT nompuerto FROM Puerto 1 columna con n filas

WHERE altura > (SELECT altura FROM Puerto WHERE categoria = 2 );

Es un valor a la vez ==> No puede hacer la comparacin INCORRECTO: (error de ejecucin)

15

Predicado IN
Comprueba que un valor pertenece a una coleccin dada mediante una subconsulta

constructor_fila [not] IN(expresin_tabla) A la derecha de IN puede aparecer ms de una fila y por eso se denomina expresin_tabla. EJEMPLO: Obtener el n de las etapas ganadas por ciclistas con edad superior a los 30 aos.

SELECT netapa FROM Etapa WHERE dorsal IN (SELECT dorsal FROM Ciclista WHERE edad > 30);

Tambin, con IN Encadenadas:

se pueden hacer Subconsultas

EJEMPLO: Obtener el nmero de las etapas ganadas por ciclistas que pertenezcan a equipos cuyo director tenga un nombre que empiece por A. SELECT netapa FROM Etapa WHERE dorsal IN (SELECT dorsal FROM Ciclista WHERE nomeq IN (SELECT nomeq FROM Equipo WHERE director LIKE A%));

16

Predicados de comparacin cuantificados (ALL, ANY)


Permiten comparar un valor con un conjunto de valores.

constructor_fila predicado_comparacin {all | any | some} (expresin_tabla)


! El predicado de comparacin cuantificado con ALL se evala a cierto si lo es para todas las filas de la expresin de tabla (si la tabla est vaca tambin se evala a cierto). ! El predicado de comparacin cuantificado con ANY o SOME se evala a cierto si lo es para alguna fila de la expresin de tabla (si la tabla est vaca se evala a falso).

(*) el predicado IN es idntico al predicado de comparacin cuantificado = ANY.

EJEMPLO: Obtener el nombre de los puertos y de los ciclistas que los hayan ganado que tengan la mayor pendiente.
SELECT P.nompuerto, C.nombre FROM Puerto P, Ciclista C WHERE P.dorsal = C.dorsal AND P.pendiente >= ALL (SELECT P1.pendiente FROM Puerto P1 )

EJEMPLO: Obtener el nombre de los puertos y de los ciclistas que los hayan ganado, cumpliendo que el puerto no sea el que tenga la menor pendiente.
SELECT P.nompuerto, C.nombre FROM Puerto P, Ciclista C WHERE P.dorsal = C.dorsal AND P.pendiente > ANY (SELECT P1.pendiente FROM Puerto P1 )
(*) Cualquier ANY se puede convertir en un ALL cambiando la condicin a su condicin negada y aadiendo un NOT. NOT ( P.pendiente < ALL (SELECT P1.pendiente FROM Puerto P1 ) )

17

Predicado EXISTS
EXISTS (expresin_tabla) !El predicado EXISTS se evala a cierto si la expresin SELECT devuelve al menos una fila. !En general, IN y EXISTS son intercambiables y se pueden eliminar haciendo consultas a mltiples tablas e igualando por claves ajenas.

EJEMPLO: Obtener el nombre de aquellos ciclistas que han llevado un maillot de un premio menor de 120 euros.
SELECT C.nombre FROM Ciclista C, Llevar L WHERE C.dorsal = L.dorsal AND EXISTS (SELECT * FROM Maillot M WHERE M.premio < 120 AND M.codigo = L.codigo)

O bien:
SELECT C.nombre FROM Ciclista C, Llevar L WHERE C.dorsal = L.dorsal AND L.codigo IN (SELECT M.codigo FROM Maillot M WHERE M.premio < 120 )

18

EJEMPLO: Obtener el nombre de los ciclistas que no han ganado etapas.


SELECT nombre FROM Ciclista WHERE NOT EXISTS (SELECT * FROM Etapa WHERE Etapa.dorsal = Ciclista.dorsal); WHERE EXISTS (SELECT * FROM !) equivale a: WHERE 0 < (SELECT COUNT(*) FROM !)

WHERE NOT EXISTS (SELECT * FROM !) equivale a: WHERE 0 = (SELECT COUNT(*) FROM !)

Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas con subconsultas de las bases de datos Ciclismo y Msica

19

Uso de EXISTS para cuantificacin universal (NO HAY EN SQL)

$ X F(X) ! % & X % F(X)


Obtener el nombre de los profesores que imparten todas las asignaturas.
SELECT P.nombre FROM Profesor P WHERE NOT EXISTS (SELECT * FROM Asignatura A WHERE NOT EXISTS (SELECT * FROM Docencia D WHERE D.cod_pro=P.cod_pro # D.cod_asg=A.cod_asg))

El lenguaje SQL

Problemas con la cuantificacin universal


Obtener el nombre de los profesores que imparten todas las asignaturas de su departamento de mas de 6 crditos.

qu pasa si en el departamento de un profesor no hay asignaturas de mas de 6 crditos?

20

El lenguaje SQL
qu pasa si en el departamento de un profesor PX no hay asignaturas de mas de 6 crditos? FALSO para todo valor de AX
{PX.nombre| Profesor (PX) #

$AX ((Asignatura (AX) # AX.cod_dep= PX.cod_dep # (AX.teora+AX.prac)>6) ' &DX (Docencia (DX) #
DX.cod_pro = PX.cod_pro # DX.cod_asg = AX.cod_asg) ) }

El profesor PX aparecera en el resultado de la consulta!

CIERTO

El lenguaje SQL
Si estos profesores no deben salir en la consulta, entonces se debe hacer un control para comprobar que en el departamento del profesor existe alguna asignatura de mas de seis crditos!.
{PX.nombre| Profesor (PX) # &AX (Asignatura (AX) # AX.cod_dep= PX.cod_dep # (AX.teora+AX.prac)>6) # $AX ( (Asignatura (AX) # AX.cod_dep= PX.cod_dep # (AX.teora+AX.prac)>6) ' &DX (Docencia (DX) # DX.cod_pro = PX.cod_pro # DX.cod_asg = AX.cod_asg) ) }

21

El lenguaje SQL.
SELECT PX.nombre FROM Profesor PX WHERE EXISTS (SELECT * FROM Asignatura AX WHERE AX.cod_dep=PX.cod_dep AND (AX.teora+AX.prac)>6)

SQL

AND
NOT EXISTS (SELECT * FROM Asignatura AX WHERE AX.cod_dep= PX.cod_dep AND (AX.teora+AX.prac)>6

AND
NOT EXISTS (SELECT * FROM Docencia DX WHERE DX.cod_pro=PX.cod_pro AND DX.cod_asg=AX.cod_asg) ) )

Uso de EXISTS para cuantificacin universal

$ X F(X) ! % & X % F(X)


Obtener el nombre del ciclista que ha ganado todas las etapas de ms de 200 km. C.nombre| Ciclista(C)#$ X (Etapa(X)#X.Km>200'C.dorsal=X.dorsal) es equivalente a: C.nombre| Ciclista(C)#% &X(Etapa(X)#X.Km>200#C.dorsal<>X.dorsal)

22

Para poder expresar esta consulta en SQL se convertir en: Obtener el nombre del ciclista tal que no existe una etapa de ms de 200 km. que l no haya ganado SELECT nombre FROM Ciclista C WHERE NOT EXISTS (SELECT * FROM Etapa E WHERE km > 200 AND C.dorsal <> E.dorsal );

Uso de Coletillas en consultas con cuantificacin universal


Qu pasa si no hay etapas de ms de 200 km? SALDRAN TODOS LOS CICLISTAS!!!

Solucin: SELECT C.nombre FROM Ciclista C WHERE NOT EXISTS (SELECT * FROM Etapa E WHERE E.km > 200 AND C.dorsal <> E.dorsal ) AND EXISTS (SELECT * FROM ETAPA E2 WHERE E2.km > 200);

23

Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas con cuantificacin universal de las BDs Ciclismo y Msica

AUTOR(autor_id: tira(4), nombre: tira(35), nacionalidad: tira(20)) Clave Primaria: {autor_id} LIBRO(id_lib: tira(10), titulo: tira(80), ao: entero, num_obras: entero) Clave Primaria: {id_lib} VNN: {titulo} TEMA(tematica: tira(20), descripcion: tira(50)) Clave Primaria: {tematica} OBRA(cod_ob: entero, titulo: tira(80), ao: d_cat, tematica: tira(20)) Clave Primaria: {cod_ob} Clave Ajena: {tematica}' TEMA VNN: {titulo} AMIGO(num: entero, nombre: tira(60), telefono: tira(10)) Clave Primaria: {num} VNN: {nombre} PRESTAMO(num: entero, id_lib:tira(10)) Clave Primaria: {num,id_lib} Clave Ajena: {num} ' AMIGO Clave Ajena: {id_lib} ' LIBRO

Biblioteca

ESTA_EN(cod_ob: entero, id_lib:tira(10)) Clave Primaria: {cod_ob,id_lib} Clave Ajena: {cod_ob} ' OBRA Clave Ajena: {id_lib} ' LIBRO ESCRIBIR(cod_ob: entero, autor_id:tira(4)) Clave Primaria: {cod_ob,autor_id} Clave Ajena: {cod_ob}' OBRA Clave Ajena: {autor_id}' AUTOR

24

Consultas Agrupadas
SELECT [ALL | DISTINCT] A1i, A2j,..., Ank| * FROM R1, R2, ..., Rn [WHERE condicin] [GROUP BY B1, B2,..., Bm] [HAVING condicin]
GROUP BY: define grupos de tuplas en el conjunto de tuplas seleccionadas por la condicin WHERE. Los grupos se definen por la igualdad de valor en los atributos de agrupacin (B1, B2,..., Bm). HAVING: de los grupos definidos se seleccionan aquellos que cumplen la condicin expresada.

Consultas Complejas Relacin Seleccin-Agrupamiento


Un grupo se puede entender como un conjunto de filas con el mismo valor para el conjunto de columnas por las que se agrupa (las incluidas en la clusula GROUP BY).

EJEMPLO: Obtener el nombre de cada equipo y la edad media de los ciclistas de dicho equipo:

SELECT nomeq, AVG(edad) FROM Ciclista GROUP BY nomeq;

Nomeq Banesto ONCE PDM Banesto Kelme ONCE Kelme Banesto

Edad 22 25 32 25 28 30 29 28

25

Las funciones agregadas en las consultas agrupadas funcionan de forma diferente que en las consultas normales, devolviendo un valor por cada grupo formado.
Nomeq Banesto Banesto Banesto ONCE ONCE PDM Kelme Kelme Edad 22 25 28 25 30 32 29 28

Un Valor por Grupo

Entonces, para SELECT nomeq, AVG(edad)

FROM Ciclista GROUP BY nomeq;


La solucin, es:

Nomeq Banesto ONCE PDM Kelme

Edad 25 27,5 32 28,5

26

Consultas Agrupadas
EJEMPLO: Obtener el nmero total de profesores de cada departamento
Profesor
cod_pro JCC RFC JBD MAF CPG JTM IGP DGT MCG nombre Juan C. Casamayor R!denas Robert Fuster i Capilla Jos"V. Benlloch Dualde Mar# a Alpuente Frasnedo Cristina P" rez Guillot Jos"M. Torralba Mart# nez Ignacio Gil Pechu$n Daniel Gil Tom$s Matilde Celma Gim" nez tel! fono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC

cod_dep DSIC MAT DISCA IDM OEM 3 1 2 1 2

SELECT cod_dep, COUNT (*) FROM Profesor GROUP BY cod_dep

Consultas Agrupadas
Obtener el nmero total de profesores de los departamentos que tienen mas de 2 profesores.
cod_pro JCC RFC JBD MAF CPG JTM IGP DGT MCG nombre Juan C. Casamayor R!denas Robert Fuster i Capilla Jos"V. Benlloch Dualde Mar# a Alpuente Frasnedo Cristina P" rez Guillot Jos"M. Torralba Mart# nez Ignacio Gil Pechu$n Daniel Gil Tom$s Matilde Celma Gim" nez tel! fono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC
cod_dep DSIC 3

SELECT cod_dep, COUNT (*) FROM Profesor GROUP BY cod_dep HAVING COUNT (*) > 2

27

EJEMPLO INCORRECTO: SELECT nomeq, nombre, AVG(edad) FROM Ciclista GROUP BY nomeq;
La regla sintctica que aplican los sistemas relacionales para asegurar el buen funcionamiento de las consultas agrupadas es la siguiente: En la seleccin de una consulta agrupada, slo pueden aparecer referencias a columnas por las cuales se agrupa, referencias a funciones agregadas o literales.

GROUP y WHERE
Si se incluye la clusula where, la aplicacin de esta clusula se produce previamente a la agrupacin.
4 1 2 3

SELECT nomeq, AVG(edad) FROM Ciclista WHERE edad > 25 GROUP BY nomeq;

28

Evaluacin:
1) Se seleccionan n tuplas de las relaciones que cumplan la condicin de la clusula WHERE. 2) En el conjunto de tuplas seleccionadas se definen grupos basados en el valor de los atributos de agrupacin. 3) De los grupos definidos se seleccionan los que cumplen la condicin de la clusula HAVING.

GROUP, WHERE y HAVING


La clusula HAVING slo puede ir en consultas agrupadas y es similar a WHERE, pero en un orden diferente: 1) Condicin WHERE (se usa para las filas) 2) Agrupamiento y clculo de valores agregados 3) Condicin HAVING (se usa para los grupos) En la clusula HAVING slo podrn aparecer directamente referencias a columnas por las cuales se agrupan o a funciones agregadas.

29

EJEMPLO: Obtener el nombre de cada equipo y la edad media de sus ciclistas con ms de 25 aos, de aquellos equipos con ms de 3 corredores mayores de 25 aos.

SELECT nomeq, AVG(edad) FROM Ciclista WHERE edad > 25 GROUP BY nomeq HAVING COUNT(dorsal) > 3;

EJEMPLO: Obtener el nombre del ciclista y el nmero de puertos que ha ganado, siendo la media de la pendiente de stos superior a 10. SELECT C.nombre, COUNT(P.nompuerto) FROM Ciclista C, Puerto P WHERE C.dorsal = P.dorsal GROUP BY C.dorsal, C.nombre /* Agrupar siempre por CP */ HAVING AVG (P.pendiente) >10;

30

Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas agrudapas de las BDs Ciclismo y Msica

COMBINACIONES DE TABLAS
Existen otras formas de combinar varias tablas en consultas y todas ellas, junto con las ya vistas, dan lugar a una expresin de tabla. Existen, en definitiva, varias formas de combinar dos tablas en el lenguaje SQL: " ! '! Incluir varias tablas en la clusula from. "! '! Uso de subconsultas en las condiciones de las clusulas where o having. '! Combinaciones conjuntistas de tablas: utilizando operadores de la teora de conjuntos para combinar las tablas. '! Concatenaciones de tablas: utilizando diferentes formas variantes del operador concatenacin del lgebra Relacional.

31

El Lenguaje Estndar SQL


Operador
Seleccin Proyeccin Producto Cartesiano Concatenacin Unin Diferencia Interseccin

lgebra Relacional
R Donde F R [Ai , Aj ..., Ak] R1 x R2, ... x Rn

SQL
SELECT ... FROM R WHERE F SELECT Ai , Aj ..., Ak FROM R SELECT ... FROM R1, R2, ..., Rn, o SELECT...FROM R1 CROSS JOIN R2, ..., CROSS JOIN Rn SELECT... FROM R1 NATURAL JOIN R2 SELECT * FROM R1 UNION SELECT * FROM R2 SELECT * FROM R1 EXCEPT SELECT * FROM R2 SELECT * FROM R1 INTERSECT SELECT * FROM R2

R1 R2 R1 ( R2 R1 - R2 R1 ) R2

COMBINACIONES CONJUNTISTAS DE TABLAS


Corresponden a los operadores unin, interseccin y diferencia del lgebra Relacional. Dadas dos tablas A y B: '! '! '! UNION: la tabla resultado tendr las filas de A y B INTERSECT: la tabla resultado tendr las filas que se encuentren a la vez en A y en B. EXCEPT: la tabla resultado tendr las filas de A que no se encuentren en B. Permiten combinar tablas que tengan esquemas

compatibles

(mismo nmero de elementos seleccionados, mismo orden, mismos tipos y nombres).

32

UNION
expresin_tabla union [ALL] trmino_tabla
Realiza la unin de las filas de las tablas provenientes de las dos expresiones. Se permitirn o no duplicados segn se incluya o no la opcin ALL. EJEMPLO: Obtener el nombre de todo el personal de la vuelta. (SELECT nombre FROM Ciclista) UNION (SELECT director FROM Equipo)

UNION
Ejemplo 2. Obtener el nombre de todo el personal (profesores y directores de departamento).
SELECT director FROM Departamento UNION SELECT nombre FROM Profesor

33

INTERSECT
expresin_tabla intersect trmino_tabla
Realiza la interseccin de las filas de las tablas provenientes de las dos expresiones. EJEMPLO: Obtener los nombres de las personas que son tanto ciclistas como directores de equipo . (SELECT nombre FROM Ciclista) INTERSECT (SELECT director FROM Equipo)

INTERSECT
Ejemplo 2. Obtener los departamentos que tienen adscritas asignaturas y profesores.
SELECT DISTINCT cod_dep FROM Profesor INTERSECT SELECT DISTINCT cod_dep FROM Asignatura

34

EXCEPT
expresin_tabla except trmino_tabla En Oracle es Minus
Realiza la diferencia de las filas de las tablas provenientes de las dos expresiones. EJEMPLO: Obtener los nombres que aparecen en la tabla de ciclistas y no en la de directores. (SELECT nombre FROM Ciclista) MINUS (SELECT director FROM Equipo)

EXCEPT
Ejemplo 2. Obtener los departamentos que no tienen adscritas asignaturas.
SELECT cod_dep FROM Departamento EXCEPT SELECT DISTINCT cod_dep FROM Asignatura

En ORACLE, el operador EXCEPT se denomina MINUS.

35

Concatenacin de tablas
SELECT [ALL | DISTINCT] A1i,...,A2j,...,Ank| * FROM R concatenacin 1, R2, ..., Rde n tablas [WHERE condicin] [GROUP BY B1, B2,..., Bm] [HAVING condicin]
#!concatenacin interna: INNER JOIN #!concatenacin externa: OUTER JOIN

Concatenacin de tablas
Corresponden a variantes del operador concatenacin del lgebra Relacional. ! Producto cartesiano CROSS JOIN
! Concatenacin interna NATURAL JOIN ! Concatenacin externa LEFT, RIGHT, FULL ! Concatenacin unin UNION JOIN

36

Producto Cartesiano
(CROSS JOIN)

referencia_tabla1 cross join referencia_tabla2

!
SELECT * from referencia_tabla1,
referencia_tabla2

#!La tabla resultado de la operacin CROSS JOIN es el producto cartesiano de las dos tablas operandos.

Concatenacin Interna
referencia_tabla1 [natural] [inner] join referencia_tabla2 [on expresin_condicional | using (comalista_columna) ] tabla1 join tabla2 on expresin_condicional SELECT * FROM tabla1, tabla2 WHERE expresin_condicional
#!Natural Join: se concatenan las tuplas de tabla1 y tabla2 que tienen el mismo valor en todos los atributos del mismo nombre #!Join...ON: combina una fila de cada operando cuando la condicin expresada se evale a cierta. #!Inner Join... USING: combina una fila de cada operando cuando el valor en las columnas comunes es idntico.

37

Ejemplo- Natural Join


SELECT PX.cod_pro, PX.nombre, COUNT(DX.cod_asg) FROM Profesor PX, Docencia DX WHERE PX.cod_pro = DX.cod_pro GROUP BY cod_pro
concatenacin de Profesor y Docencia

SELECT cod_pro, nombre, COUNT (cod_asg) FROM Profesor NATURAL JOIN Docencia GROUP BY cod_pro
#!Natural Join: se concatenan las tuplas de Profesor y Docencia que tienen el mismo valor en los atributos del mismo nombre (cod_pro)

Concatenacin JOIN...USING
SELECT [ALL | DISTINCT] A1, A2,..., An| * FROM

tabla1 JOIN tabla2 USING (C1, C2,..., Cn) [WHERE condicin] [GROUP BY B1, B2,..., Bm] [HAVING condicin]

(1) (2) (3) (4)

se concatenan las tuplas de tabla1 y tabla2 que tienen el mismo valor en los atributos comunes C1, C2,..., Cn
Es til cuando no interesa que las relaciones se concatenen por todos los atributos del mismo nombre (NATURAL JOIN).

38

Concatenacin JOIN...ON
SELECT [ALL | DISTINCT] A1, A2,..., An| * FROM

tabla1 JOIN tabla2 ON condicin1 [WHERE condicin2] [GROUP BY B1, B2,..., Bm] [HAVING condicin]

(1) (2) (3) (4)

se concatenan las tuplas de tabla1 y tabla2 que cumplen condicin1


Es til cuando: #! interesa concatenar tuplas de tabla1 y tabla2 por condiciones distintas de la igualdad. #! los atributos por los que se desea concatenar no tienen el mismo nombre en ambas relaciones.

Ejemplo: Obtener nombre y director de todos los equipos que tengan ciclistas. Forma ya conocida: SELECT e.nomeq, e.director FROM Equipo E, Ciclista C WHERE E.nomeq=C.nomeq

!
Empleo del JOIN:
SELECT e.nomeq, e.director FROM Equipo E JOIN Ciclista C ON E.nomeq=C.nomeq

39

Concatenacin Externa
referencia_tabla [natural] {left [outer] | right [outer] | full [outer] } JOIN referencia_tabla [on expresin_condicional | using (comalista_columna) ] FULL, se muestran las tuplas no concatenadas de tabla1 y tabla2

Cont. Concatenacin externa sobre la izquierda:


tabla1 left join tabla2 on expresin_condicional (Concat. interna de tabla1 y tabla2)

union
(tuplas de la tabla1 que no estn en la concatenacin interna con valores nulos en el resto de columnas)

RIGHT ! LEFT con la diferencia de que las tuplas que se muestran


son las de tabla2.

40

Concatenacin Unin
referencia_tabla union join referencia_tabla
Crea una tabla donde el esquema es la unin de los esquemas de las dos tablas, que pueden ser distintos.

tabla1 union join tabla2


tuplas de tabla1 con valores nulos en las columnas de tabla2 union tuplas de tabla2 con valores nulos en las columnas de tabla1

EJERCICIO 33: Obtener nombre de todos los equipos indicando cuantos ciclistas tiene cada uno
1 Opcin (errnea) 21 filas SELECT e.nomeq, count(c.dorsal) FROM Equipo E, Ciclista C WHERE E.nomeq=C.nomeq GROUP BY e.nomeq 2 Opcin Correcta 22 filas SELECT E.nomeq, count(c.dorsal) FROM (EQUIPO E left join ciclista c on E.NOMEQ=C.NOMEQ) GROUP BY E.nomeq;

El equipo PDM con 0 ciclistas no aparece

41

EJERCICIO 33: Obtener nombre de todos los equipos indicando cuantos ciclistas tiene cada uno
3 Opcin Correcta 22 filas SELECT e.nomeq, count(c.dorsal) FROM Equipo E, Ciclista C WHERE E.nomeq=C.nomeq (+) GROUP BY e.nomeq

Se pone (+) en la parte de la ICA de la tabla de la que no se quieren mantener las tuplas

42