1
Lenguaje SQL
Jorge Lloret
José Carlos Ciria
Eladio Domínguez
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
SQL básico
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Historia de SQL 3
• SQL-86. Primer estándar. Elaborado por ANSI e ISO
• SQL-92. Versión revisada y expandida del SQL-86
• SQL:1999
• SQL:2003
• SQL:2006
• SQL:2008
• SQL:2011
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Características de SQL 4
• El lenguaje SQL permite
– Definir datos
– Consultar datos
– Modificar datos
• Incluye, además, la posibilidad de:
– Definir vistas de la base de datos
– Especificar la seguridad y autorizaciones
– Definir restricciones de integridad
– Especificar control de transacciones
• Empezamos con las consultas a base de datos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
5
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Consultas básicas en SQL 6
• Una consulta SQL tiene la forma
SELECT <columnas> cláusula SELECT
FROM <tablas> cláusula FROM
WHERE <condición> cláusula WHERE
• donde
• <columnas> es una lista de nombres de columnas
recuperadas por la consulta
• <tablas> es una lista de tablas necesarias para
procesar la consulta
• <condición> es una condición que identifica las
filas recuperadas por la consulta
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Base de datos bdcancion1 7
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Requisitos de la base de datos bdcancion1 8
• En esta base de datos, suponemos que
– Puede haber canciones distintas que tengan el
mismo título
– Para cada nombre de álbum hay un único álbum.
Es decir, no admitimos en la base de datos dos o
más álbumes distintos que tengan el mismo
nombre
– ¡Pero el nombre de un álbum puede aparecer
repetido en filas distintas!
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Consultas sin cláusula WHERE 9
• Muestra la información de todas las canciones
SELECT *
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Resultado del ejemplo 10
• Muestra la información de todas las canciones
SELECT * FROM cancion
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del resultado de una consulta 11
• El resultado de una consulta es una tabla que se
obtiene a partir de las tablas indicadas en la cláusula
FROM
• Si la cláusula WHERE se omite, se seleccionan todas
las filas
• Si en la cláusula SELECT se escribe sólo un asterisco,
se seleccionan todas las columnas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Consultas sin cláusula WHERE 12
• Muestra los títulos de las canciones
SELECT titulo FROM cancion
titulo
1 Salomé
2 Torero
3 Speed demon
4 Para que tú no llores
así
5 Camino Soria
6 Bad
7 Bad
8 Sólo hay un lugar
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Consultas sin cláusula WHERE 13
• Muestra los títulos de las canciones, sin repetidos
SELECT DISTINCT titulo FROM cancion
titulo
1 Salomé
2 Torero
3 Speed demon
4 Para que tú no llores
así
5 Camino Soria
Bad
8 Sólo hay un lugar
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 14
• Muestra los títulos de los álbumes, sin repetidos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ordenación 15
• Ejemplo. Muestra los títulos de las canciones
ordenados por fecha de publicación, empezando por la
canción más antigua
SELECT titulo
FROM cancion
ORDER BY fecha
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Resultado del ejemplo 16
• Muestra los títulos de las canciones ordenados por
fecha, empezando por la canción más antigua
SELECT titulo FROM cancion ORDER BY fecha
titulo fecha
fecha
7 Bad 01/01/84
19/3/2002
5 Camino Soria 01/01/87
19/3/2002
3 Speed demon 31/08/87
31/8/1987
6 Bad 31/08/87
1/2/2006
1 Salomé 19/03/02
1/1/1987
2 Torero 19/03/02
31/8/1987
4 Para que tú no 01/02/06
1/1/1984
llores así
8 Sólo hay un lugar 02/07/08
2/7/2008
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la ordenación 17
• Podemos ordenar el resultado de una consulta por
una o más columnas
• Las columnas de ordenación no tienen por qué
aparecer en la cláusula SELECT de la consulta
• Una columna de ordenación se indica mediante su
nombre o mediante su posición en la cláusula SELECT
• Así, son equivalentes
– SELECT titulo FROM cancion ORDER BY titulo
– SELECT titulo FROM cancion ORDER BY 1
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la ordenación 18
• Si la ordenación es descendente, lo indicamos
mediante la palabra clave DESC después del nombre
de la columna en la cláusula ORDER BY
• Si la ordenación es ascendente, lo indicamos
mediante la palabra clave ASC después del nombre de
la columna en la cláusula ORDER BY.
• Si no indicamos ordenación ascendente o
descendente, entonces la ordenación es ascendente
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicios 19
• Muestra los títulos de las canciones ordenados por
fecha de publicación, empezando por la canción más
reciente
• Muestra los títulos de las canciones ordenados en
sentido ascendente por título y, para el mismo título,
en sentido descendente por fecha de publicación
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Consultas sin cláusula WHERE 20
• Muestra los datos de las canciones en el siguiente
orden: Intérprete, título y álbum en el que aparecen
SELECT interprete, titulo, album
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Consultas sin cláusula WHERE 21
SELECT interprete, titulo, album
FROM cancion
interprete titulo album
1 Chayanne Salomé Grandes
éxitos
2 Chayanne Torero Grandes
éxitos
3 Michael Speed Bad
Jackson demon
4 Antonio Para que tú Vengo
Carmona no llores así venenoso
5 Gabinete Camino Camino Soria
Caligari Soria
6 Michael Bad Bad
Jackson
7 U2 Bad The
unforgettable
fire
8 Pignoise Sólo hay un Cuestión de
lugar gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
22
Expresiones condicionales, numéricas y de
cadena de caracteres
C. J. Date, H. Darwen, A guide to the SQL standard(4th ed), Addison-
Wesley, 1997. Capítulos 7, 11 y 12
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condiciones 23
• Vamos a ver cuatro tipos de condiciones que aparecen
en la cláusula WHERE:
– Condición de comparación
– Condición LIKE
– Condición IS NULL
– Condiciones formadas por la unión por los
operadores AND, OR y NOT de otras condiciones
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condición de comparación 24
• Ejemplo. Canciones del intérprete Chayanne
SELECT *
FROM cancion
WHERE interprete='Chayanne'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas forman parte del resultado? 25
SELECT * FROM cancion
WHERE interprete='Chayanne'
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
• ¿Se selecciona la fila 3 1?
2
• Para la fila 132, ¿es cierta la condición de la clausula
WHERE?
• Es decir, ¿se cumple la condición?
interprete='Chayanne' No,
¡Sí!
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Y el resto de las filas? 26
¿interprete='Chayanne'?
titulo interprete album fecha descargas
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Solución 27
SELECT * FROM cancion
WHERE interprete='Chayanne'
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cómo se determina el resultado de una
consulta con cláusula WHERE? 28
• Para cada fila de la tabla indicada en la cláusula
FROM, se comprueba si se cumple la condición
expresada en la cláusula WHERE
• En el resultado de una consulta aparecen aquellas
filas que cumplen la condición expresada en la
cláusula WHERE
• Esas filas se dice que son las filas seleccionadas por la
consulta
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la condición de comparación 29
• La forma básica de una condición de comparación es
expresiónEscalar operadorComparacion expresiónEscalar
• El operador de comparación tiene que ser uno de los
siguientes:
= < > <= >= <> (distinto)
• Por ahora, admitimos como expresiones escalares
nombres de columnas y valores de columnas
• Ejemplos de condiciones de comparación son:
• interprete='Chayanne'
• descargas >= 1000
• titulo = interprete
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condiciones de comparación 30
• Ejemplo. Canciones que se titulan igual que su álbum
SELECT *
FROM cancion
WHERE titulo=album
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas se seleccionan? 31
SELECT * FROM cancion
WHERE titulo=album
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 32
• Álbumes donde NO hay ninguna canción cuyo título sea
Torero
SELECT album
FROM cancion
WHERE titulo <> 'Torero'
¡Ojo, en esta consulta aparece como respuesta el álbum
Grandes éxitos!
¿Por qué pasa esto?
Con lo visto hasta ahora, no sabemos resolver esta
consulta.
Volveremos sobre ella más adelante.
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condición LIKE 33
• Ejemplo. Canciones de un álbum cuyo título incluye la
palabra venenoso
SELECT *
FROM cancion
WHERE album LIKE '%venenoso%'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del operador LIKE 34
• Sirve para comprobar si una cadena de caracteres es
conforme con un patrón
• La sintaxis es:
expresiónDeCadena LIKE patron
• El patrón puede incluir los siguientes caracteres
comodín:
– El guión bajo, '_', para representar exactamente un
carácter
– El símbolo de porcentaje, '%', para representar
cero o más caracteres
– El resto de caracteres se representan a ellos
mismos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplos del operador LIKE 35
• Una fila cumple la condición
album LIKE '%venenoso%'
– si el valor de la columna album contiene la palabra
venenoso en cualquier lugar dentro de ella
• Una fila cumple la condición
album LIKE '___'
– si el valor de la columna album es una palabra de
tres letras
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas se seleccionan? 36
SELECT * FROM cancion
WHERE album LIKE '%venenoso%'
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 37
• Muestra los nombres de los álbumes que tienen
exactamente tres letras
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio para rascarse la cabeza 38
• Muestra los nombres de los álbumes que contienen el
carácter %
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condición IS NULL 39
• Ejemplo. Canciones cuyo número de descargas es
desconocido
SELECT *
FROM cancion
WHERE descargas IS NULL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de los valores nulos 40
• En SQL hay definido un marcador especial, llamado
null, que sirve para indicar que no conocemos el valor
real de una columna
• De manera informal a ese marcador especial se le
denomina valor nulo
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de los valores nulos 41
• Por ejemplo, el valor nulo en la columna descargas
para la canción Torero, significa que desconocemos
cual es el número de descargas de esa canción
– Al tratarse de un número sabemos que existe y, en
particular, podría ser igual a cero
– Pero el valor nulo no es lo mismo que el valor cero
• Por ejemplo, el valor nulo en la columna teléfonoFijo
puede significar
– No hay teléfono fijo
– Hay teléfono fijo pero no tenemos constancia de
cuál es
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del operador IS NULL 42
• Sirve para comprobar si una columna tiene un valor
nulo
• La sintaxis es:
expresiónEscalar IS [NOT] NULL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas se seleccionan? 43
SELECT * FROM cancion
WHERE descargas IS NULL
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condiciones compuestas 44
• Ejemplo. Canciones del intérprete Chayanne en el
álbum Grandes éxitos
SELECT *
FROM cancion
WHERE interprete='Chayanne' AND
album='Grandes éxitos'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas se seleccionan? 45
SELECT * FROM cancion
WHERE interprete='Chayanne' AND album='Grandes éxitos'
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Operadores AND, OR y NOT 46
• Ejemplo. Canciones del álbum Grandes éxitos y del
álbum Bad
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué interpretaciones tiene la consulta? 47
• Interpretación 1. Canciones que están en alguno de
los dos álbumes es decir, en Grandes éxitos o en Bad
• Interpretación 2. Canciones (aunque sean canciones
distintas) con el mismo título que están tanto en el
álbum Grandes éxitos como en el álbum Bad
• Interpretación 3. Canciones (deben ser canciones
iguales) que están en esos dos álbumes. Esto puede
suceder, por ejemplo, en el álbum original y en un
recopilatorio.
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Operadores AND, OR y NOT 48
• Ejemplo. Canciones del álbum Grandes éxitos y del
álbum Bad
• Solución
SELECT *
FROM cancion
WHERE album='Grandes éxitos' OR album='Bad'
• Esta solución corresponde a la interpretación 1
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Operadores AND, OR, NOT 49
• Las condiciones se construyen uniendo mediante los
operadores AND, OR y NOT otras condiciones
• ¿Cuándo se selecciona una fila?
Si la cláusula WHERE tiene Entonces una fila se
la forma selecciona si
WHERE c1 AND c2 la fila cumple las condiciones
c1 y c2
WHERE c1 OR c2 la fila cumple la condición c1 o
la fila cumple la condición c2
WHERE NOT c1 la fila no cumple la condición
c1
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 50
• Álbumes donde aparece la canción Torero y la canción
Salomé (se entiende que aparecen ambas canciones)
SELECT album
FROM cancion
WHERE titulo = 'Torero' AND titulo='Salomé'
¡Ojo, esta consulta no devuelve ninguna fila!
¿Por qué pasa esto?
Con lo visto hasta ahora, no sabemos resolver esta
consulta.
Volveremos sobre ella más adelante.
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
51
Expresiones y funciones para la cláusula SELECT
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Expresiones escalares numéricas 52
• Mostrar el título de cada canción y las descargas
previstas para el año que viene, sabiendo que las
descargas previstas son el 10% de las descargas
registradas en la base de datos
SELECT titulo, 0.1*descargas
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las expresiones escalares 53
• Pueden ser
– Numéricas. Dan como resultado un número
– De cadena de caracteres
• Algunos ejemplos de expresiones numéricas:
0.1*descargas
2*descargas+100
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 54
SELECT titulo, 0.1*descargas FROM cancion
titulo descargas
1 Salomé 2000
2 Torero
3 Speed demon 20
4 Para que tú no llores 100
así
5 Camino Soria 200
6 Bad 100
7 Bad 40
8 Sólo hay un lugar 80
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Expresiones escalares de cadena de caracteres 55
• Ejemplo. Mostrar las canciones con el siguiente formato:
<titulo>. <interprete>. Del álbum: <album>
• Solución
SELECT titulo||'. '||interprete||'. Del álbum:'|| album
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 56
SELECT titulo||'. '||interprete||'. Del álbum: '||album
FROM cancion
• Primero, vemos el resultado en la primera fila
titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
titulo ||'. ' ||interprete||'. Del álbum: ' ||album
Salomé. Chayanne. Del álbum: Grandes éxitos
• Resultado(sólo la primera fila)
titulo||'. '||interprete||'. Del álbum: '||album
1 Salomé. Chayanne. Del álbum: Grandes éxitos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Y el resto de las filas? 57
SELECT titulo||'. '||interprete||'. Del álbum: '||album
FROM cancion
titulo||'. '||interprete||'. Del álbum: '||album
1 Salomé. Chayanne. Del álbum: Grandes éxitos
2
3
4
5
6
7
8
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del operador de concatenación 58
• Sirve para unir expresiones escalares de cadena de
caracteres
• Se representa mediante dos barras verticales ||
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Alias de columna 59
• Para cambiar la cabecera de una columna recuperada por
la cláusula SELECT, usamos un alias de columna
• Ejemplo
Alias de
SELECT columna
titulo||'. '||interprete||'. Del álbum: '||album tema
FROM cancion
• El resultado de la consulta sin alias aparece así:
TITULO||'.'||INTERPRETE||'.DELÁLBUM:'||ALBUM
1 Salomé. Chayanne. Del álbum: Grandes éxitos
• El resultado de la consulta con alias aparece así:
tema
1 Salomé. Chayanne. Del álbum: Grandes éxitos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 60
• Álbumes de cantantes para los que uno de los
apellidos es Jackson. El resultado debe presentarse
con el formato
<album> publicado el <fecha>
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Funciones de agregación 61
• Sirven para generar un valor a partir de valores de
una columna
• Ejemplo. Muestra el número medio de descargas
SELECT AVG(descargas)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 62
descargas
• Se calcula la media de estos valores
1 20000
• El valor nulo no se tiene en cuenta
2
3 200
4 1000
• (20000+200+1000+2000+1000+400
+800)/7=3628,57
5 2000
6 1000
7 400
• El resultado es:
8 800 AVG(descargas)
1 3628,57
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las funciones de agregación 63
• Primero se seleccionan las filas a las que se aplica la
función de agregación. Como no hay cláusula WHERE,
el cálculo se aplica a todas las filas
• A continuación, se forman grupos con esas filas
• Como no hay cláusula GROUP BY (la veremos más
adelante), se forma un único grupo, que incluye todas
las filas seleccionadas
• Para ese grupo, el cálculo se realiza sobre la columna
de la función de agregación
• En nuestro ejemplo, se calcula la media de todos los
valores de la columna descargas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las funciones de agregación 64
• Las funciones de agregación operan sobre un conjunto
de valores escalares dando lugar a un solo valor
• Las funciones que se usan con más frecuencia y sus
significados son:
Función Significado
COUNT Número de valores escalares en la columna
SUM Suma de los valores escalares en la columna
AVG Media de los valores escalares en la columna
MAX Máximo de los valores escalares en la
columna
MIN Mínimo de los valores escalares en la
columna
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las funciones de agregación 65
• La función COUNT(*) cuenta el número de filas en el
grupo.
• Excepto para la función COUNT(*), el argumento
puede ir precedido de la palabra DISTINCT, que
significa que los valores repetidos se eliminan antes
de aplicar la función.
• La alternativa a DISTINCT es ALL, que se asume si no
se especifica nada
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 66
Recuerda: Puede haber canciones
distintas que tengan el mismo título
• Número de canciones
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta ¿Correcta? Resultado
SELECT COUNT(titulo)
FROM cancion
SELECT COUNT(*)
FROM cancion
SELECT COUNT(DISTINCT titulo)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 67
Recuerda: Puede haber canciones
distintas que tengan el mismo título
• Número de títulos de canciones distintos
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta ¿Correcta? Resultado
SELECT COUNT(titulo)
FROM cancion
SELECT COUNT(*)
FROM cancion
SELECT COUNT(DISTINCT titulo)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 68
Recuerda: Para cada nombre de
álbum hay un único álbum.
• Número de álbumes
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta ¿Correcta? Resultado
SELECT COUNT(album)
FROM cancion
SELECT COUNT(*)
FROM cancion
SELECT COUNT(DISTINCT album)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 69
Recuerda: Para cada nombre de
álbum hay un único álbum.
• Número de títulos de álbumes distintos
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta ¿Correcta? Resultado
SELECT COUNT(album)
FROM cancion
SELECT COUNT(*)
FROM cancion
SELECT COUNT(DISTINCT album)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 70
• Número total de descargas
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta ¿Correcta? Resultado
SELECT SUM(descargas)
FROM cancion
SELECT COUNT(descargas)
FROM cancion
SELECT COUNT(DISTINCT descargas)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 71
• Número de canciones en el álbum Bad
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
72
Nuevas condiciones para la cláusula WHERE
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Más sobre condiciones de comparación 73
• Canciones con el mismo número de descargas que la
canción Para que tú no llores así
SELECT *
FROM cancion
WHERE descargas = (SELECT
número de descargas de Para que tú…
descargas
FROM cancion
WHERE titulo='Para que tú no llores así')
Este tipo de consultas se denominan consultas anidadas
porque incluyen una consulta dentro de otra consulta
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 74
SELECT * FROM cancion
WHERE descargas=(SELECT
1000descargas FROM cancion
WHERE titulo='Para que tú no llores así')
º titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Comparación y funciones de agregación 75
• Título y número de descargas de la canción con
menor número de descargas
SELECT titulo, MIN(descargas) No funciona!
FROM cancion
• ¿Por qué no funciona?
• Si en la cláusula SELECT hay una función de agregación
y la consulta no incluye la cláusula GROUP BY (la
veremos más adelante) entonces en la cláusula SELECT
sólo se pueden incluir referencias a columnas dentro de
funciones de agregación
• En este ejemplo, no podemos poner en la clausula SELECT
la columna titulo, ya que no está incluida dentro de
ninguna función de agregación
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Comparación y funciones de agregación 76
• Título y número de descargas de la canción con
menor número de descargas
SELECT titulo, descargas No funciona!
FROM cancion
WHERE descargas = MIN(descargas)
• ¿Por qué no funciona?
• SQL no admite una expresión de comparación entre una
columna y una función de agregación
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Comparación y funciones de agregación 77
• Título y número de descargas de la canción con
menor número de descargas
SELECT titulo, descargas Funciona!
FROM cancion
WHERE descargas = (SELECT
MIN(descargas)
MIN(descargas) FROM cancion)
¿Por qué funciona?
SQL admite una comparación de igualdad entre una
columna y una consulta siempre que la consulta produzca
como resultado una fila o ninguna.
Si la consulta no produce ninguna fila, se interpreta que el
resultado es una fila, cuyos valores son todos nulos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 78
SELECT titulo, descargas FROM cancion
200 MIN(descargas) FROM cancion)
WHERE descargas=(SELECT
º titulo descargas
interprete album fecha descargas
3 Salomé
1 Speed demon 200
Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 79
SELECT titulo, descargas FROM cancion
WHERE descargas= 200
titulo descargas
3 Speed demon 200
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la condición de comparación con una
consulta 80
• La forma básica de una condición de comparación con
una consulta SQL es:
expresiónEscalar operadorComparacion (consultaSQL)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Restricciones de la comparación con una
consulta 81
• La consultaSQL y la expresiónEscalar deben cumplir
las siguientes restricciones:
1. el número de columnas de la consulta consultaSQL
es exactamente uno
2. la consulta consultaSQL produce como resultado
una fila o ninguna. Si no produce ninguna fila, se
interpreta que el resultado es una fila, cuya única
columna tiene valor nulo
3. el tipo de dato de expresiónEscalar es compatible
con el tipo de dato de la columna de la consulta
consultaSQL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplos de condición de comparación con
consultas 82
1. descargas=(SELECT descargas
FROM cancion
WHERE titulo='Para que tú no llores así')
2. descargas=(SELECT MIN(descargas) FROM cancion)
Las dos condiciones anteriores son correctas porque ambas
cumplen las tres restricciones indicadas en la transparencia
anterior
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 83
• ¿Son válidas las siguientes condiciones?
– En la columna Puntos que incumple, señala los puntos
incumplidos, de entre los señalados en la transparencia
Restricciones de la comparación con una consulta
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Condición Puntos que ¿Correcta?
incumple
descargas=(SELECT descargas,
titulo FROM cancion)
descargas=(SELECT descargas
FROM cancion)
descargas=(SELECT titulo
FROM cancion WHERE
titulo='Torero')
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Condición de pertenencia. Predicado IN 84
• Ejercicio pendiente. Álbumes donde aparece la canción
Torero y la canción Salomé (se entiende que aparecen
ambas canciones)
SELECT album No funciona,
FROM cancion
WHERE titulo = 'Torero' AND titulo='Salomé'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Reescribimos la consulta… 85
• La consulta es equivalente a:
– Encontrar los álbumes que cumplen las dos
siguientes condiciones
• El álbum tiene la canción Torero
• El álbum pertenece a la lista de los álbumes que
tienen la canción Salomé
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Reescribimos la consulta… 86
• ¿Cómo escribimos cada condición?
– El álbum tiene la canción Torero
titulo = 'Torero'
– El álbum pertenece a la lista de los álbumes que
tienen la canción Salomé
album IN (SELECT album
FROM cancion
WHERE titulo='Salomé')
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Y la consulta es… 87
SELECT album
FROM cancion
WHERE titulo = 'Torero' AND
album IN (SELECT album
FROM cancion
WHERE titulo='Salomé')
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 88
WHERE titulo = 'Torero' AND
album IN (SELECT albuméxitos'
'Grandes FROM cancion WHERE titulo='Salomé')
º titulo descargas
interprete album fecha descargas
3 Salomé
1 Speed demon 200
Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la condición de pertenencia con IN 89
• La forma básica de una condición IN es
expresiónEscalar IN(consultaSQL)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Restricciones de la condición de pertenencia con
IN 90
• La consultaSQL y la expresiónEscalar deben cumplir
las siguientes restricciones:
1. el número de columnas de la consulta consultaSQL
es exactamente uno
2. la consulta consultaSQL puede producir como
resultado cualquier número de filas.
3. el tipo de dato de expresiónEscalar es compatible
con el tipo de dato de la columna de la consulta
consultaSQL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplo de condición de pertenencia con IN 91
1. album IN (SELECT album
FROM cancion
WHERE titulo='Salomé')
Esta condición es correcta porque cumple las tres restricciones
indicadas en la transparencia anterior
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 92
• ¿Son válidas las siguientes condiciones de pertenencia
con IN?
– En la columna Puntos que incumple, señala los puntos
incumplidos, de entre los señalados en la transparencia
Restricciones de la condición de pertenencia con IN
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Comparación de igualdad Puntos que ¿Correcta?
incumple
descargas IN (SELECT descargas,
titulo FROM cancion)
descargas IN (SELECT descargas
FROM cancion)
descargas IN (SELECT titulo
FROM cancion WHERE
titulo='Torero')
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Significado de la condición IN 93
• Dada la consulta
SELECT *
FROM T
WHERE expresiónEscalar IN (consultaSQL)
• Para averiguar si una fila f de la tabla T se selecciona:
– Se calcula el resultado de consultaSQL
– Si el valor de la fila f en expresiónEscalar es uno de
los valores del resultado de consultaSQL, la fila se
selecciona
– En otro caso, la fila no se selecciona
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplo de significado de la condición IN 94
• Por ejemplo, dada la consulta
SELECT album
FROM cancion
WHERE titulo = 'Torero' AND
album IN (SELECT album FROM cancion
WHERE titulo='Salomé')
• Una fila f de la tabla cancion se selecciona si
– el título de la canción es Torero
– su álbum pertenece a la lista de los álbumes que son
el resultado de la consulta SELECT album FROM cancion
WHERE titulo='Salomé'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio pendiente 95
• Álbumes donde NO hay una canción cuyo título sea
Torero
SELECT album No funciona,
FROM cancion
WHERE titulo <> 'Torero'
• ¿Por qué? Porque en la respuesta aparece el álbum
'Grandes éxitos', que no debería aparecer
º titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Reescribimos la consulta… 96
• La consulta es equivalente a:
– Encontrar los álbumes que cumplen la siguiente
condición
• El álbum no pertenece a la lista de los álbumes
que tienen la canción Torero
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Reescribimos la consulta… 97
• ¿Cómo escribimos la condición?
– El álbum no pertenece a la lista de los álbumes que
tienen la canción Torero
album NOT IN (SELECT album
FROM cancion
WHERE titulo='Torero')
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Y la consulta es… 98
SELECT album
FROM cancion
WHERE album NOT IN (SELECT album
FROM cancion
WHERE titulo='Torero')
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 99
WHERE album NOT IN
'Grandes
(SELECT albuméxitos'
FROM cancion WHERE titulo='Torero')
º titulo descargas
interprete album fecha descargas
3 Salomé
1 Speed demon 200
Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
3 Speed demon Michael Bad 31/8/1987 200
Jackson
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
5 Camino Soria Gabinete Camino Soria 1/1/1987 2000
Caligari
6 Bad Michael Bad 31/8/1987 1000
Jackson
7 Bad U2 The 1/1/1984 400
unforgettable
fire
8 Sólo hay un lugar Pignoise Cuestión de 2/7/2008 800
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
100
Cláusulas GROUP BY y HAVING
C. J. Date, H. Darwen, A guide to the SQL standard(4th ed), Addison-
Wesley, 1997. Capítulo 11
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Cláusula GROUP BY 101
• Mostrar, para cada álbum, el número de canciones
que tiene
SELECT album, COUNT(*)
FROM cancion
GROUP BY album
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 102
• Primero, se forman los grupos de acuerdo con la
cláusula GROUP BY
• ¿A qué grupo pertenece la primera fila?
º titulo interprete album fecha descargas
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
• Respuesta: Al grupo del álbum Grandes éxitos
• Grupo del álbum Grandes éxitos
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 103
• Primero, se forman los grupos de acuerdo con la
cláusula GROUP BY
• ¿A qué grupo pertenece la segunda fila?
º titulo interprete album fecha descargas
2 Torero Chayanne Grandes 19/3/2002
éxitos
• Respuesta: Al grupo del álbum Grandes éxitos
• Grupo del álbum Grandes éxitos
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Grupos 104
• Grupo del álbum Grandes éxitos
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
• Grupo del álbum Bad
3 Speed demon Michael Bad 31/8/1987 200
Jackson
6 Bad Michael Bad 31/8/1987 1000
Jackson
• Grupo del álbum Vengo venenoso
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio. ¿Cuál es el resto de los grupos? 105
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 106
• Para cada grupo, aplicamos la función COUNT(*)
• Grupo del álbum Grandes éxitos COUNT(*) es 2
1 Salomé Chayanne Grandes 19/3/2002 20000
éxitos
2 Torero Chayanne Grandes 19/3/2002
éxitos
• Grupo del álbum Bad COUNT(*) es 2
3 Speed demon Michael Bad 31/8/1987 200
Jackson
6 Bad Michael Bad 31/8/1987 1000
Jackson
• Grupo del álbum Vengo venenoso COUNT(*) es 1
4 Para que tú no llores Antonio Vengo 1/2/2006 1000
así Carmona venenoso
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¡Por fin! El resultado 107
• En el resultado, se muestra UNA ÚNICA fila por grupo
• Album Grandes éxitos COUNT(*) es 2
Grandes 2
éxitos
• Álbum Bad COUNT(*) es 2
Bad 2
• Grupo del álbum Vengo venenoso COUNT(*) es 1
Vengo 1
venenoso
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Y el resultado al completo 108
album COUNT(*)
Grandes 2
éxitos
Bad 2
Vengo 1
venenoso
Camino Soria 1
The 1
unforgettable
fire
Cuestión de 1
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 109
• Para cada intérprete y álbum en el que aparece el
intérprete, muestra cuántas canciones del álbum
corresponden a ese intérprete. La solución es:
SELECT album, interprete, COUNT(*)
FROM cancion
GROUP BY album, interprete
• Responde a estas preguntas
– ¿Qué grupos se forman?
– ¿Cuánto vale la función COUNT(*) en cada grupo?
– ¿Cuál es el resultado?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Respuesta 110
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Definición de columna limpia 111
• Veamos las restricciones sintácticas en presencia de
GROUP BY y HAVING
• Para ello, previamente definimos columna limpia
• Llamamos columna limpia a aquella que aparece en la
cláusula SELECT sin estar envuelta en ninguna función
de agregación
• Por ejemplo, en la consulta
SELECT album, COUNT(titulo)
FROM cancion
GROUP BY album
• La columna album es una columna limpia y la
columna titulo no es limpia
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Restricciones de la cláusula GROUP BY 112
• Deben cumplirse las siguientes reglas
1. Si en la cláusula SELECT hay funciones de
agregación y columnas limpias, entonces
• Debe haber cláusula GROUP BY y debe incluir
las columnas limpias de la cláusula SELECT
2. Si en la cláusula SELECT hay funciones de
agregación y no hay columnas limpias, entonces
• No es obligatorio que haya cláusula GROUP BY,
pero puede haberla
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 113
• ¿Son válidas las siguientes consultas?
– En la columna Puntos que incumple, señala los puntos
incumplidos, de entre los señalados en la transparencia
Restricciones de la cláusula GROUP BY
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta Reglas que ¿Correcta?
incumple
SELECT album, interprete, COUNT(*)
FROM cancion
GROUP BY album
SELECT album, COUNT(*)
FROM cancion
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 114
• ¿Son válidas las siguientes consultas?
– En la columna Puntos que incumple, señala los puntos
incumplidos, de entre los señalados en la transparencia
Restricciones de la cláusula GROUP BY
– En la columna ¿Correcta? pon una si la respuesta es
correcta y una en otro caso
Consulta Reglas que ¿Correcta? Resultado
incumple
SELECT COUNT(*)
FROM cancion
SELECT COUNT(*)
FROM cancion
GROUP BY album
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las sentencias con GROUP BY(1/2) 115
• La cláusula GROUP BY funciona del siguiente modo:
– Primero se seleccionan las filas a las que se aplica
la función de agregación.
– En el ejemplo, como no hay cláusula WHERE,
el cálculo se aplica a todas las filas
– A continuación, se forman grupos con esas filas de
acuerdo con la cláusula GROUP BY
– En el ejemplo, se forman tantos grupos de
filas como valores distintos tiene la columna
album
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las sentencias con GROUP BY(2/2) 116
• La cláusula GROUP BY funciona del siguiente modo
(continúa):
– Cada fila pertenece a un único grupo
– Para cada grupo, se realizan los cálculos indicados
en la función de agregación
– En nuestro ejemplo, se calcula cuántas filas
hay para cada grupo
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Cláusula HAVING 117
• Mostrar el nombre de los álbumes con dos o más
canciones
SELECT album, COUNT(*)
FROM cancion
GROUP BY album
HAVING COUNT(*)>=2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas forman parte del resultado? 118
• Partimos de las filas que resultan de la consulta sin la
cláusula HAVING
album COUNT(*)
Grandes 2
éxitos
Bad 2
Vengo 1
venenoso
Camino Soria 1
The 1
unforgettable
fire
Cuestión de 1
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas forman parte del resultado? 119
SELECT album, COUNT(*) FROM cancion
GROUP BY album HAVING COUNT(*)>=2
• Partimos de las filas que resultan de la consulta sin la
cláusula HAVING
album COUNT(*)
1 Grandes éxitos 2
• ¿Se selecciona la fila 1 ?
• Para la fila 1 , ¿es cierta la condición de la cláusula
HAVING?
• Es decir, ¿se cumple la condición?
COUNT(*)>=2 ¡Sí!
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas forman parte del resultado? 120
SELECT album, COUNT(*) FROM cancion
GROUP BY album HAVING COUNT(*)>=2
• Revisamos todas las filas obtenidas después de aplicar
la cláusula GROUP BY
album COUNT(*)
3 Vengo venenoso 1
• ¿Se selecciona la fila 3?
• Para la fila 3, ¿es cierta la condición de la cláusula
HAVING?
• Es decir, ¿se cumple la condición?
COUNT(*)>=2 No,
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Y el resto de las filas? 121
album COUNT(*)
Grandes 2
éxitos
Bad 2
Vengo 1
venenoso
Camino Soria 1
The 1
unforgettable
fire
Cuestión de 1
gustos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Cuál es el resultado? 122
album COUNT(*)
Grandes 2
éxitos
Bad 2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la cláusula HAVING 123
• Su sintaxis es
HAVING condición
• La cláusula HAVING sirve para seleccionar los grupos,
obtenidos después de aplicar la cláusula GROUP BY,
que cumplen condición y descartar aquellos grupos
que no la cumplen
• Habitualmente, la condición de la cláusula HAVING
incluye funciones de agregación. Ejemplos:
COUNT(*)>=2
SUM(descargas)<=2000
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicios 124
• Muestra los álbumes publicados en 2002, cuyo título
empieza por G y que tienen dos o más canciones.
Muestra los álbumes ordenados por título en sentido
descendente
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicios 125
• Muestra las canciones de los álbumes encontrados en
la consulta anterior. Muestra las canciones ordenadas
por título en sentido descendente
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Orden de evaluación de una consulta SQL 126
• Las cláusulas de una consulta SQL se evalúan en el
siguiente orden
1. Cláusula WHERE
2. Cláusula GROUP BY
3. Cláusula HAVING
4. Cláusula SELECT
5. Cláusula ORDER BY
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
127
Consultas conjuntistas
C. J. Date, H. Darwen, A guide to the SQL standard(4th ed), Addison-
Wesley, 1997. Capítulo 11
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
128
• Sirven para hacer operaciones conjuntistas entre
consultas
• Están basadas en las operaciones conjuntistas, es
decir, unión, diferencia e intersección
• En SQL estándar se usan los operadores UNION,
EXCEPT e INTERSECT
• En Oracle se usan los mismos operadores, menos
EXCEPT que es sustituido por MINUS
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Operador UNION 129
• Intérpretes que han publicado alguna canción en 2002
o en 1987
SELECT interprete
FROM cancion
WHERE TO_CHAR(fecha,'YYYY')='2002'
UNION
SELECT interprete
FROM cancion
WHERE TO_CHAR(fecha,'YYYY')='1987'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicio 130
• ¿De qué otras dos maneras sabes resolver este
ejercicio?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de las operaciones conjuntistas 131
• Las consultas involucradas en operaciones
conjuntistas deben cumplir:
– Las dos consultas deben tener el mismo número de
columnas
– Las columnas correspondientes en ambas
consultas tienen que ser de tipos de datos
compatibles
– Por columnas correspondientes se entiende
aquellas que ocupan la misma posición en la
cláusula SELECT de ambas consultas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la operación de unión 132
• La unión conjuntista no incluye filas repetidas en el
resultado
• Así, si una fila aparece m veces en la primera consulta
y n en la segunda, aparecerá una única vez en el
resultado
• Si queremos incluir filas repetidas, usamos el
operador UNION ALL
• Con el operador UNION ALL, si una fila aparece m
veces en la primera consulta y n en la segunda,
aparecerá m+n veces en el resultado
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Operador INTERSECT 133
• Intérpretes que han publicado alguna canción en 2002
y en 1987
SELECT interprete
FROM cancion
WHERE TO_CHAR(fecha,'YYYY')='2002'
INTERSECT
SELECT interprete
FROM cancion
WHERE TO_CHAR(fecha,'YYYY')='1987'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la operación de intersección 134
• La intersección conjuntista no incluye filas repetidas
en el resultado
• Así, si una fila aparece m veces en la primera consulta
y n en la segunda, aparecerá una única vez en el
resultado
• Si queremos incluir filas repetidas, usamos el
operador INTERSECT ALL
• Con el operador INTERSECT ALL, si una fila aparece m
veces en la primera consulta y n en la segunda,
aparecerá min(m,n) veces en el resultado
• El uso de INTERSECT ALL produce error en Oracle
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Operador MINUS 135
• Intérpretes que han publicado alguna canción en 2002
y no han publicado en 1987
SELECT interprete
FROM cancion
WHERE TO_CHAR(fecha,'YYYY')='2002'
MINUS
SELECT interprete
FROM cancion
WHERE TO_CHAR(fecha,'YYYY')='1987'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la operación diferencia 136
• La diferencia conjuntista no incluye filas repetidas en
el resultado
• Así, si una fila aparece m veces en la primera consulta
y n en la segunda, m>n, aparecerá una única vez en
el resultado
• Si queremos incluir filas repetidas, usamos el
operador MINUS ALL
• Con el operador MINUS ALL, si una fila aparece m
veces en la primera consulta y n en la segunda,
aparecerá max(m-n,0) veces en el resultado
• En Oracle usamos MINUS en lugar de EXCEPT
• El uso de MINUS ALL produce error en Oracle
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Aplicaciones de las operaciones conjuntistas 137
• Título de cada canción junto con el número de
descargas. Si no se dispone del número de descargas,
tiene que aparecer la frase 'Sin info'
SELECT titulo, descargas ¡No funciona!¿Por qué?
FROM cancion
WHERE descargas IS NOT NULL
UNION
SELECT titulo, 'Sin info'
FROM cancion
WHERE descargas IS NULL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Aplicaciones de las operaciones conjuntistas 138
• Título de cada canción junto con el número de
descargas. Si no se dispone del número de descargas,
tiene que aparecer la frase 'Sin info'
• Una solución ¡Sí funciona!
SELECT titulo, TO_CHAR(descargas)
FROM cancion
WHERE descargas IS NOT NULL
UNION
SELECT titulo, 'Sin info'
FROM cancion
WHERE descargas IS NULL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Aplicaciones de las operaciones conjuntistas 139
• Título de cada canción junto con el número de
descargas. Si no se dispone del número de descargas,
tiene que aparecer la frase 'Sin info'
• ¿Se te ocurre otra solución?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Aplicaciones de las operaciones conjuntistas 140
• Título de cada canción junto con el número de
descargas, con el siguiente formato:
<titulo>. Descargas: <número> si hay descargas
<titulo>. Sin info si no se dispone de información
sobre el número de descargas
• Solución
SELECT titulo,'. Descargas: ', descargas
FROM cancion ¡No funciona!¿Por qué?
WHERE descargas IS NOT NULL
UNION
SELECT titulo, '. Sin info'
FROM cancion
WHERE descargas IS NULL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Aplicaciones de las operaciones conjuntistas 141
• Título de cada canción junto con el número de
descargas, con el siguiente formato:
<titulo>. Descargas: <número> si hay descargas
<titulo>. Sin info si no se dispone de información
sobre el número de descargas
• Solución
SELECT titulo||'. Descargas: '||descargas
FROM cancion ¡Funciona!
WHERE descargas IS NOT NULL
UNION
SELECT titulo||'. Sin info'
FROM cancion
WHERE descargas IS NULL
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Conjuntistas y ordenación 142
• Si queremos ordenar el resultado de una consulta
conjuntista, añadimos una única cláusula ORDER BY al
final de la consulta
• Ejemplo. En una consulta anterior, ordena por título
SELECT titulo, TO_CHAR(descargas) ¡Funciona!
FROM cancion
WHERE descargas IS NOT NULL
UNION
SELECT titulo, 'Sin info'
FROM cancion
WHERE descargas IS NULL
ORDER BY titulo
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Conjuntistas y ordenación 143
• Pero esta consulta ¡No funciona!¿Por qué?
SELECT titulo||'. Descargas: '||descargas
FROM cancion
WHERE descargas IS NOT NULL
UNION
SELECT titulo||'. Sin info'
FROM cancion
WHERE descargas IS NULL
ORDER BY titulo
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Conjuntistas y ordenación 144
• En presencia de operadores de concatenación,
tenemos que
– usar un alias de columna para ordenar
– o bien ordenar indicando la posición en la cláusula
SELECT de la columna por la que se ordena
• Ejemplo. Título de cada canción junto con el número
de descargas, con el siguiente formato:
<titulo>. Descargas: <número> si hay descargas
<titulo>. Sin info si no se dispone de información
sobre el número de descargas
(ver solución en la siguiente transparencia)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Conjuntistas y ordenación 145
• Usamos el alias de columna tituloydescargas
¡Funciona!
SELECT titulo||'. Descargas: '||descargas
tituloydescargas
FROM cancion
WHERE descargas IS NOT NULL
UNION
SELECT titulo||'. Sin info'
FROM cancion
WHERE descargas IS NULL
ORDER BY tituloydescargas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
146
Join de tablas
C. J. Date, H. Darwen, A guide to the SQL standard(4th ed), Addison-
Wesley, 1997. Capítulo 11
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Join de tablas 147
• A partir de ahora, vamos a usar la base de datos
bdCancion2, que contiene más de una tabla.
• En concreto, contiene las tablas:
– cancion
– album
– interprete
– descargas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
bdCancion2 148
cancion
id titulo idAlbum idInter genero
prete
1 Salomé 1 1 latino
2 Torero 1 1 latino
3 Speed demon 2 2 pop
4 Para que tú no 3 3 pop
llores así
5 Camino Soria 4 4 pop
6 Bad 2 2 pop
7 Bad 5 5 pop
8 Sólo hay un lugar 6 6 rock
*Identificador de una canción con los datos de su título, el identificador del álbum donde
aparece la canción, el identificador de su intérprete y el género de la misma*
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
bdCancion2 149
album
id titulo fechaPubl
1 Grandes éxitos 19/3/2002
2 Bad 31/8/1987
3 Vengo venenoso 1/2/2006
4 Camino Soria 1/1/1987
5 The unforgettable fire 1/1/1984
6 Cuestión de gustos 2/7/2008
*Identificador de un álbum junto con su título
y la fecha en la que se publicó*
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
bdCancion2 150
interprete
id nombre pais
1 Chayanne Puerto Rico
2 Michael Jackson EEUU
3 Antonio Carmona España
4 Gabinete Caligari España
5 U2 Irlanda
6 Pignoise España
*Identificador de un intérprete junto con los datos
de su nombre y el país donde nació *
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
bdCancion2 151
descargas
idCancion fecha numero precio
1 19/03/02 20000 1
1 02/01/04 1000 1
1 04/10/08 200 0,8
2 04/10/08 10 1
3 01/09/07 300 2
3 02/09/07
6 04/10/08 300 0,25
7 02/09/07 500 0,5
*Identificador de una canción junto con una fecha en la que ha habido
descargas por Internet de esa canción, el número de descargas que ha
habido en esa fecha y el precio en euros que el cliente ha pagado por
cada una de las descargas *
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Requisitos de la base de datos bdCanción2 152
• En esta base de datos, suponemos que
– Puede haber canciones distintas que tengan el
mismo título
– Puede haber álbumes distintos que tengan el
mismo título
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué es una columna de identificación? 153
• Es una columna tal que filas distintas de una tabla
siempre tienen valores distintos en esa columna
• Es aconsejable que todas las tablas tengan una
columna de identificación
• En la base de datos bdCancion2, las columnas de
identificación son
– id en la tabla cancion
– id en la tabla interprete
– id en la tabla album
• Ejercicio. ¿La columna idCancion es columna de
identificación de la tabla descargas?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Join de tablas 154
• Sirve para combinar filas de una tabla con filas de
otra tabla
• Ejemplo. Mostrar el nombre de cada canción junto con
el nombre de su intérprete
SELECT *
FROM cancion, interprete
• ¿Cuántas filas hay en la respuesta?
• ¿Observas alguna fila inesperada en el resultado?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
155
SELECT * FROM cancion, interprete
cancion x
interprete
id titulo idAlbum idInter genero id nombre
prete
1 Salomé 1 1 latino 1 Chayanne
1 Salomé 1 1 latino 2 Michael
Jackson
1 Salomé 1 1 latino 3 Antonio
Carmona
1 Salomé 1 1 latino 4 Gabinete
Caligari
1 Salomé 1 1 latino 5 U2
1 Salomé 1 1 latino 6 Pignoise
2 Torero 1 1 latino 1 Chayanne
2 Torero 1 1 latino 2 Michael
Jackson
… … … … … … …
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del join de tablas 156
• Cuando especificamos dos tablas en la cláusula FROM
de una consulta, indicamos el producto cartesiano de
las dos tablas.
• El resultado es una tabla que consiste en todas las
posibles filas ab tal que ab es la concatenación de una
fila a de una tabla con una fila b de la otra tabla
• Después de hacer el producto cartesiano, disponemos
de una ÚNICA tabla
• Aplicamos lo que sabemos sobre consultas de
una única tabla.
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué debemos añadir a la consulta? 157
• En nuestro ejemplo, hay que descartar las parejas
inesperadas.
• Es decir, he de seleccionar unas filas y descartar
otras. Luego uso la cláusula WHERE
• Para ello
– selecciono las filas para las que el valor de
[Link] es igual al valor de
[Link]
– esta condición se incluye en la cláusula WHERE
WHERE [Link]=[Link]
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Qué filas se seleccionan? 158
WHERE [Link]=[Link]
cancion x
interprete
id titulo idAlbum idInter genero id nombre
prete
1 Salomé 1 1 latino 1 Chayanne
1 Salomé 1 1 latino 2 Michael
Jackson
1 Salomé 1 1 latino 3 Antonio
Carmona
1 Salomé 1 1 latino 4 Gabinete
Caligari
1 Salomé 1 1 latino 5 U2
1 Salomé 1 1 latino 6 Pignoise
2 Torero 1 1 latino 1 Chayanne
2 Torero 1 1 latino 2 Michael
Jackson
… … … … … … …
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Resultado con todas las columnas 159
cancion x
interprete
id titulo idAlbum idInter genero id nombre
prete
1 Salomé 1 1 latino 1 Chayanne
2 Torero 1 1 latino 1 Chayanne
3 Speed 2 2 pop 2 Michael
demon Jackson
4 Para que tú 3 3 pop 3 Antonio
no llores Carmona
así
5 Camino 4 4 pop 4 Gabinete
Soria Caligari
6 Bad 2 2 pop 2 Michael
Jackson
7 Bad 5 5 pop 5 U2
8 Sólo hay un 6 6 rock 6 Pignoise
lugar
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Resultado final 160
Mostrar el título de cada canción junto con el nombre de su
intérprete
SELECT [Link], [Link]
FROM cancion, interprete
WHERE [Link]=[Link]
titulo nombre
Salomé Chayanne
Torero Chayanne
Speed demon Michael Jackson
Para que tú no llores Antonio Carmona
así
Camino Soria Gabinete Caligari
Bad Michael Jackson
Bad U2
Sólo hay un lugar Pignoise
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Variables de rango 161
• En consultas sobre dos o más tablas, debemos usar
variables de rango para cualificar las columnas
• Podemos usar como variable de rango
– El nombre de la tabla
– Una variable definida en la cláusula FROM
• Así, en la consulta anterior
SELECT [Link], [Link]
FROM cancion, interprete
WHERE [Link]=[Link]
• La tabla cancion y la tabla interprete actúan como
variables de rango
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Variable de rango definida en la cláusula FROM 162
• Definimos una variable de rango en la cláusula FROM
de esta forma:
• FROM cancion c
• Así, la consulta anterior queda:
SELECT [Link], [Link]
FROM cancion c, interprete i
WHERE [Link]=[Link]
• Aquí,
– c es una variable de rango para la tabla canción
– i es una variable de rango para la tabla interprete
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
¿Para qué sirve una variable de rango? 163
• Una variable de rango sirve para:
– Acortar la forma de referirse a las tablas
– Facilitar la comprobación de la corrección de
consultas que involucran dos o más tablas
– Aclarar la expresión de una consulta
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Uso imprescindible de variables de rango 164
• Las variables de rango son imprescindibles
– para evitar ambigüedad en las columnas de la
cláusula SELECT
– en consultas donde necesitamos trabajar con dos
copias de la misma tabla
– en consultas correlacionadas (ver Apéndice)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Evitar ambigüedad en las columnas 165
• Mostrar el identificador de cada canción junto con el
identificador de su intérprete
SELECT [Link], [Link]
FROM cancion c, interprete i
WHERE [Link]=[Link]
• Si queremos ver nombres distintos de las columnas
en la respuesta, usamos alias de columna
SELECT [Link] idCancion, [Link] idInterprete
FROM cancion c, interprete i
WHERE [Link]=[Link]
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Trabajo con dos copias de la misma tabla 166
• Sobre la base de datos bdCancion1, encuentra parejas
de canciones que se titulan igual en dos álbumes
distintos
SELECT c1.*, c2.*
FROM cancion1 c1, cancion1 c2
WHERE [Link]=[Link] AND
[Link]<>[Link]
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Formas de join del estándar SQL 167
• En el estándar SQL, se han definido varios tipos de
join
– t1 JOIN t2 ON (condición)
– t1 CROSS JOIN t2
– t1 NATURAL JOIN t2
– t1 JOIN t2 USING (columna)
• Vamos a explicar en detalle el join
– t1 JOIN t2 ON (condición)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Join con cláusula ON 168
Mostrar el título de cada canción junto con el nombre de su
intérprete
SELECT [Link], [Link]
FROM cancion c JOIN interprete i
ON([Link]=[Link])
Equivale a:
SELECT [Link], [Link]
FROM cancion c, interprete i
WHERE [Link]=[Link]
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del join mediante la cláusula ON 169
• Si se usa un SELECT *, entonces
– las columnas comunes aparecen repetidas en el
resultado
– en primer lugar aparecen las columnas de la
primera tabla (en el orden en que aparecen en ella)
y luego las de la segunda (en el orden en que
aparecen en ella)
• La consulta
SELECT cols FROM t1 JOIN t2 ON (condicion)
equivale a
SELECT cols FROM t1, t2 WHERE condicion
• Se recomienda usar siempre este join
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ampliación del join del estándar SQL 170
• En la cláusula FROM, podemos usar consultas SQL en
lugar de tablas
• Diferencia entre el número total de descargas de la
canción 1 y de la canción 2
SELECT t1.a-t2.a
FROM (SELECT SUM(numero) a FROM descargas
WHERE idCancion=1) t1, (SELECT SUM(numero)
a FROM descargas WHERE idCancion=2) t2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
OUTER JOIN 171
• Sirve para emparejar filas que, con un join ordinario,
se quedan sin pareja
• En el estándar SQL, se han definido varios tipos de
outer join:
– t1 LEFT OUTER JOIN t2 ON (condición)
– t1 RIGHT OUTER JOIN t2 ON (condición)
– t1 FULL OUTER JOIN t2 ON (condición)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplo 172
• Muestra todas las canciones con su número total de
descargas. Si una canción no tiene descargas,
muestra el valor nulo
SELECT [Link], SUM([Link]) total
FROM cancion c JOIN descargas d ON
([Link]=[Link])
GROUP BY [Link]
• ¿Es correcta esta consulta?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Respuesta a la consulta 173
titulo suma
Bad 800
Salomé 21200
Speed demon 300
Torero 10
• ¿Por qué la consulta es incorrecta?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplo 174
• Propongamos una nueva solución
• Muestra todas las canciones con su número total de
descargas. Si una canción no tiene descargas,
muestra el valor nulo
SELECT [Link], [Link], SUM([Link]) total
FROM cancion c JOIN descargas d ON
([Link]=[Link])
GROUP BY [Link], [Link]
• ¿Es correcta esta consulta?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Respuesta a la consulta 175
id titulo suma
6 Bad 300
7 Bad 500
1 Salomé 21200
3 Speed 300
demon
2 Torero 10
• ¿Ha mejorado la consulta? Pero…¿es correcta?
• ¿Dónde están las canciones 4,5, 8 ?
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplo 176
• Muestra todas las canciones con su número total de
descargas. Si una canción no tiene descargas,
muestra el valor nulo
SELECT [Link], [Link], SUM([Link]) total
FROM cancion c LEFT OUTER JOIN descargas d ON
([Link]=[Link])
GROUP BY [Link], [Link]
• ¿Es correcta esta consulta? Sí
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
177
• Respuesta a la consulta
id titulo suma
6 Bad 300
7 Bad 500
5 Camino Soria
4 Para que tú no llores así
1 Salomé 21200
8 Sólo hay un lugar
3 Speed demon 300
2 Torero 10
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Explicación del resultado de la consulta 178
• Al tratarse de un LEFT OUTER JOIN, las filas de la
tabla de la izquierda que no emparejan con ninguna
fila de la tabla de la derecha aparecen una vez en el
resultado, emparejadas con una fila de valores nulos
• Así, en este ejemplo, las filas de la tabla cancion sin
pareja en la tabla descargas se completan en el
resultado con una fila de valores nulos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejemplo de RIGHT OUTER JOIN 179
• Muestra todas las canciones con su número total de
descargas. Si una canción no tiene descargas,
muestra el valor nulo
SELECT [Link], [Link], SUM([Link]) total
FROM descargas d RIGHT OUTER JOIN cancion c
ON ([Link]=[Link])
GROUP BY [Link], [Link]
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Explicación del resultado de la consulta 180
• Al tratarse de un RIGHT OUTER JOIN, las filas de la
tabla de la derecha que no emparejan con ninguna fila
de la tabla de la izquierda aparecen una vez en el
resultado, emparejadas con una fila de valores nulos
• Así, en este ejemplo, las filas de la tabla cancion sin
pareja en la tabla descargas se completan en el
resultado con una fila de valores nulos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca del FULL OUTER JOIN 181
• En el FULL OUTER JOIN, se hace tanto un RIGHT
OUTER JOIN como un LEFT OUTER JOIN
• Así,
– las filas de la tabla de la derecha que no emparejan
con ninguna fila de la tabla de la izquierda
aparecen una vez en el resultado, emparejadas con
una fila de valores nulos y
– las filas de la tabla de la izquierda que no
emparejan con ninguna fila de la tabla de la
derecha aparecen una vez en el resultado,
emparejadas con una fila de valores nulos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Ejercicios 182
• Identificador de cada canción junto con el número
total de descargas. Si no se dispone del número de
descargas, tiene que aparecer la frase 'Sin info'. Si
una canción no tiene descargas, tiene que aparecer
cero como número de descargas
• Considera este caso:
descargas
idCancion fecha numero precio
1 19/03/02 20000 1
2 04/10/08
3 01/09/07 300 2
3 02/09/07
• Además, la canción 4 no tiene descargas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
183
• ¿Qué respuesta o respuestas puedes esperar para el
ejercicio anterior?
idCancion total
1
2
3
4
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
184
Lenguaje de Manipulación de Datos(LMD)
C. J. Date, H. Darwen, A guide to the SQL standard(4th ed), Addison-
Wesley, 1997. Capítulos 9 y 10
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Lenguaje de manipulación de datos(LMD) 185
• Sirve para añadir, borrar o modificar información de la
base de datos
• Usa las siguientes sentencias
– INSERT. Para añadir información
– DELETE. Para borrar información
– UPDATE. Para modificar información
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Añadir filas 186
• Añade un nuevo álbum a la base de datos. Su
identificador es el 10. Se titula Por la boca revive
el pez y fue lanzado el 1 de septiembre de 2006
INSERT INTO album VALUES
(10,'Por la boca revive el pez', '1/09/2006')
• Permite añadir una fila
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Añadir filas 187
• Añade un nuevo álbum a la base de datos. Su
identificador es el 11. Se titula Por la boca muere el
pez y desconocemos la fecha de lanzamiento
lista de columnas
INSERT INTO album(id, titulo, fechaPubl) VALUES
(11,'Por la boca muere el pez', null)
lista de valores
• Permite añadir una fila
• Para las columnas de la lista de columnas, el valor es
el de la posición correspondiente en la lista de valores
• Para las columnas no indicadas en la lista de
columnas, el valor es null
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la sentencia INSERT 188
• La sentencia
INSERT INTO tabla(listaColumnas) VALUES
(listaValores)
• Permite añadir una fila
• Para las columnas de la lista de columnas, el valor es
el de la posición correspondiente en la lista de valores
• Para las columnas no indicadas en la lista de
columnas, el valor en la fila es null
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Añadir filas 189
• Disponemos de la tabla
cancionPop(id, titulo, idInterprete, idAlbum)
• Guarda en la tabla cancionPop las canciones de
género pop
INSERT INTO cancionPop
SELECT id, titulo, idInterprete, idAlbum
FROM cancion
WHERE genero='pop'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la sentencia INSERT 190
• La sentencia
INSERT INTO tabla(listaColumnas)
consulta
• Permite añadir a una tabla todas las filas que son el
resultado de una consulta
• Para las columnas de la lista de columnas, el valor es
el de la columna correspondiente en la cláusula
SELECT de la consulta
• Para las columnas no indicadas en la lista de
columnas, el valor es null en todas las filas
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Modificar datos 191
• Modifica el título del álbum cuyo identificador es 10.
Su título es Por la boca vive el pez
UPDATE album
SET titulo='Por la boca vive el pez'
WHERE id=10
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la sentencia UPDATE 192
• Una sentencia UPDATE tiene la forma
UPDATE tabla
SET asignaValores
WHERE condición
• donde
• tabla es la tabla cuyas filas se van a modificar
• condición es una condición que identifica las filas de la
tabla que son modificadas
• asignaValores asigna nuevos valores a columnas de las
filas seleccionadas en la cláusula WHERE. Tiene la forma:
columna1= valor1,…, columnan= valorn
• Para las filas de la tabla indicada en la cláusula UPDATE que
cumplen la condición de la cláusula WHERE, hace las
modificaciones indicadas en la cláusula SET
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Borrar filas 193
• Borra el álbum cuyo identificador es 10
DELETE album
WHERE id=10
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de borrar filas 194
• La sentencia
DELETE tabla
WHERE condicion
• Borra todas las filas de la tabla indicada en la cláusula
DELETE que cumplen la condición de la cláusula
WHERE
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
195
Lenguaje de Definición de Datos(LDD)
C. J. Date, H. Darwen, A guide to the SQL standard(4th ed), Addison-
Wesley, 1997. Capítulo 8
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Lenguaje de definición de datos(LDD) 196
• Sirve para crear tablas y manipular su estructura
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Creación de tablas 197
• Crea la tabla album. Sus columnas son id de tipo
entero, titulo de tipo carácter de 20 caracteres y
fechaPubl de tipo fecha
CREATE TABLE album(
id INTEGER,
titulo VARCHAR2(20),
fechaPubl DATE)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la creación de tablas 198
• La sentencia de creación de una tabla es:
CREATE TABLE tabla
(nombreColumna1 tipoDato {NULL|NOT NULL}
[, nombreColumna2 tipoDato {NULL|NOT NULL},
…
nombreColumnam tipoDato {NULL|NOT NULL}])
• Para cada columna hay que indicar
– su nombre
– su tipo de dato. Los tipos de datos pueden ser INTEGER,
NUMBER, VARCHAR2(n) y DATE
– si admite valores nulos (escribiremos NULL) o si no los
admite (escribiremos NOT NULL)
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Creación de tablas 199
• Crea la tabla cancionPop. Contiene todas las
canciones de género pop
CREATE TABLE cancionPop AS
SELECT id, titulo, idInterprete, idAlbum
FROM cancion
WHERE genero='pop'
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Acerca de la creación de tablas 200
• Crea una tabla basada en una consulta
CREATE TABLE tabla(listaColumnas) AS
consulta
• Crea una tabla con las siguientes características
– Su nombre es tabla
– Sus columnas son las indicadas en la consulta y con los
mismos tipos de datos que éstas. El nombre de las
columnas es el indicado en listaColumnas. Si esta lista
no está presente, los nombres se toman de la cláusula
SELECT de la consulta
– Las filas de la tabla son todas las devueltas por la
consulta
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Renombrar una tabla 201
• Renombra la tabla cancionPop a cancionPop2
RENAME cancionPop TO cancionPop2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Borrar una tabla 202
• Borra la tabla cancionPop2
DROP TABLE cancionPop2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Añadir una columna a una tabla 203
• Añade la columna pais de tipo de dato carácter de 20
caracteres a la tabla interprete
ALTER TABLE interprete
ADD pais VARCHAR2(20)
• Si la tabla no está vacía, se añade la columna si su
restricción de nulos es NULL.
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Modificar la anchura de una columna de una tabla
204
• Amplia la anchura de la columna pais de la tabla
interprete. La nueva anchura es 50 caracteres
ALTER TABLE interprete
MODIFY pais VARCHAR2(50)
• Siempre se puede ampliar la anchura de una columna
• Se puede reducir la anchura de una columna si la
nueva longitud de la columna es mayor o igual que la
mayor longitud de los datos de la columna
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Modificar la restricción nulo/no nulo 205
• Cambia la restricción nulo de la columna pais de la
tabla interprete. Ahora en esa columna ningún valor
puede ser nulo
ALTER TABLE interprete
MODIFY pais NOT NULL
• Siempre se puede cambiar de la restricción NOT NULL
a la restricción NULL
• Se puede cambiar de la restricción NULL a la
restricción NOT NULL si en la columna no hay valores
nulos
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Renombrar una columna de una tabla 206
• Renombra la columna pais de la tabla interprete. El
nuevo nombre es pais2
ALTER TABLE interprete
RENAME COLUMN pais TO pais2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez
Borrar una columna de una tabla 207
• Borra la columna pais2 de la tabla interprete
ALTER TABLE interprete
DROP COLUMN pais2
2014 Jorge Lloret, José Carlos Ciria, Eladio Domínguez