Pract 3

También podría gustarte

Está en la página 1de 42

1

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.
2
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.
Lenguaje de Manipulacin del SQL
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.
3
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.
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
4
netapa
km
salida
llegada
dorsal
Etapa
nomeq
director
Equipo
nompuerto
altura
categoria
pendiente
netapa
dorsal
Puerto
dorsal
nombre
edad
nomeq
Ciclista
dorsal
netapa
codigo
Llevar
codigo
tipo
premio
color
Maillot
Ciclismo
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;
5
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 exp
1
and exp
2
! (exp >= exp
1
) and (exp <=
exp
2
)
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 (exp
1
, exp
2
, , exp
n
) ! (exp=exp
1
) or (exp=exp
2
) oror (exp=exp
n
)
EJEMPLO: Obtener todos los datos de aquellos ciclistas de los
que se desconoca su edad.
SELECT * FROM Ciclista
WHERE edad IS NULL;
6
COMPARACIN DE VALORES NULOS
Las comparaciones entre cualquier valor y NULL resultan
en indefinido. Ejemplo:
select *
from T
where atrib
1
> atrib
2

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
7
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.
8
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 (1
a
Parte)
Hacer el bloque de consultas sobre una sola relacin
de las bases de datos Ciclismo y Msica




9
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;
10
Ejemplo: SELECT * FROM T1, T2 WHERE T1.n = T2.n
n
a1 b1
a2 b2
a3 b3
T1
c1 d1
c2 b2
T2
n
X
X
X
"
X
X
T1 x T2
n n
a1 b1 c1 d1
a1 b1 c2 b2
a2 b2 c1 d1
a2 b2 c2 b2
a3 b3 c1 d1
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
11
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
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;
==>
FROM Ciclista C1, Ciclista C2
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. nombr e FROM Ci c l i s t a C, Equi po 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;
12
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)
WHERE C1.nomeq IN (SELECT C2.nomeq FROM Ciclista C2
WHERE C2.nombre=Miguel Indurin)

AND C1.edad < (SELECT C2.edad FROM Ciclista C2
WHERE C2.nombre=Miguel Indurin);
Tablas que se requieren para el Select precedente
Se ver ms adelante
SELECT C1.nombre FROM Ciclista C1
13
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.

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.
PREDICADOS QUE ACEPTAN SUBCONSULTAS
14
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.
PREDICADOS DE COMPARACIN (=, <>, >, <, >=, <=)
EJEMPLO: Obtener los nombres de los puertos cuya altura es
mayor que la media de altura de los puertos de 2 categora.

==> FROM Puerto
==> WHERE altura > (SELECT AVG(altura) FROM Puerto
WHERE categoria = 2 );
1. En qu tablas se encuentra la informacin?
Puerto
2. Qu condicin deben cumplir las filas resultantes?
altura > AVG(altura) de los Puertos de segunda categora
Es un valor - una fila
Compara cada valor de altura con el valor obtenido
en avg(altura)
15
==> SELECT nompuerto
EJEMPLO: Obtener los nombres de los puertos cuya altura es
mayor que la media de altura de los puertos de 2 categora.

==> FROM Puerto
==> WHERE altura > (SELECT AVG(altura) FROM Puerto
WHERE categoria = 2 );
1. En qu tablas se encuentra la informacin?
Puerto
2. Qu condicin deben cumplir las filas resultantes?
altura > avg(altura) de los Puertos de segunda categora
3. Qu informacin queremos visualizar?
nompuerto
==> SELECT nompuerto FROM Puerto
WHERE altura > (SELECT AVG(altura) FROM Puerto
WHERE categoria = 2 );
Es un valor a la vez
SELECT nompuerto FROM Puerto
WHERE altura > (SELECT altura FROM Puerto
WHERE categoria = 2 );
Qu hace el siguiente ejemplo?
Es correcto?
1 columna con n filas
==> No puede hacer la comparacin

INCORRECTO: (error de ejecucin)
16
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);
Predicado IN
Comprueba que un valor pertenece a una coleccin dada mediante una
subconsulta
constructor_fila [not] IN(expresin_tabla)
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%));

17
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.
Predicados de comparacin cuantificados (ALL, ANY)
Permiten comparar un valor con un conjunto de valores.
constructor_fila predicado_comparacin {all | any | some}
(expresin_tabla)
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 ) )
18

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.
Predicado EXISTS

EXISTS (expresin_tabla)

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

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
20
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))
Obtener el nombre de los profesores que imparten todas
las asignaturas.
Uso de EXISTS para cuantificacin universal (NO HAY EN
SQL)
$ X F(X) ! % & X % F(X)
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?
21
El lenguaje SQL
{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) ) }
qu pasa si en el departamento de
un profesor PX no hay asignaturas
de mas de 6 crditos?
FALSO para todo valor de AX
CIERTO
El profesor PX aparecera en el
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) ) }
22
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)
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) ) )
SQL
El lenguaje SQL.
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)

23

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

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);
Uso de Coletillas en consultas con
cuantificacin universal
24
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}
Biblioteca
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


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
25
SELECT [ALL | DISTINCT] A
1i
, A
2j
,..., A
nk
| *
FROM R
1
, R
2
, ..., R
n

[WHERE condicin]
[GROUP BY B
1
, B
2
,..., B
m
]
[HAVING condicin]

Consultas Agrupadas
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 (B
1
, B
2
,...,
B
m
).
HAVING: de los grupos definidos se seleccionan aquellos que
cumplen la condicin expresada.
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).
Consultas Complejas
Relacin Seleccin-Agrupamiento
EJEMPLO: Obtener el nombre de cada equipo y la edad
media de los ciclistas de dicho equipo:
Nomeq Edad
Banesto 28
Banesto 22
ONCE 25
ONCE 30
Banesto 25
PDM 32
Kelme 28
Kelme 29
SELECT nomeq, AVG(edad)
FROM Ciclista
GROUP BY nomeq;

26
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 28
Banesto 22
ONCE 25
ONCE 30
Banesto 25
PDM 32
Kelme 28
Kelme 29
Un Valor
por Grupo
Entonces, para
Nomeq Edad
Banesto 25
ONCE 27,5
PDM 32
Kelme 28,5
SELECT nomeq, AVG(edad)
FROM Ciclista GROUP BY
nomeq;
La solucin, es:
27
EJEMPLO: Obtener el nmero total de profesores de cada departamento
Consultas Agrupadas
cod_pro nombre tel!fono cod_dep
JCC Juan C. Casamayor R!denas 7796 DSIC
RFC Robert Fuster i Capilla 6789 MAT
JBD Jos"V. Benlloch Dualde 5760 DISCA
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
Profesor
cod_dep
DSIC 3
MAT 1
DISCA 2
IDM 1
OEM 2
SELECT cod_dep, COUNT (*)
FROM Profesor
GROUP BY cod_dep
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
JBD Jos"V. Benlloch Dualde 5760 DISCA
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
cod_dep
DSIC 3
SELECT cod_dep, COUNT (*)
FROM Profesor
GROUP BY cod_dep
HAVING COUNT (*) > 2
Consultas Agrupadas
28
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.
EJEMPLO INCORRECTO:
Si se incluye la clusula where, la aplicacin de esta
clusula se produce previamente a la agrupacin.

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

GROUP y WHERE
4
1
2
3
29
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.
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.
GROUP, WHERE y HAVING
30
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)
WHERE edad > 25
GROUP BY nomeq
HAVING COUNT(dorsal) > 3;
FROM Ciclista
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;
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.
31
Ejercicios:
Prctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas agrudapas de las BDs
Ciclismo y Msica
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.
COMBINACIONES DE TABLAS
"
"
32
El Lenguaje Estndar SQL
Operador lgebra
Relacional
SQL
Seleccin R Donde F SELECT ... FROM R WHERE F
Proyeccin R [A
i ,
A
j ...,
A
k
] SELECT A
i ,
A
j ...,
A
k
FROM R
Producto
Cartesiano
R
1
x R
2
, ... x R
n
SELECT ... FROM R
1
, R
2
, ..., R
n,
o
SELECT...FROM R
1
CROSS JOIN
R
2
, ..., CROSS JOIN R
n

Concatenacin R
1
R
2
SELECT... FROM R
1
NATURAL JOIN R
2

Unin R
1
( R
2
SELECT * FROM R
1
UNION SELECT *
FROM R
2

Diferencia R
1
- R
2
SELECT * FROM R
1
EXCEPT SELECT
* FROM R
2

Interseccin R
1
) R
2
SELECT * FROM R
1
INTERSECT
SELECT * FROM R
2

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
compati bl es (mi smo nmero de el ementos
seleccionados, mismo orden, mismos tipos y nombres).
COMBINACIONES CONJUNTISTAS DE TABLAS
33
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.
UNION
expresin_tabla union [ALL] trmino_tabla
EJEMPLO: Obtener el nombre de todo el personal de la
vuelta.

(SELECT nombre FROM Ciclista)
UNION
(SELECT director FROM Equipo)
SELECT director
FROM Departamento
UNION
SELECT nombre
FROM Profesor
Ejemplo 2. Obtener el nombre de todo el personal
(profesores y directores de departamento).
UNION
34
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)
SELECT DISTINCT cod_dep
FROM Profesor
INTERSECT
SELECT DISTINCT cod_dep
FROM Asignatura
Ejemplo 2. Obtener los departamentos que tienen
adscritas asignaturas y profesores.
INTERSECT
35
EXCEPT
expresin_tabla except trmino_tabla
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)
En Oracle es Minus
SELECT cod_dep
FROM Departamento
EXCEPT
SELECT DISTINCT cod_dep
FROM Asignatura
Ejemplo 2. Obtener los departamentos que no tienen
adscritas asignaturas.
EXCEPT
En ORACLE, el operador EXCEPT se denomina MINUS.
36
SELECT [ALL | DISTINCT] A
1i
,...,A
2j
,...,A
nk
| *
FROM R
1
, R
2
, ..., R
n

[WHERE condicin]
[GROUP BY B
1
, B
2
,..., B
m
]
[HAVING condicin]

Concatenacin de tablas
concatenacin de tablas
# concatenacin interna: INNER JOIN
# concatenacin externa: OUTER JOIN
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
Concatenacin de tablas
37
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.
referencia_tabla1 [natural] [inner] join referencia_tabla2
[on expresin_condicional | using (comalista_columna) ]
Concatenacin Interna
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.
38
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
SELECT cod_pro, nombre, COUNT (cod_asg)
FROM Profesor NATURAL JOIN Docencia
GROUP BY cod_pro
Ejemplo- Natural Join
concatenacin de
Profesor y Docencia
# Natural Join: se concatenan las tuplas de Profesor y Docencia que
tienen el mismo valor en los atributos del mismo nombre (cod_pro)
SELECT [ALL | DISTINCT] A
1
, A
2
,..., A
n
| *
FROM
[WHERE condicin]
[GROUP BY B
1
, B
2
,..., B
m
]
[HAVING condicin]
se concatenan las tuplas de tabla1 y tabla2 que tienen el
mismo valor en los atributos comunes C
1
, C
2
,..., C
n
(1)
(2)
(3)
(4)
Es til cuando no interesa que las relaciones se concatenen por
todos los atributos del mismo nombre (NATURAL JOIN).
tabla1 JOIN tabla2 USING (C
1
, C
2
,..., C
n
)
Concatenacin JOIN...USING
39
SELECT [ALL | DISTINCT] A
1
, A
2
,..., A
n
| *
FROM
[WHERE condicin2]
[GROUP BY B
1
, B
2
,..., B
m
]
[HAVING condicin]
se concatenan las tuplas de tabla1 y tabla2 que cumplen
condicin1

(1)
(2)
(3)
(4)
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.
tabla1 JOIN tabla2 ON condicin1
Concatenacin JOIN...ON
Empleo del JOIN:
SELECT e.nomeq, e.director
FROM Equipo E JOIN Ciclista C ON E.nomeq=C.nomeq
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
!
40
FULL, se muestran las tuplas no concatenadas de tabla1 y tabla2
referencia_tabla [natural]
{left [outer] |
right [outer] |
full [outer] } JOIN referencia_tabla
[on expresin_condicional | using
(comalista_columna) ]
Concatenacin Externa
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.

Cont. Concatenacin externa sobre la izquierda:
41
referencia_tabla union join referencia_tabla
Concatenacin Unin
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
42
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

EJERCICIO 33: Obtener nombre de todos los equipos
indicando cuantos ciclistas tiene cada uno
Se pone (+) en la
parte de la ICA de
la tabla de la que
no se quieren
mantener las
tuplas
(+)

También podría gustarte