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.

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
Maillot

Equipo

codigo

nomeq
director

Ciclista
dorsal
nombre
edad

Etapa
netapa

nomeq

km

Llevar

tipo

dorsal

premio

netapa

color

codigo

Puerto
nompuerto
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;

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

T2
n
a1
a2
a3

b1
b2
b3

c1
c2

d1
b2

T1 x T2
n
X
X
X

X
X

a1
a1
a2
a2
a3
a3

b1
b1
b2
b2
b3
b3

n
c1
c2
c1
c2
c1
c2

d1
b2
d1
b2
d1
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
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

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

AUTOR(autor_id: tira(4), nombre: tira(35), nacionalidad: tira(20))

Biblioteca

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

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

Edad
22

ONCE
PDM

25
32

Banesto

25

Kelme
ONCE
Kelme

28
30
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
Banesto
Banesto

Edad
22
25

Banesto
ONCE

28
25

ONCE
PDM
Kelme
Kelme

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

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

DSIC

MAT

IDM

DISCA

OEM

IDM

OEM

MAF
CPG
JTM

Mar#a Alpuente Frasnedo


Cristina P"rez Guillot
Jos"M. Torralba Mart#nez

3560
7439
4590

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

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

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)

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

lgebra
Relacional

SQL

Seleccin

R Donde F

SELECT ... FROM R WHERE F

Proyeccin

R [Ai , Aj ..., Ak]

SELECT Ai , Aj ..., Ak FROM R

Producto
Cartesiano

R1 x R2, ... x Rn

SELECT ... FROM R1, R2, ..., Rn, o


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

tabla1 JOIN tabla2 USING (C1, C2,..., Cn)


[WHERE condicin]
[GROUP BY B1, B2,..., Bm]
[HAVING condicin]
FROM

(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| *

tabla1 JOIN tabla2 ON condicin1


[WHERE condicin2]
[GROUP BY B1, B2,..., Bm]
[HAVING condicin]
FROM

(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

El equipo PDM
con 0 ciclistas no
aparece

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

También podría gustarte