0% encontró este documento útil (0 votos)
52 vistas104 páginas

Introducción al Lenguaje SQL y Consultas

El documento proporciona una introducción al lenguaje SQL, incluyendo su historia, características y estructura básica de consultas. Se explican conceptos fundamentales como la definición, consulta y modificación de datos, así como ejemplos de consultas SQL y condiciones en la cláusula WHERE. Además, se discuten aspectos de ordenación y ejercicios prácticos relacionados con la consulta de bases de datos.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
52 vistas104 páginas

Introducción al Lenguaje SQL y Consultas

El documento proporciona una introducción al lenguaje SQL, incluyendo su historia, características y estructura básica de consultas. Se explican conceptos fundamentales como la definición, consulta y modificación de datos, así como ejemplos de consultas SQL y condiciones en la cláusula WHERE. Además, se discuten aspectos de ordenación y ejercicios prácticos relacionados con la consulta de bases de datos.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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

También podría gustarte