Sei sulla pagina 1di 42
Práctica 3: Lenguaje SQL 1ª Parte: Manipulación de Bases de Datos Silvia Abrahão - DSIC
Práctica 3:
Lenguaje SQL
1ª Parte: Manipulación de
Bases de Datos
Silvia Abrahão - DSIC
curso 2010/2011
Objetivos •  Presentar la sintaxis del lenguaje SQL (sólo del Lenguaje de Manipulación). •  Ver
Objetivos
•  Presentar la sintaxis del lenguaje SQL (sólo del Lenguaje
de Manipulación).
•  Ver algunos ejemplos sencillos para clarificar la semántica
del SQL.
•  Presentar las bases de datos CICLISMO, MÚSICA 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 gestión de bases de datos ORACLE.
Lenguaje de Manipulación del SQL Se presentan las instrucciones que se pueden ejecutar desde un
Lenguaje de Manipulación del SQL
Se presentan las instrucciones que se pueden ejecutar desde un
intérprete 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 manipulación
de datos son las siguientes:
   SELECT: permite la declaración de consultas para la recuperación de
información de una o más tablas de una base de datos.
   INSERT: realiza la inserción de una o varias filas sobre una tabla.
   DELETE: permite efectuar el borrado de una o varias filas de una
tabla.
   UPDATE: realiza una modificación de los valores de una o más
columnas de una o varias filas de una tabla.
1.1. Consultas: instrucción SELECT SELECT [ALL | DISTINCT] comalista_item_seleccionado | * FROM
1.1.
Consultas: instrucción SELECT
SELECT [ALL | DISTINCT] comalista_item_seleccionado | *
FROM comalista_referencia_tabla
[WHERE expresión_condicional]
[GROUP BY comalista_referencia_col]
[HAVING expresión_condicional]
[ORDER BY comalista_referencia_col]
 
 
 
 
 
 
comalista_item_seleccionado: información a obtener de la base de datos.
FROM comalista_referencia_tabla: especifica de qué tablas se obtiene la
información buscada.
WHERE expresión_condicional: expresa una condición que deben cumplir
las filas de la consulta resultante.
GROUP BY comalista_referencia_col: permite formar consultas agrupadas
para extraer información global sobre los grupos formados.
HAVING expresión_condicional: condición 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
1.1.1.
Condiciones en consultas simples
SELECT [ALL | DISTINCT] comalista_ítem_seleccionado | *
FROM tabla
[WHERE expresión_condicional]
[ORDER BY comalista_referencia_col]
 
 
 
 
ALL : Permite la aparición de filas idénticas (valor por defecto).
DISTINCT: No permite la aparición de filas idénticas.
La expresión_condicional está formada por un conjunto de predicados
combinados con las conectivas lógicas AND, OR y NOT.
Los predicados utilizados permiten comparar columnas:
predicados de comparación: =, <>, >, <, >=, <=.
predicado LIKE: permite comparar una tira de caracteres con un patrón.
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:
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 (nºetapa: d_nº, km: d_km, salida: d_sal, llegada: d_lleg, dorsal: d_dor)
Clave Primaria: {nºetapa}
CAj: {dorsal} hace referencia a CICLISTA
PUERTO (nombre:d_nom,altura:d_alt,categoría:d_cat, nºetapa:d_nº,dorsal: d_dor)
Clave Primaria: {nombre}
CAj: {nºetapa} hace referencia a ETAPA
CAj: {dorsal} hace referencia a CICLISTA
VNN: {nºetapa}
MAILLOT (código: d_código, tipo: d_tipo, premio: d_pre, color: d_col)
Clave Primaria: {código}
LLEVAR (dorsal: entero, nºetapa: d_nº, código: d_código)
Clave Primaria: {nºetapa, código}
CAj: {nºetapa} hace referencia a ETAPA
CAj: {dorsal} hace referencia a CICLISTA
CAj: {código} hace referencia a MAILLOT
VNN: {dorsal}

Ciclismo

Maillot

codigo nomeq Ciclista tipo Llevar director dorsal dorsal premio nombre netapa color edad codigo Etapa
codigo
nomeq
Ciclista
tipo
Llevar
director
dorsal
dorsal
premio
nombre
netapa
color
edad
codigo
Etapa
nomeq
netapa
Puerto
nompuerto
km
altura
salida
categoria
llegada
pendiente
dorsal
netapa
Esquema de Prácticas.
dorsal

Equipo

EJEMPLO: Obtener el nombre y la altura de todos los puertos de 1ª categoría. 1.
EJEMPLO: Obtener el nombre y la altura de todos los puertos
de 1ª categoría.
1. ¿En qué tablas se encuentra la información?
2. ¿Qué condición deben cumplir las filas resultantes?
3. ¿Que información 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
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 años.
SELECT nombre FROM Ciclista
WHERE edad BETWEEN 20 AND 30;
(*) El predicado BETWEEN es equivalente a una condición con
comparaciones de la siguiente forma:
exp between exp 1 and exp 2 ≡
exp 2 )
(exp >= exp 1 ) and (exp <=
EJEMPLO: Obtener el número de las etapas donde el nombre de la ciudad de llegada
EJEMPLO: Obtener el número 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 más ‘A’s.
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ª categoría.
SELECT nompuerto FROM Puerto
WHERE categoría IN ( 1, 2, 3 ) ;
(*) También el predicado IN es derivado y la expresión equivalente es:
exp in (exp 1 , exp 2 , … , exp n ) ≡ (exp=exp 1 ) or (exp=exp 2 ) or… or (exp=exp n )
EJEMPLO: Obtener todos los datos de aquellos ciclistas de los
que se desconocía su edad.
SELECT * FROM Ciclista
WHERE edad IS NULL;
COMPARACIÓN DE VALORES NULOS Las comparaciones entre cualquier valor y NULL resultan en indefinido. Ejemplo:
COMPARACIÓN 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 comparación sería indefinido y por
tanto dicha fila no se incluiría en la selección.
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error
y por tanto dicha fila no se incluiría en la selección. Ejemplo de consulta incorrecta (error

Ejemplo de consulta incorrecta (error de sintaxis) SELECT nomeq FROM Equipo WHERE director = null

La consulta correcta sería

SELECT nomeq

FROM Equipo

WHERE director IS NULL

MÁS EJEMPLOS DE COMPARACIONES Uso de operadores aritméticos: + (suma), - (diferencia), * (producto), /
MÁS EJEMPLOS DE COMPARACIONES
Uso de operadores aritméticos: + (suma), - (diferencia), *
(producto), / (división), etc.
EJEMPLO: Obtener de los maillots el tipo y el premio en dólares
(supongamos que está en pesetas) ($1 = 150 ptas.) de aquellos maillots
cuyo premio supere los 100 dólares.
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 carácter comodín tiene su valor ‘%’
CONSULTAS DE VALORES AGREGADOS La sintaxis de una referencia a una función agregada es la
CONSULTAS DE VALORES AGREGADOS
La sintaxis de una referencia a una función agregada es la siguiente:
{ avg | max | min | sum | count } ( [all | distinct] expresión_escalar ) |
count(*)
 
 
 
 
 
 
 
Las funciones agregadas no se pueden anidar.
Para las funciones SUM y AVG los argumentos deben ser numéricos.
DISTINCT indica que los valores redundantes sean eliminados antes de que
se realice el cálculo correspondiente.
La función especial COUNT(*), en la que no está permitido incluir DISTINCT
ni ALL, da como resultado el cardinal del conjunto de filas de la selección.
Los cálculos se realizan después de la selección y aplicar las condiciones.
Los valores nulos son eliminados antes de realizar los cálculos (incl. count).
Si el número de filas de la selección es 0, la función COUNT devuelve el valor
0 y las otras funciones el valor nulo.
FUNCIONES AGREGADAS EN CONSULTAS NO AGRUPADAS EJEMPLO: SELECT ‘Núm. de ciclistas =’, COUNT(*), ‘Media
FUNCIONES
AGREGADAS
EN
CONSULTAS
NO
AGRUPADAS
EJEMPLO:
SELECT
‘Núm.
de
ciclistas
=’,
COUNT(*),
‘Media
Edad
=’,
AVG(edad)
FROM Ciclista
WHERE nomeq = ‘Banesto’;
En consultas no agrupadas, la selección sólo 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: Práctica 3: El lenguaje SQL (1 a Parte) Hacer el bloque de consultas sobre
Ejercicios:
Práctica 3: El lenguaje SQL (1 a Parte)
Hacer el bloque de consultas sobre una sola relación
de las bases de datos Ciclismo y Música
CONSULTAS SIMPLES SOBRE VARIAS TABLAS Cuando la información que se desea obtener de la base
CONSULTAS SIMPLES SOBRE VARIAS TABLAS
Cuando la información que se desea obtener de la base
de datos se encuentra almacenada en más de una tabla
se hace indispensable el declarar una consulta que
manipule estas tablas.
EJEMPLO: Obtener pares de números de etapas y nombres de puertos ganados por el mismo
EJEMPLO: Obtener pares de números de etapas y nombres de
puertos ganados por el mismo ciclista.
1. ¿En qué tablas se encuentra la información?
FROM Etapa, Puerto
2. ¿Qué condición deben cumplir las filas resultantes?
WHERE etapa.dorsal = puerto.dorsal;
3. ¿Qué información queremos visualizar?
SELECT etapa.netapa, nompuerto
En esta expresión 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 n a1
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
a1
b1
c1
d1
X
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
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
EJEMPLO: Obtener el nombre de los ciclistas compañeros de equipo de ‘Miguel Induráin’ que sean
EJEMPLO: Obtener el nombre de los ciclistas compañeros de equipo
de ‘Miguel Induráin’ que sean más jóvenes que él.
1. ¿En qué tablas se encuentra la información?
FROM Ciclista
Pero, como se requiere comparar con tuplas de la misma tabla,
entonces se necesita tener varias imágenes de ella
FROM Ciclista C1, Ciclista C2
2. ¿Qué condición deben cumplir las filas resultantes?
WHERE C2.nombre=‘Miguel Induráin’ AND C1.nomeq = C2.nomeq
AND C1.edad < C2.edad;
3. ¿Qué información queremos visualizar?
SELECT DISTINCT C1.nombre
==>
SELECT DISTINCT C1.nombre FROM Ciclista C1, Ciclista C2
WHERE C2.nombre=‘Miguel Induráin’ 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
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, número de etapa, de tal
forma que dicho ciclista haya ganado dicha etapa. Además 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;
Ejercicios: Práctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas sobre varias
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas sobre varias
tablas de las bases de datos Ciclismo y Música

CONSULTAS COMPLEJAS: SUBCONSULTAS

Si la información que se está buscando está incluida en una tabla y la condición de búsqueda de esta información requiere acceder a otras tablas, entonces también se pueden utilizar las subconsultas para expresar este tipo de condiciones.

EJEMPLO: Obtener el nombre de los ciclistas compañeros de equipo de ‘Miguel Induráin’ que sean más jóvenes que él. (Es el mismo enunciado de antes)

SELECT C1.nombre FROM Ciclista C1

WHERE C1.nomeq

Tablas que se requieren para el Select precedente
Tablas que se requieren para el Select precedente

IN (SELECT C2.nomeq FROM Ciclista C2 WHERE C2.nombre=‘Miguel Induráin’)

Se verá más adelante

AND C1.edad < (SELECT C2.edad FROM Ciclista C2 WHERE C2.nombre=‘Miguel Induráin’);

EJEMPLO: Obtener los nombres de los ciclistas pertenecientes al equipo dirigido por ‘Álvaro Pino’. Antes,
EJEMPLO: Obtener los nombres de los ciclistas pertenecientes
al equipo dirigido por ‘Álvaro Pino’.
Antes, se habían usado igualdades:
SELECT
C.nombre
FROM
Ciclista
C,
Equipo
E
WHERE C.nomeq = E.nomeq AND E.director = ‘Álvaro Pino’;
Usando subconsultas, sería:
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 información 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 búsqueda, como argumentos
PREDICADOS QUE ACEPTAN SUBCONSULTAS
Las subconsultas pueden aparecer en las condiciones de búsqueda, como
argumentos de algunos predicados, tanto de la cláusula WHERE como de
la HAVING.
Los predicados que pueden llevar como argumentos subconsultas son los
siguientes:
•  predicados de comparación (=, <>, >, <, >=, <=).
•  IN: comprueba que un valor pertenece a una colección dada
mediante una subconsulta.
•  predicados de comparación cuantificados (ANY y ALL): permitir
comparar un valor con un conjunto de valores.
•  MATCH: comprueba si un valor es idéntico a algún valor de una
colección.
•  EXISTS: equivalente al cuantificador existencial, comprueba si una
subconsulta devuelve alguna fila.
•  UNIQUE: comprueba si una subconsulta no devuelve filas repetidas.
PREDICADOS DE COMPARACIÓN (=, <>, >, <, >=, <=) Cada uno de los dos lados
PREDICADOS DE COMPARACIÓN (=, <>, >, <, >=, <=)
Cada uno de los dos lados de un predicado de comparación debe ser una única
tupla formada por el mismo número de columnas. Es decir:
(A1, A2, … , An) predicado_comparación (B1, B2, …, Bn)
Las subconsultas pueden ser argumentos, siempre y cuando devuelvan una
única fila y el número de columnas coincida en número y tipo con el
otro lado del predicado de comparación.
Llamaremos constructor_fila a una lista de atributos entre paréntesis o una
subconsulta.
constructor_fila predicado_comparación constructor_fila
En el caso que la subconsulta esté vacía, se convierte a una fila con valores
nulos en todas las columnas.
Para poder comparar dos constructor_fila de más de una columna, existe una
forma definida de realizar esta comparación para cada uno de los predicados de
comparación (=, <>, >, <, <=, >=). Pero, en general se verán subconsultas de
una única columna, como el ejemplo anterior.
EJEMPLO: Obtener los nombres de los puertos cuya altura es mayor que la media de
EJEMPLO: Obtener los nombres de los puertos cuya altura es
mayor que la media de altura de los puertos de 2ª categoría.
1. ¿En qué tablas se encuentra la información?
Puerto
==>
FROM Puerto
2. ¿Qué condición deben cumplir las filas resultantes?
altura > AVG(altura) de los Puertos de segunda categoría
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)
EJEMPLO: Obtener los nombres de los puertos cuya altura es mayor que la media de
EJEMPLO: Obtener los nombres de los puertos cuya altura es
mayor que la media de altura de los puertos de 2ª categoría.
1. ¿En qué tablas se encuentra la información?
Puerto
==>
FROM Puerto
2. ¿Qué condición deben cumplir las filas resultantes?
altura > avg(altura) de los Puertos de segunda categoría
==> WHERE altura > (SELECT AVG(altura) FROM Puerto
WHERE categoria = ‘2’ );
3. ¿Qué información 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
¿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 comparación
INCORRECTO: (error de ejecución)
Predicado IN Comprueba que un valor pertenece a una colección dada mediante una subconsulta constructor_fila
Predicado IN
Comprueba que un valor pertenece a una colección dada mediante una
subconsulta
constructor_fila [not] IN(expresión_tabla)
A la derecha de IN puede aparecer más de una fila y por eso se
denomina expresión_tabla.
EJEMPLO: Obtener el nº de las etapas ganadas por ciclistas con
edad superior a los 30 años.
SELECT netapa FROM Etapa
WHERE dorsal IN (SELECT dorsal FROM Ciclista
WHERE edad > 30);

También,

con

IN

se

pueden

hacer

Subconsultas

Encadenadas:

 

EJEMPLO: Obtener el número 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%’));

Predicados de comparación cuantificados (ALL, ANY) Permiten comparar un valor con un conjunto de valores.
Predicados de comparación cuantificados (ALL, ANY)
Permiten comparar un valor con un conjunto de valores.
constructor_fila predicado_comparación {all | any | some}
(expresión_tabla)
•  
El predicado de comparación cuantificado con ALL se evalúa
a cierto si lo es para todas las filas de la expresión de tabla (si
la tabla está vacía también se evalúa a cierto).
•  El predicado de comparación cuantificado con ANY o SOME
se evalúa a cierto si lo es para alguna fila de la expresión de
tabla (si la tabla está vacía se evalúa a falso).
(*) el predicado IN es idéntico al predicado de comparación
cuantificado = ANY.
EJEMPLO: Obtener el nombre de los puertos y de los ciclistas que los hayan ganado
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
condición a su condición negada y añadiendo un NOT.
NOT ( P.pendiente < ALL (SELECT P1.pendiente FROM Puerto P1 ) )
Predicado EXISTS EXISTS (expresión_tabla) •  El predicado EXISTS se evalúa a cierto si la expresión
Predicado EXISTS
EXISTS (expresión_tabla)
•  El predicado EXISTS se evalúa a cierto si la expresión SELECT
devuelve al menos una fila.
•  En general, IN y EXISTS son intercambiables y se pueden
eliminar haciendo consultas a múltiples tablas e igualando por
claves ajenas.
EJEMPLO: Obtener el nombre de aquellos ciclistas que han llevado un maillot de un premio
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 )
EJEMPLO: Obtener el nombre de los ciclistas que no han ganado etapas. SELECT nombre FROM
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: Práctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas con subconsultas
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas con subconsultas
de las bases de datos Ciclismo y Música
Uso de EXISTS para cuantificación universal (NO HAY EN SQL) ∀ X F(X) ≡ 
Uso de EXISTS para cuantificación 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 cuantificación universal Obtener el nombre de los profesores que
El lenguaje SQL
Problemas con la cuantificación universal
Obtener el nombre de los profesores que imparten todas las
asignaturas de su departamento de mas de 6 créditos.
¿qué pasa si en el departamento de
un profesor no hay asignaturas de
mas de 6 créditos?

El lenguaje SQL

¿qué pasa si en el departamento de un profesor PX no hay asignaturas de mas
¿qué pasa si en el departamento de
un profesor PX no hay asignaturas
de mas de 6 créditos?

FALSO para todo valor de AX

de mas de 6 créditos? FALSO para todo valor de AX { PX.nombre| Profesor (PX) ∧

{PX.nombre| Profesor (PX)

AX

{ PX.nombre| Profesor (PX) ∧ ∀ AX ( (Asignatura (AX) ∧ AX.cod_dep= PX.cod_dep ∧ (AX.teoría+AX.prac)>6)

((Asignatura (AX) AX.cod_dep= PX.cod_dep (AX.teoría+AX.prac)>6)

DX (Docencia (DX)

DX.cod_pro = PX.cod_pro DX.cod_asg = AX.cod_asg) ) }

¡El profesor PX aparecería en el resultado de la consulta!

= PX.cod_pro ∧ DX.cod_asg = AX.cod_asg) ) } ¡El profesor PX aparecería en el resultado de

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 créditos!.

{PX.nombre| Profesor (PX)

AX (Asignatura (AX) AX.cod_dep= PX.cod_dep (AX.teoría+AX.prac)>6)

AX ( (Asignatura (AX) AX.cod_dep= PX.cod_dep (AX.teoría+AX.prac)>6)

DX (Docencia (DX) DX.cod_pro = PX.cod_pro DX.cod_asg = AX.cod_asg) ) }

El lenguaje SQL. SELECT PX.nombre SQL FROM Profesor PX WHERE EXISTS (SELECT * FROM Asignatura
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.teoría+AX.prac)>6)
AND
NOT EXISTS (SELECT * FROM Asignatura AX
WHERE AX.cod_dep= PX.cod_dep AND (AX.teoría+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 cuantificación universal ∀ X F(X) ≡  ∃ X  F(X)
Uso de EXISTS para cuantificación universal
∀ X F(X)
≡  ∃ X  F(X)
Obtener el nombre del ciclista que ha ganado todas las
etapas de más 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)
Para poder expresar esta consulta en SQL se convertirá en: “Obtener el nombre del ciclista
Para poder expresar esta consulta en SQL se convertirá en:
“Obtener el nombre del ciclista tal que no existe una etapa de
más 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 cuantificación universal ¿Qué pasa si no hay etapas de
Uso de “Coletillas” en consultas con
cuantificación universal
¿Qué pasa si no hay etapas de más de 200 km?
¡¡¡SALDRÍAN TODOS LOS CICLISTAS!!!
Solución:
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);
Ejercicios: Práctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas con cuantificación
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas con cuantificación
universal de las BDs Ciclismo y Música
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:
con cuantificación universal de las BDs Ciclismo y Música AUTOR (autor_id: tira(4), nombre: tira(35), nacionalidad:

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

Clave Primaria: {autor_id}

Biblioteca

LIBRO(id_lib: tira(10), titulo: tira(80), año: 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), año: d_cat, tematica: tira(20)) Clave Primaria: {cod_ob} Clave Ajena: {tematica}TEMA VNN: {titulo}

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

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

Consultas Agrupadas SELECT [ALL | DISTINCT] A 1i , A 2j , , A nk
Consultas Agrupadas
SELECT [ALL | DISTINCT] A 1i , A 2j ,
,
A nk | *
,
[WHERE condición]
[GROUP BY B 1 , B 2 ,
FROM R 1 , R 2 ,
R
n
,
B m ]
[HAVING condición]
GROUP BY: define grupos de tuplas en el conjunto de tuplas
seleccionadas por la condición WHERE. Los grupos se definen
por la igualdad de valor en los atributos de agrupación (B 1 , B 2 ,
,
B
m ).
HAVING: de los grupos definidos se seleccionan aquellos que
cumplen la condición expresada.

Consultas Complejas Relación Selección-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 cláusula 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

Edad

Banesto

22

ONCE

25

PDM

32

Banesto

25

Kelme

28

ONCE

30

Kelme

29

Banesto

28

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 25  
 

Banesto

28

ONCE

25

 

Un Valor

ONCE

30

ONCE 30 por Grupo

por Grupo

   

PDM

32

PDM 32  
 

Kelme

29

Kelme

28

 

Entonces, para

La solución, es:

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

Nomeq

Edad

Banesto

25

ONCE

27,5

PDM

32

Kelme

28,5

Consultas Agrupadas

EJEMPLO: Obtener el número total de profesores de cada departamento

Profesor

cod_pro

nombre

tel!fono

cod_dep

JCC

Juan C. Casamayor R!denas

7796

DSIC

 
 

cod_ dep

 

RFC

Robert Fuster i Capilla

6789

MAT

DS IC 3
DS IC

DS IC

3

JBD

Jos"V. Benlloch Dualde

5760

DISCA

 

MAF

Mar#a Alpuente Frasnedo

3560

DSIC

M

AT

1

CPG

Cristina P"rez Guillot

7439

IDM

CPG Cristina P " rez Guillot 7439 IDM DIS CA 2

DIS CA

2

JTM

Jos"M. Torralba Mart#nez Ignacio Gil Pechu$n

4590

OEM

JTM Jos " M. Torralba Mart # nez Ignacio Gil Pechu $ n 4590 OEM IDM

IDM

1

OEM 2

OEM

2

IGP

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 número 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

c

o d _ d e p

JBD

Jos"V. Benlloch Dualde

5760

DISCA

JBD Jos " V. Benlloch Dualde 5760 DISCA   D S I C 3
 

D

S I C

3

MAF

Mar#a Alpuente Frasnedo

3560

DSIC

 

CPG

Cristina P "rez Guillot

7439

IDM

JTM

Jos"M. Torralba Mart#nez Ignacio Gil Pechu$n

4590

OEM

IGP

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

EJEMPLO INCORRECTO:

 
 

SELECT nomeq,

 

nombre, AVG(edad)

FROM Ciclista GROUP BY nomeq;

La regla sintáctica que aplican los sistemas relacionales para asegurar el buen funcionamiento de las consultas agrupadas es la siguiente:

“En la selección de una consulta agrupada, sólo pueden aparecer referencias a columnas por las cuales se agrupa, referencias a funciones agregadas o literales”.

se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula
se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula
se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula
se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula
se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula
se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula
se agrupa, referencias a funciones agregadas o literales”. GROUP y WHERE Si se incluye la cláusula

GROUP y WHERE

Si se incluye la cláusula where, la aplicación de esta cláusula se produce previamente a la agrupación.

4
4

SELECT nomeq, AVG(edad)

FROM Ciclistacláusula se produce previamente a la agrupación. 4 SELECT nomeq, AVG(edad) 2 3 WHERE edad >

2 3
2
3

WHERE edad > 25

GROUP BY nomeq;

Evaluación: 1) Se seleccionan n tuplas de las relaciones que cumplan la condición de la
Evaluación:
1) Se seleccionan n tuplas de las relaciones que
cumplan la condición de la cláusula WHERE.
2) En el conjunto de tuplas seleccionadas se definen
grupos basados en el valor de los atributos de
agrupación.
3) De los grupos definidos se seleccionan los que
cumplen la condición de la cláusula HAVING.
GROUP, WHERE y HAVING La cláusula HAVING sólo puede ir en consultas agrupadas y es
GROUP, WHERE y HAVING
La cláusula HAVING sólo puede ir en consultas agrupadas y
es similar a WHERE, pero en un orden diferente:
1º) Condición WHERE (se usa para las filas)
2º) Agrupamiento y cálculo de valores agregados
3º) Condición HAVING (se usa para los grupos)
En la cláusula HAVING sólo podrán aparecer directamente
referencias a columnas por las cuales se agrupan o a
funciones agregadas.
EJEMPLO: Obtener el nombre de cada equipo y la edad media de sus ciclistas con
EJEMPLO: Obtener el nombre de cada equipo y la edad
media de sus ciclistas con más de 25 años, de aquellos
equipos con más de 3 corredores mayores de 25 años.
SELECT nomeq, AVG(edad)
FROM Ciclista
WHERE edad > 25
GROUP BY nomeq
HAVING COUNT(dorsal) > 3;
EJEMPLO: Obtener el nombre del ciclista y el número de puertos que ha ganado, siendo
EJEMPLO: Obtener el nombre del ciclista y el número 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;
Ejercicios: Práctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de “consultas agrudapas” de
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de “consultas agrudapas” de las BDs
Ciclismo y Música
COMBINACIONES DE TABLAS Existen otras formas de combinar varias tablas en consultas y todas ellas,
COMBINACIONES DE TABLAS
Existen otras formas de combinar varias tablas en consultas y
todas ellas, junto con las ya vistas, dan lugar a una “expresión de
tabla”.
Existen, en definitiva, varias formas de combinar dos tablas en el
lenguaje SQL:
√ 
√ 
→  Incluir varias tablas en la cláusula from.
→  Uso de subconsultas en las condiciones de las cláusulas
where o having.
→  Combinaciones conjuntistas de tablas: utilizando
operadores de la teoría de conjuntos para combinar las
tablas.
→  Concatenaciones de tablas: utilizando diferentes formas
variantes del operador concatenación del Álgebra
Relacional.

El Lenguaje Estándar SQL

Operador

 

Álgebra

 

SQL

Relacional

 

Selección

R

Donde F

 

SELECT

FROM R WHERE F

Proyección

R

[A i , A j

,

A

k ]

SELECT A i , A j

,

A k FROM R

 

Producto

R 1 x R 2 ,

 

x R n

SELECT

FROM R 1 , R 2 ,

,

R n, o

Cartesiano

 

SELECT

FROM

R 1 CROSS JOIN

R 2 ,

,

CROSS JOIN R n

 

Concatenación

R 1

R 2

SELECT

FROM R 1 NATURAL JOIN R 2

Unión

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

Intersección

R 1 R 2

 

SELECT * FROM R 1 INTERSECT SELECT * FROM R 2

COMBINACIONES CONJUNTISTAS DE TABLAS Corresponden a los operadores unión, intersección y diferencia del Álgebra
COMBINACIONES CONJUNTISTAS DE TABLAS
Corresponden a los operadores unión, intersección 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
número
de
elementos
seleccionados, mismo orden, mismos tipos y nombres).
UNION expresión_tabla union [ALL] término_tabla Realiza la unión de las filas de las tablas provenientes
UNION
expresión_tabla union [ALL] término_tabla
Realiza la unión de las filas de las tablas provenientes de las
dos expresiones.
Se permitirán o no duplicados según se incluya o no la opción
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).
UNION
Ejemplo 2. Obtener el nombre de todo el personal
(profesores y directores de departamento).
SELECT director
FROM Departamento
UNION
SELECT nombre
FROM Profesor
INTERSECT expresión_tabla intersect término_tabla Realiza la intersección de las filas de las tablas provenientes de
INTERSECT
expresión_tabla intersect término_tabla
Realiza la intersección 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
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
EXCEPT expresión_tabla except término_tabla En Oracle es Minus Realiza la diferencia de las filas de
EXCEPT
expresión_tabla except término_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
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.
Concatenación de tablas SELECT [ALL | DISTINCT] A 1i , ,A ,A 2j , nk
Concatenación de tablas
SELECT [ALL | DISTINCT] A 1i ,
,A
,A
2j ,
nk | *
FROM R , R ,
concatenación de tablas
[WHERE condición]
[GROUP BY B 1 , B 2 ,
[HAVING condición]
,
B m ]
 concatenación interna: INNER JOIN
 concatenación externa: OUTER JOIN
Concatenación de tablas Corresponden a variantes del operador concatenación del Álgebra Relacional. •  Producto
Concatenación de tablas
Corresponden a variantes del operador concatenación del
Álgebra Relacional.
•  Producto cartesiano – CROSS JOIN
•  Concatenación interna – NATURAL JOIN
•  Concatenación externa – LEFT, RIGHT, FULL
•  Concatenación unión – UNION JOIN
Producto Cartesiano (CROSS JOIN) referencia_tabla1 cross join referencia_tabla2 ≡ SELECT * from referencia_tabla1,
Producto Cartesiano
(CROSS JOIN)
referencia_tabla1 cross join referencia_tabla2
SELECT * from referencia_tabla1,
referencia_tabla2
 La tabla resultado de la operación CROSS JOIN es
el producto cartesiano de las dos tablas operandos.
Concatenación Interna referencia_tabla1 [natural] [inner] join referencia_tabla2 [on expresión_condicional | using
Concatenación Interna
referencia_tabla1 [natural] [inner] join referencia_tabla2
[on expresión_condicional | using (comalista_columna) ]
tabla1 join tabla2 on expresión_condicional
SELECT * FROM tabla1, tabla2
WHERE expresión_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 condición
expresada se evalúe a cierta.
 Inner Join
USING: combina una fila de cada operando cuando el
valor en las columnas comunes es idéntico.

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

concatenación

PX.cod_pro = DX.cod_pro GROUP BY cod_pro concatenación SELECT cod_pro, nombre, COUNT (cod_asg) FROM Profesor

SELECT cod_pro, nombre, COUNT (cod_asg)

FROM Profesor NATURAL JOIN Docencia

GROUP BY cod_pro

FROM Profesor NATURAL JOIN Docencia GROUP BY cod_pro de Profesor y Docencia    Natural Join

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)

Concatenación JOIN

USING

SELECT [ALL | DISTINCT] A 1 , A 2 ,

A n | *

FROM

tabla1 JOIN tabla2 USING (C 1 , C 2 ,

,

C n )

[WHERE condición]

[GROUP BY B 1 , B 2 ,

[HAVING condición]

,

B m ]

(1)

(2)

(3)

(4)

se concatenan las tuplas de tabla1 y tabla2 que tienen el mismo valor en los

se concatenan las tuplas de tabla1 y tabla2 que tienen el

mismo valor en los atributos comunes C 1 , C 2 , ,

C n

Es útil cuando no interesa que las relaciones se concatenen por todos los atributos del mismo nombre (NATURAL JOIN).

Concatenación JOIN ON SELECT [ALL | DISTINCT] A 1 , A 2 , A n
Concatenación JOIN
ON
SELECT [ALL | DISTINCT] A 1 , A 2 ,
A n | *
(1)
FROM
tabla1 JOIN tabla2 ON condición1
(2)
[WHERE condición2]
(3)
[GROUP BY B 1 , B 2 ,
,
B m ]
(4)
[HAVING condición]
se concatenan las tuplas de tabla1 y tabla2 que cumplen
condición1
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:
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
Concatenación Externa referencia_tabla [natural] {left [outer] | right [outer] | full [outer] } JOIN
Concatenación Externa
referencia_tabla [natural]
{left [outer] |
right [outer] |
full [outer]
} JOIN referencia_tabla
[on expresión_condicional | using
(comalista_columna) ]
FULL, se muestran las tuplas no concatenadas de tabla1 y tabla2
Cont. Concatenación externa sobre la izquierda: tabla1 left join tabla2 on expresión_condicional (Concat. interna de
Cont. Concatenación externa sobre la izquierda:
tabla1 left join tabla2 on expresión_condicional
(Concat. interna de tabla1 y tabla2)
union
(tuplas de la tabla1 que no están en la concatenación 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.
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión
Concatenación Unión referencia_tabla union join referencia_tabla Crea una tabla donde el esquema es la unión

Concatenación Unión

referencia_tabla union join referencia_tabla

Crea una tabla donde el esquema es la unión 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ª
EJERCICIO 33: Obtener nombre de todos los equipos
indicando cuantos ciclistas tiene cada uno
1ª Opción (errónea) – 21 filas
SELECT e.nomeq, count(c.dorsal)
FROM Equipo E, Ciclista C
El equipo PDM
con 0 ciclistas no
aparece
WHERE E.nomeq=C.nomeq
GROUP BY e.nomeq
2ª Opción 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;
EJERCICIO 33: Obtener nombre de todos los equipos indicando cuantos ciclistas tiene cada uno 3ª
EJERCICIO 33: Obtener nombre de todos los equipos
indicando cuantos ciclistas tiene cada uno
3ª Opción 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