Está en la página 1de 42

Prctica 3:

Lenguaje SQL
1 Parte: Manipulacin de
Bases de Datos

Silvia Abraho - DSIC


curso 2010/2011

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

1
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.

2
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}

3
Ciclismo
Maillot
Equipo
codigo
nomeq
Ciclista tipo
director Llevar
dorsal
dorsal premio
nombre
netapa color
edad
codigo
Etapa nomeq
Puerto
netapa
nompuerto
km
altura
salida
categoria
llegada
pendiente
dorsal
netapa
Esquema de Prcticas. dorsal

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;

4
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;

5
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

6
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.

7
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

8
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;

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

T1 T2
n n
a1 b1 c1 d1
a2 b2 c2 b2
a3 b3

T1 x T2
n n
X a1 b1 c1 d1
X a1 b1 c2 b2
X a2 b2 c1 d1
a2 b2 c2 b2
X a3 b3 c1 d1
X a3 b3 c2 b2

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 WHERE
C.nomeq = (SELECT E.nomeq FROM Equipo E
WHERE E.director = lvaro Pino);
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?
1 columna con n filas
SELECT nompuerto FROM Puerto
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 se pueden hacer Subconsultas


Encadenadas:

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
CIERTO
resultado de la consulta!

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
SQL
FROM Profesor PX
WHERE EXISTS (SELECT *
FROM Asignatura AX
WHERE AX.cod_dep=PX.cod_dep AND (AX.teora+AX.prac)>6)

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>200C.dorsal=X.dorsal)
es equivalente a:
C.nombre| Ciclista(C)
X(Etapa(X)X.Km>200C.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

Biblioteca
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}

ESTA_EN(cod_ob: entero, id_lib:tira(10))


AMIGO(num: entero, nombre: tira(60),
telefono: tira(10)) Clave Primaria: {cod_ob,id_lib}
Clave Primaria: {num} Clave Ajena: {cod_ob} OBRA
VNN: {nombre} Clave Ajena: {id_lib} LIBRO
PRESTAMO(num: entero, id_lib:tira(10))
ESCRIBIR(cod_ob: entero, autor_id:tira(4))
Clave Primaria: {num,id_lib} Clave Primaria: {cod_ob,autor_id}
Clave Ajena: {num} AMIGO Clave Ajena: {cod_ob} OBRA
Clave Ajena: {id_lib} LIBRO 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:
Nomeq Edad
Banesto 22
SELECT nomeq, AVG(edad) ONCE 25
PDM 32
FROM Ciclista Banesto 25
GROUP BY nomeq; Kelme 28
ONCE 30
Kelme 29
Banesto 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 Edad
Banesto 22
Banesto 25
Banesto 28
ONCE 25 Un Valor
ONCE 30 por Grupo
PDM 32
Kelme 29
Kelme 28

Entonces, para SELECT nomeq, AVG(edad)


FROM Ciclista GROUP BY
nomeq;

La solucin, es:
Nomeq Edad
Banesto 25
ONCE 27,5
PDM 32
Kelme 28,5

26
Consultas Agrupadas
EJEMPLO: Obtener el nmero total de profesores de cada departamento
Profesor
cod_pro nombre tel!fono cod_dep
JCC Juan C. Casamayor R!denas 7796 DSIC
RFC Robert Fuster i Capilla 6789 MAT cod_dep

JBD Jos"V. Benlloch Dualde 5760 DISCA DSIC 3


MAF Mar#a Alpuente Frasnedo 3560 DSIC MAT 1
CPG Cristina P"rez Guillot 7439 IDM DISCA 2
JTM Jos"M. Torralba Mart#nez 4590 OEM IDM 1
IGP Ignacio Gil Pechu$n 3423 OEM OEM 2
DGT Daniel Gil Tom$s 5679 DISCA
MCG Matilde Celma Gim"nez 7756 DSIC

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 nombre tel!fono cod_dep
JCC Juan C. Casamayor R!denas 7796 DSIC
RFC Robert Fuster i Capilla 6789 MAT cod_dep

JBD Jos"V. Benlloch Dualde 5760 DISCA DSIC 3

MAF Mar#a Alpuente Frasnedo 3560 DSIC


CPG Cristina P"rez Guillot 7439 IDM
JTM Jos"M. Torralba Mart#nez 4590 OEM
IGP Ignacio Gil Pechu$n 3423 OEM
DGT Daniel Gil Tom$s 5679 DISCA
MCG Matilde Celma Gim"nez 7756 DSIC

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 SELECT nomeq, AVG(edad)


1 FROM Ciclista
2 WHERE edad > 25
3 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 lgebra SQL
Relacional
Seleccin R Donde F SELECT ... FROM R WHERE F

Proyeccin R [Ai , Aj ..., Ak] SELECT Ai , Aj ..., Ak FROM R

Producto R1 x R2, ... x Rn SELECT ... FROM R1, R2, ..., Rn, o
Cartesiano SELECT...FROM R1 CROSS JOIN
R2, ..., CROSS JOIN Rn
Concatenacin R1 R2 SELECT... FROM R1 NATURAL JOIN R2

Unin R1 R2 SELECT * FROM R1 UNION SELECT *


FROM R2
Diferencia R1 - R2 SELECT * FROM R1 EXCEPT SELECT
* FROM R2
Interseccin R1 R2 SELECT * FROM R1 INTERSECT
SELECT * FROM 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 Rconcatenacin
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 concatenacin de
Profesor y Docencia
GROUP BY cod_pro

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) (1)
[WHERE condicin] (2)
(3)
[GROUP BY B1, B2,..., Bm]
(4)
[HAVING condicin]

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 (1)
[WHERE condicin2] (2)
(3)
[GROUP BY B1, B2,..., Bm]
(4)
[HAVING condicin]

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) El equipo PDM
FROM Equipo E, Ciclista C con 0 ciclistas no
WHERE E.nomeq=C.nomeq aparece
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;

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) Se pone (+) en la


parte de la ICA de
FROM Equipo E, Ciclista C la tabla de la que
WHERE E.nomeq=C.nomeq (+) no se quieren
GROUP BY e.nomeq mantener las
tuplas

42

También podría gustarte