Download SQL: Lenguaje de acceso a bases de datos

Document related concepts

SQL wikipedia , lookup

Lenguaje de definición de datos wikipedia , lookup

Microsoft SQL Server wikipedia , lookup

Lenguaje de manipulación de datos wikipedia , lookup

Null (SQL) wikipedia , lookup

Transcript
SQL: Lenguaje de acceso a bases de datos
Israel Herraiz
Universidad Politécnica de Madrid
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
1/92
Contenidos
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
2/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
3/92
Introducción a las bases de datos
Sobrecarga de información en el mundo actual
Demasiada información, solo puede tratarse por medios automáticos e
informáticos
Los datos pueden ser en cualquier formato y de cualquier tipo
Texto en diferentes idiomas
Imágenes
Sonidos
Vídeos
No podemos permitirnos perder información
La información tiene que estar almacenada de manera segura y
permanente
Accesible por múltiples usuarios
Fácilmente actualizable
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
4/92
Vamos a intentar hacer nuestro propio Facebook
¿Qué información y datos son la base del funcionamiento de Facebook?
¿Qué propiedades tienen que cumplir esos datos y su almacenamiento?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
5/92
Sistemas de gestión de base de datos
El sistema de gestión de base de datos (SGBD) controla la base de datos.
La mejor opción dependerá de las características de las que se encarga el
SGBD.
Almacenamiento
La base de datos está en uno o varios ficheros en el disco.
Número de usuarios
En la mayoría de las aplicaciones varios usuarios accederán a la vez a
la base de datos.
Seguridad
No todos los usuarios pueden acceder a los mismos datos, ni con los
mismos permisos. Los datos están protegidos de accesos no
autorizados.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
6/92
Sistemas de gestión de base de datos
(cont.)
Rendimiento
La cantidad de datos, el tipo de datos, el número de usuarios, influyen
en el rendimiento (la velocidad y los recursos que necesitará el SGBD
para dar una respuesta).
Escalabilidad
¿Es fácil migrar a una plataforma diferente? ¿Y añadir más capacidad
a la base de datos?
Coste
Algunos SGBD son muy caros, otros literalmente se pueden obtener de
manera gratuita.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
7/92
¿Cuáles son los SGBD más habituales?
SGBD
IBM DB2
Oracle
MS SQL Server
MySQL
PostgreSQL
MS Access
LibreOffice Base
Israel Herraiz, UPM
Coste
Medio
Alto
Bajo
Gratis
Gratis
Bajo
Gratis
Entorno
Profesionales
Profesionales, admón. pública
Web con servidores MS
Web con servidores LAMP
Profesionales, web
Doméstico
Doméstico
SQL: Lenguaje de acceso a bases de datos
8/92
¿Cómo organizamos los datos en la base de datos?
La actividad de decidir y organizar los datos que se almacenarán en la BD
se llama modelado de datos.
Se emplea el lenguaje SQL (Structrured Query Language).
SQL
Es un estándar ISO, aunque hay diferencias entre SGBD.
Es un lenguaje declarativo (qué se hace, no cómo se hace).
Insensible a mayúsculas.
Para modelar, definimos tablas y esquemas de datos, relaciones entre
los datos, y propiedades de manipulación de los datos.
Documentación de referencia
http://postgresql.org/docs/9.1/static/sql-commands.html
http://postgresql.org/docs/9.1/static/sql.html
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
9/92
¿Cómo funciona un SGBD?
Arquitectura cliente-servidor
PostgreSQL
El servidor escucha normalmente en el puerto 5432 TCP. En Ubuntu, la
versión 9.1 está configurada para escuchar en el puerto 5434 TCP.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
10/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
11/92
Primeros pasos en SQL
Estas operaciones se pueden hacer usando el gestor pgAdmin, o
directamente en SQL.
Crear una BD
CREATE DATABASE facebook;
Eliminar una BD
DROP DATABASE facebook;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
12/92
Tablas
Los datos se organizan en tablas. Las tablas tienen columnas, que pueden
ser de diferentes tipos (texto, números, fechas).
Crear y borrar una tabla
CREATE TABLE amigos (nombre VARCHAR, edad INT, email
VARCHAR);
DROP TABLE amigos;
Añadir registros a una tabla
INSERT INTO amigos VALUES (’Lionel Messi’,24,’[email protected]’);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
13/92
Extraer información
Los datos se extraen el comando SELECT
Leer todas las columnas
SELECT ∗ FROM amigos;
Leer solo algunas columnas
SELECT nombre, edad FROM amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
14/92
Filtrar información
Igual que seleccionamos columnas, podemos seleccionar solo las filas que
cumplan determinadas condiciones.
Ejemplo de filtro
SELECT ∗ FROM amigos WHERE edad < 25;
Distinto que
SELECT nombre, edad FROM amigos WHERE edad <> 24;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
15/92
Filtrar información
Ejercicio
Crear una tabla de amigos para la base de datos facebook.
Borrar previamente cualquier otra tabla que pudiera existir en la base
de datos.
Cada persona estará identificada por su nombre, edad, lugar de
residencia y dirección de correo electrónico
Tiene que contener al menos 10 personas (anota las consultas usadas
para añadir la información).
Escribe una consulta para encontrar a los menores de edad.
Escribe una consulta para encontrar a los mayores de 65 años.
Escribe una consulta para encontrar a las personas que no viven en
Madrid.
Escribe una consulta para obtener todos los datos de todas las
personas que están en la base de datos.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
16/92
Borrar información
Del mismo modo que seleccionamos información que cumple unos
determinados criterios, podemos borrar de manera selectiva registros.
Borrar todos los registros
DELETE FROM amigos;
Borrar todos los menores de edad
DELETE FROM amigos WHERE edad < 18;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
17/92
Diferencias entre DROP y DELETE
Pregunta
Hemos visto los comandos DROP y DELETE, que sirven para quitar
información de la base de datos.
¿Cuál es la diferencia entre ambos comandos?
¿En qué situaciones usarías uno y otro?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
18/92
Diferencias entre DROP y DELETE
Pregunta
Hemos visto los comandos DROP y DELETE, que sirven para quitar
información de la base de datos.
¿Cuál es la diferencia entre ambos comandos?
¿En qué situaciones usarías uno y otro?
Respuesta
DROP borra por completo una tabla de la base de datos, y no puede
eliminar de manera selectiva. Se usa si ya no necesitamos una tabla, si
estamos haciendo pruebas o si hay que volver a crear una tabla.
DELETE borra filas (registros) de una tabla, de manera selectiva, y deja el
resto de la tabla intacta. Se usa por ejemplo para eliminar un usuario de
nuestro sistema.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
18/92
Cambiar una tabla sin borrarla
Es habitual que necesitemos cambiar el esquema de una tabla para añadir
columnas, o eliminar columnas que ya no necesitemos. El resto de datos no
se toca en absoluto.
Añadir una columna
ALTER TABLE amigos ADD COLUMN telefono VARCHAR;
Eliminar una columna
ALTER TABLE amigos DROP COLUMN telefono;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
19/92
Actualizar información
Podemos cambiar datos específicos de una tabla sin tocar el resto, usando
el comando UPDATE.
Cambiar el lugar de residencia
UPDATE amigos SET residencia = ’Getafe’;
Bloquear menores de edad
UPDATE amigos SET estado = ’bloqueado’ WHERE edad < 18;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
20/92
Ejemplo
Ejercicio
Añade una columna para el número de teléfono y otra para que indique su
dirección de chat MSN
¿Cuál es el contenido de esas columnas justo tras haberlas creado?
Actualiza el número de teléfono de cada una de las personas de la
tabla amigos, usando cualquier número que se te ocurra.
Todos los amigos de la tabla usan su dirección de email para el chat
MSN, así que ambos datos coinciden. ¿Cómo puedes aprovechar los
datos que ya están en la tabla para actualizar las columna con la
dirección del chat?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
21/92
Test resumen de introducción a SQL
Responde a las siguientes preguntas
¿Qué comando se usa para crear una base de datos?
¿Qué comando se usa para crear una tabla? ¿Qué necesitamos
especificar?
¿Para qué sirve el comando DROP?
¿Cómo se extrae información de una base de datos?
¿Cuál es la diferencia entre UPDATE y ALTER?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
22/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
23/92
Introducción al diseño de bases de datos
¿Qué es una base de datos relacional?
Abstracción lógica que describe una colección de objetos interrelacionados.
Contiene tablas, y dentro de cada tabla, registros. Las tablas pueden
establecer relaciones entre sí.
¿Cómo creamos una base de datos?
Primero es necesario crear un modelo de datos. El modelo de datos
transforma la información que queremos manejar en un sistema relacional,
con tablas, columnas y relaciones entre tablas.
Hay tres niveles de modelado:
Conceptual
Lógico
Físico
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
24/92
Pasos en el modelado
Conceptual → Lógico → Físico
Pasos
Entidades
Relaciones
Atributos
Claves primarias
Claves ajenas
Tablas / Vistas
Columnas
Tipos de datos
Israel Herraiz, UPM
Conceptual
X
X
Lógico
X
X
X
X
SQL: Lenguaje de acceso a bases de datos
Físico
X
X
X
X
X
25/92
Modelado conceptual
En el modelado conceptual se definen entidades y relaciones.
Entidades
Objetos físicos o conceptos abstractos de la aplicación.
Por ejemplo, en una biblioteca: libros, autores, usuarios de la biblioteca,
editoriales.
Relaciones
Las relaciones definen cómo interactúan las entidades.
Por ejemplo, un libro puede tener varios autores, y un usuario puede prestar
varios libros.
Las relaciones se definen mediante claves primarias y ajenas.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
26/92
Modelado lógico
Atributos
Se definen qué atributos tienen las diferentes entidades.
Por ejemplo, un autor tiene un nombre, fecha de nacimiento. Un libro tiene
título, autor, ISBN.
La clave está en elegir qué atributos son importantes y cuáles irrelevantes,
para no añadir información innecesaria a la base de datos. Por ejemplo, es
irrelevante el color de ojos de un autor.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
27/92
Modelado físico
Detalles relacionados con el SGBD elegido
Implementación de la información anterior en SQL, usando los tipos de
datos proporcionados por el SGDB elegido. Es necesario especificar también
los nombres de las columnas.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
28/92
Modelado físico
Detalles relacionados con el SGBD elegido
Implementación de la información anterior en SQL, usando los tipos de
datos proporcionados por el SGDB elegido. Es necesario especificar también
los nombres de las columnas.
¿Por qué son necesarios tipos de datos?
¿Qué tipos de datos crees que existen en un SGBD?
¿Por qué son necesarios? ¿Por qué no simplemente poner todos los
campos de todas las tablas como texto?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
28/92
¿Cómo hacemos un buen modelo de datos?
El requisito fundamental es entender el problema que estamos
intentando modelar.
Para entender el problema es necesario realizar una ingeniería de
requisitos, preguntando a las personas que van a usar el sistema.
Una vez que tengamos la información necesaria para saber cómo
funciona el sistema, podemos empezar con las tres etapas del
modelado.
El modelado es iterativo. Conforme vamos obteniendo un modelo más
detallado será necesario volver atrás para cambiar algo decidido en una
etapa anterior.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
29/92
Claves primarias
Una clave primaria identifica de manera única a cada registro de una tabla.
Por ejemplo, el DNI podría ser una buena clave primaria para una base de
datos de personas.
Buena práctica
Indicar siempre una clave primaria para todas las tablas que creemos.
La clave primaria no puede estar vacía
Hay que asegurarse que no hay dos registros con la misma clave
primaria (o el SGBD dará error).
Una vez creada, la clave primaria no debería cambiarse nunca
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
30/92
Ejemplo
Clave primaria de la tabla amigos
CREATE TABLE amigos (nombre VARCHAR,
email VARCHAR,
edad INT,
PRIMARY KEY (email));
Añadir una clave primaria a una tabla ya creada
ALTER TABLE amigos ADD PRIMARY KEY (email);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
31/92
Claves ajenas
Una clave ajena se refiere a un registro de otra tabla. La clave ajena se
refiere normalmente a la clave primaria de otra tabla. Es necesario que se
refiera a un atributo único de otra tabla, pero no es imprescindible que sea
clave primaria.
La clave ajena también puede referirse a registros dentro de la misma tabla.
El registro al que se refiere la clave ajena tiene que existir siempre.
Un amigo puede tener una foto de su perfil
CREATE TABLE amigos (nombre VARCHAR,
email VARCHAR PRIMARY KEY,
foto_perfil INT REFERENCES fotos(foto_id),
edad INT);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
32/92
Más ejemplos con claves ajenas
Otra manera de definirla
CREATE TABLE amigos (nombre VARCHAR,
email VARCHAR,
foto_perfil INT,
edad INT,
PRIMARY KEY (email),
FOREIGN KEY (foto_perfil) REFERENCES fotos(foto_id));
Si la tabla ya existe
ALTER TABLE amigos ADD CONSTRAINT foto_perfil_fk FOREIGN
KEY (foto_perfil) REFERENCES fotos(foto_id);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
33/92
Precauciones con claves ajenas
Hay que preservar la integridad referencial. Una clave ajena siempre tiene
que apuntar a un registro que exista. Si se borra el registro al que apunta,
hay que borrar también el registro con la clave ajena.
Esto puede dar problemas al añadir por primera vez los datos a la tabla, y
al borrar datos de la base de datos.
Para evitar estos problemas, existen opciones dentro de PostgreSQL para
desactivar momentáneamente la comprobación de la integridad referencial
(útil al popular una base de datos), y opciones dentro del lenguaje SQL
para borrar en cascada registros involucrados en claves ajenas.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
34/92
Modelado de datos de Facebook
Modelo conceptual
¿Cuáles son las entidades que hay en la base de datos de Facebook?
Clasifica las entidades en principales y secundarias.
¿Qué relaciones existen entre las diferentes entidades?
Modelo lógico
¿Cuáles son los atributos de cada entidad?
¿Qué información define de manera única a cada objeto de cada entidad?
Por ejemplo, ¿qué información define de manera única a un usuario
registrado en Facebook.
¿Qué información define las relaciones entre entidades?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
35/92
Representación gráfica del modelo de datos
Diagramas de relaciones y cardinalidad
Ejemplo de diagrama
Símbolos de cardinalidad
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
36/92
Ejemplo
¿Qué significa este diagrama?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
37/92
Ejemplo
Diagrama de relaciones de Facebook
Basándote en el modelo lógico obtenido anteriormente, dibuja el diagrama
de relaciones del modelo de datos de Facebook.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
38/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
39/92
Tipos de datos
Los tipos de datos definen qué clase de información podemos almacenar en
un campo. SQL define algunos tipos básicos (textos, números), pero la
mayoría de los SGBD extiende estos tipos con algunos propios.
Vamos a ver cómo manejar información de cuatro tipos diferentes
Valores lógicos (booleanos)
Texto
Números
Temporales (fechas, horas)
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
40/92
Valores lógicos (booleanos)
Es el tipo más sencillo. Solo puede tomar dos valores:
verdadero (TRUE)
falso (FALSE)
Se puede escribir de varias maneras (insensible a mayúsculas):
Verdadero
’1’
’yes’
’y’
’true’
’t’
Israel Herraiz, UPM
Falso
’0’
’no’
’n’
’false’
’f’
SQL: Lenguaje de acceso a bases de datos
41/92
Texto
Se puede representar un solo carácter, cadenas de texto de longitud fija y
cadenas de texto de longitud variable.
Comando
char
char(n)
varchar(n)
varchar
text
Israel Herraiz, UPM
Explicación
Un único carácter
Cadena de longitud
Cadena de longitud
Cadena de longitud
Igual que varchar.
fija
variable, máximo n caracteres
arbitraria. Específico de PostgreSQL
Específico de PostgreSQL
SQL: Lenguaje de acceso a bases de datos
42/92
Números
Números enteros:
smallint (entre −32768 y 32767)
int
Números reales:
float
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
43/92
Valores temporales
date para almacenar una fecha
time para almacenar una hora
timestamp para almacenar fecha y hora
interval para almacenar diferencias entre fechas y horas
timestamptz para almacenar fecha y hora con información de la zona
horaria. Específico de PostgreSQL
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
44/92
Funciones para usar con fechas y horas
Todas las funciones de fecha y hora que veremos aquí son específicas de
PostgreSQL.
Formato de fechas
INSERT INTO amigos (email, fecha_nac) VALUES
(’[email protected]’,’19791018’);
Extraer año, mes, día
Se usa la función date_part. Ejemplo:
SELECT ∗ FROM amigos WHERE date_part(’month’,fecha_nac) = 9;
Acepta: year, month, day, hour, minute, second
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
45/92
Comparar fechas y horas
Se usan los operadores habituales
SELECT ∗ FROM amigos WHERE fecha_nac > ’19920601’;
Diferencias entre fechas y horas
Número de días transcurridos desde nuestro nacimiento:
SELECT NOW() − fecha_nac FROM amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
46/92
Calcular diferencias entre fechas y horas
Tipo de datos INTERVAL
Diferencia en formato INTERVAL
SELECT AGE(NOW(),fecha_nac) FROM amigos;
Manejar intervalos
SELECT email FROM amigos WHERE AGE(NOW(),fecha_nac) >
INTERVAL ’17 years’;
Convertir intervalo a segundos
SELECT EXTRACT(’epoch’ FROM AGE(NOW(),fecha_nac)) FROM
amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
47/92
Compatibilidad de las funciones de hora y fecha
Todas las funciones para hacer cálculos con fechas y horas que hemos visto
son específicas de PostgreSQL.
Existen algunas equivalencias que mejoran la portabilidad del código que
use estas funciones, pero el SQL estándar no tiene tantas facilidades como
las funciones de PostgreSQL.
Equivalencias:
En SQL estándar NOW() es CURRENT_TIMESTAMP
En SQL estándar las fechas hay que escribirlas como en cast(’2011
10 18’ AS date)
La diferencia entre fechas devuelve un número entero, que es el
número de días entre ambas fechas.
No hay otras funciones que podamos usar en SQL estándar para
manejar fechas y horas.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
48/92
Un tipo especial: NULL
NULL es un tipo especial que representa la ausencia de valor. Cuando un
campo no contenga datos, debe contener NULL. Ningún campo debería
aceptar NULL como un valor posible, desde el punto de vista de cómo
funciona nuestra aplicación.
¿Cómo se introduce un valor NULL?
Cuando creamos campos (añadiendo filas o columnas) sin especificar su
contenido, automáticamente el valor que tiene es NULL.
¿Cómo se identifica un valor NULL?
No se puede usar una comparación normal. Hay que usar IS NULL o IS
NOT NULL. Por ejemplo:
SELECT ∗ FROM amigos WHERE edad IS NULL;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
49/92
Ejemplo
Ejercicio: escribe el código SQL
Con lo que ya aprendido sobre cómo crear una tabla, cómo establecer
relaciones entre tablas en SQL (claves primarias, claves ajenas) y sobre los
tipos de datos disponibles, transforma el diagrama del modelo de datos de
Facebook a código SQL.
Puede que tras conocer qué tipos de datos hay disponibles en SQL, quieras
refinar y mejorar el modelo de datos. Cámbialo si lo crees necesario, y
actualiza el diagrama de relaciones.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
50/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
51/92
Consultas de información en SQL
Hasta ahora, hemos visto cómo crear la estructura de la base de datos,
expresándola en código SQL.
Hemos usado SQL como un lenguaje de definición de datos (DDL por sus
siglas en inglés).
Pero SQL es también:
lenguaje de manipulación de datos (DML)
lenguaje de consulta de datos (DQL)
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
52/92
Consultas de información en SQL
Hasta ahora, hemos visto cómo crear la estructura de la base de datos,
expresándola en código SQL.
Hemos usado SQL como un lenguaje de definición de datos (DDL por sus
siglas en inglés).
Pero SQL es también:
lenguaje de manipulación de datos (DML)
lenguaje de consulta de datos (DQL)
Pregunta
De todos los comandos vistos, ¿dónde podríamos colocar cada comando en
la siguiente clasificación?
DDL
DML
DQL
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
52/92
Alias
Un alias sirve para cambiar momentáneamente el nombre a algo, durante
una consulta, para hacer la escritura de la consulta más sencilla, o para
visualizar el resultado de una manera más inteligible.
Consulta con un alias
Se especifica con AS, y se aplica a columnas, tablas y/o consultas enteras.
SELECT DATE_PART(’year’,AGE(NOW(),fecha_nac)) AS edad FROM
amigos;
SELECT ∗ FROM amigos AS t WHERE t.residencia = ’Valencia’;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
53/92
Eliminar duplicados
Con el comando DISTINCT podemos seleccionar solo resultados que no
están duplicados.
Ciudades en nuestra base de datos
SELECT DISTINCT residencia FROM amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
54/92
Eliminar duplicados
Con el comando DISTINCT podemos seleccionar solo resultados que no
están duplicados.
Ciudades en nuestra base de datos
SELECT DISTINCT residencia FROM amigos;
¿Cuál es la diferencia con esta consulta?
SELECT residencia FROM amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
54/92
Ordenar los resultados
Cuando hacemos una consulta, el orden de los resultados no está
garantizado. Normalmente se devuelven en el mismo orden en que se
escribieron. Podemos decidir el orden usando el comando ORDER BY.
De menor a mayor
SELECT ∗ FROM amigos ORDER BY edad;
De mayor a menor
SELECT ∗ FROM amigos ORDER BY edad DESC;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
55/92
Ordenar por criterios múltiples
Se puede ordenar por varias columnas
SELECT ∗ FROM amigos ORDER BY edad, num_amigos;
Ordenar en diferentes órdenes
SELECT ∗ FROM amigos ORDER BY edad DESC, num_amigos ASC;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
56/92
Limitar la cantidad de registros
Los cinco más viejos del lugar
Específico de PostgreSQL
SELECT ∗ FROM amigos ORDER BY edad DESC LIMIT 5;
Mismo ejemplo, en SQL estándar
SELECT ∗ FROM amigos ORDER BY edad DESC FETCH FIRST 5
ROWS ONLY;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
57/92
Limitar la cantidad de registros
Con OFFSET podemos empezar la cuenta en la fila que queramos.
Es un comando SQL estándar.
Los (siguientes) tres más viejos del lugar
SELECT ∗ FROM amigos ORDER BY edad DESC OFFSET 5 LIMIT
3;
Mismo ejemplo, en SQL estándar
SELECT ∗ FROM amigos ORDER BY edad DESC FETCH OFFSET 5
FIRST 3 ROWS ONLY;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
58/92
Añadir registros con información parcial
Como vimos, podemos añadir registros a una tabla con el comando
INSERT indicando los valores de cada columna.
Si no tenemos los datos correspondientes a alguna columna, se puede
obviar.
Nos falta la fecha de nacimiento
INSERT INTO amigos (nombre, email) VALUES (’Lionel
Messi’,’[email protected]’);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
59/92
Añadir registros con información parcial
Como vimos, podemos añadir registros a una tabla con el comando
INSERT indicando los valores de cada columna.
Si no tenemos los datos correspondientes a alguna columna, se puede
obviar.
Nos falta la fecha de nacimiento
INSERT INTO amigos (nombre, email) VALUES (’Lionel
Messi’,’[email protected]’);
Pregunta
¿Se te ocurre algún caso en el que un INSERT con información puede
fallar? Es decir, ¿hay alguna columna que nunca se pueda omitir?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
59/92
Operadores en consultas SQL
Operadores lógicos
ALL
IN
AND
NOT
ANY
OR
BETWEEN
Ejemplos con operadores
SELECT ∗ FROM amigos WHERE edad BETWEEN 18 AND 30;
SELECT ∗ FROM amigos WHERE edad NOT IN (15, 16, 17);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
60/92
Agregar y agrupar registros
Funciones que usan información compuesta
AVG
MIN
COUNT
SUM
MAX
Ejemplos
SELECT COUNT(∗) FROM amigos;
SELECT AVG(edad), MIN(edad), MAX(edad) FROM amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
61/92
Consultas por grupos
Podemos usar GROUP BY para agrupar los resultados por uno o varios
campos, y aplicar las funciones anteriores solo a los campos dentro de cada
grupo.
Ejemplo
SELECT residencia, COUNT(∗), AVG(edad) FROM amigos GROUP BY
residencia;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
62/92
Consultas por grupos
Podemos usar GROUP BY para agrupar los resultados por uno o varios
campos, y aplicar las funciones anteriores solo a los campos dentro de cada
grupo.
Ejemplo
SELECT residencia, COUNT(∗), AVG(edad) FROM amigos GROUP BY
residencia;
Pregunta
¿Qué calcula la consulta anterior?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
62/92
Más sobre GROUP BY
Agrypar por varios criterios
SELECT residencia, edad, COUNT(∗) FROM amigos GROUP BY
residencia, edad;
Agrupar si cumplen una condición
SELECT residencia, COUNT(∗), AVG(edad) FROM amigos GROUP BY
residencia HAVING AVG(edad)>20;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
63/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
64/92
Consultas múltiples
Cuando hacemos una consulta, el resultado no es más que una tabla
temporal, que tiene las mismas propiedades que el resto de tablas.
Por tanto, podemos aplicar a su vez consultas sobre los resultados de
consultas.
Es obligatorio asignar un alias a cada una de las consultas que vamos a
consultar a su vez.
Ejemplo
La tabla amigos sin el campo edad, pero con un campo fecha_nac. ¿Cómo
seleccionamos los registros que son mayores de edad?
SELECT nombre, email FROM (SELECT nombre, email,
AGE(NOW(),fecha_nac) AS edad FROM amigos) AS c WHERE c.edad
> INTERVAL ’18 years’;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
65/92
Consultas múltiples en WHERE
Dentro de la cláusula WHERE podemos hacer consultas y comprobarlas
usando los comandos IN, EXISTS, ANY y ALL.
Seleccionar las fotos de los valencianos
SELECT foto_id FROM fotos WHERE owner IN (SELECT email FROM
amigos WHERE residencia = ’Valencia’);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
66/92
Consultas múltiples en WHERE
Dentro de la cláusula WHERE podemos hacer consultas y comprobarlas
usando los comandos IN, EXISTS, ANY y ALL.
Seleccionar las fotos de los valencianos
SELECT foto_id FROM fotos WHERE owner IN (SELECT email FROM
amigos WHERE residencia = ’Valencia’);
Pregunta
Recuerda que la clave primaria de amigos era la columna email. ¿Cómo
cambiaría el resultado de la consulta anterior si ejecutamos la siguiente
consulta? ¿Por qué?
SELECT foto_id FROM fotos WHERE owner IN (SELECT DISTINCT
email FROM amigos WHERE residencia = ’Valencia’);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
66/92
Consultas múltiples en HAVING
Cuando agrupamos, si imponemos una condición, también puede ser el
resultado de una consulta.
Ejemplo
SELECT residencia, edad, COUNT(∗) FROM amigos GROUP BY
residencia, edad HAVING edad < (SELECT AVG(edad) FROM amigos);
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
67/92
Consultas múltiples en HAVING
Cuando agrupamos, si imponemos una condición, también puede ser el
resultado de una consulta.
Ejemplo
SELECT residencia, edad, COUNT(∗) FROM amigos GROUP BY
residencia, edad HAVING edad < (SELECT AVG(edad) FROM amigos);
Pregunta
¿Qué resultados devuelve la consulta anterior?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
67/92
JOINS
Cuando la consulta múltiple extrae información de varias tablas, también se
pueden usar JOIN.
La combinación puede ser de varias formas: INNER JOIN (solapamiento),
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL JOIN
Redundancia y rendimiento
El modelo de datos debe evitar la redundancia de datos. Si se necesita una
información en algún otro lugar del modelo, hay que incluir una relación
para poder combinar diferentes tablas de manera sencilla. Esto facilita el
mantenimiento y la integridad de los datos.
Por otro lado, las consultas múltiples son más lentas y pueden consumir
más memoria. El modelo de datos debe facilitar las consultas múltiples que
necesitemos, pero siempre sin caer en la duplicidad de datos.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
68/92
INNER JOIN
Combina datos de varias tablas, y
devuelve el solapamiento entre
todas las tablas.
Fotos que pertenecen a una persona
SELECT foto_id FROM fotos AS f INNER JOIN amigos AS a ON
f.owner_id = a.email;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
69/92
Sintaxis alternativa para INNER JOIN
El estándar SQL prefiere la forma con INNER JOIN a la alternativa, pero
ambas son válidas.
Otra manera de escribirlo
SELECT foto_id FROM fotos AS f, amigos AS A WHERE f.owner_id
= a.email;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
70/92
Sintaxis alternativa para INNER JOIN
El estándar SQL prefiere la forma con INNER JOIN a la alternativa, pero
ambas son válidas.
Otra manera de escribirlo
SELECT foto_id FROM fotos AS f, amigos AS A WHERE f.owner_id
= a.email;
Ejercicio
Escribe una consulta para extraer todas las fotos que hayan subido los
menores de edad. Al lado de cada foto_id debe aparecer el email y la edad
del dueño.
Escribe una consulta para contar el número de fotos que ha subido cada
uno de los menores de edad.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
70/92
JOIN con varias tablas
Un INNER JOIN puede hacerse con tantas tablas como queramos.
Fotos, edad y ciudades
SELECT foto_id, owner_id, residencia, poblacion
FROM fotos AS f
INNER JOIN amigos AS a ON a.email = f.owner_id
INNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
71/92
LEFT OUTER JOIN
Todos los registros de la tabla
izquierda, junto con los datos
adicionales que puedan tener en
la tabla derecha.
Fotos que pertenecen a una persona y las que no pertenecen a nadie
SELECT foto_id FROM fotos AS f LEFT OUTER JOIN amigos AS a
ON f.owner_id = a.email;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
72/92
Ejemplo
¿El resultado es el mismo? ¿Cuál devolverá más registros?
SELECT foto_id FROM fotos AS f
LEFT OUTER JOIN amigos AS a
ON f.owner_id = a.email;
SELECT foto_id FROM fotos AS f
INNER JOIN amigos AS a
ON f.owner_id = a.email;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
73/92
RIGHT OUTER JOIN
Todos los registros de la tabla
derecha, junto con los datos
adicionales que puedan tener en
la tabla izquierda.
Fotos de los usuarios junto a usuarios sin fotos
SELECT email, foto_id FROM amigos AS a
RIGHT OUTER JOIN fotos AS f
ON f.owner_id = a.email;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
74/92
FULL JOIN
Combinación del LEFT OUTER
JOIN y del RIGHT OUTER JOIN
Todas las fotos (con y sin dueño), todos los usuarios (con y sin
fotos)
SELECT email, foto_id FROM amigos AS a
FULL JOIN fotos AS f
ON f.owner_id = a.email;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
75/92
Ejemplo
Ejercicio
Usando las tablas amigos y fotos y las consultas que hemos visto en los
ejemplos con los JOIN, ordena los siguientes de mayor a menor número de
resultados:
INNER JOIN
LEFT OUTER JOIN
FULL JOIN
RIGHT OUTER JOIN
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
76/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
77/92
Optimización de consultas
Depende de cómo se haga una consulta, el resultado puede obtenerse muy
rápido o tardar días.
Además de un correcto diseño del modelo de datos, y de escribir la mejor
consulta para la información que queremos obtener, el mantenimiento de la
base de datos puede acelerar su rendimiento.
También podemos usar PostgreSQL para que ayude a optimizar nuestras
consultas.
Optimización de consultas)
Usar VACUUM (específico de PostgreSQL)
EXPLAIN y ANALYZE (específico de PostgreSQL)
Índices
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
78/92
VACUUM
El comando VACUUM actualiza las estadísticas que usa PostgreSQL para
decidir cómo hace las consultas (el optimizador) y compacta la base de
datos eliminando espacio no usado (registros marcados como borrados).
Limpia la base de datos
VACUUM amigos;
Limpia la base de datos (más información)
VACUUM VERBOSE amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
79/92
VACUUM ANALYZE
Limpia la base de datos (actualiza estadísticas)
VACUUM ANALYZE amigos;
Optimización agresiva
VACUUM FULL ANALYZE amigos;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
80/92
EXPLAIN
Como ya vimos, SQL es un lenguaje declarativo. Especificamos qué
queremos que haga, pero no cómo se tiene que hacer.
Podemos pedirle a PostgreSQL que nos explique cómo va a obtener la
información, qué coste va a tener cada paso, y cuánto va a tardar en cada
paso. PostgreSQL siempre intenta seguir el camino más rápido.
Esto nos ayuda a detectar cuellos de botella y mejorar nuestras consultas
(o cambiar el modelo de datos si fuera necesario).
Ejemplo
EXPLAIN SELECT foto_id, owner_id, residencia, poblacion
FROM fotos AS f
INNER JOIN amigos AS a ON a.email = f.owner_id
INNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
81/92
EXPLAIN con información del tiempo requerido
Con ANALYZE se averigua del tiempo necesario
EXPLAIN ANALYZE SELECT foto_id, owner_id, residencia, poblacion
FROM fotos AS f
INNER JOIN amigos AS a ON a.email = f.owner_id
INNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
82/92
EXPLAIN con información del tiempo requerido
Con ANALYZE se averigua del tiempo necesario
EXPLAIN ANALYZE SELECT foto_id, owner_id, residencia, poblacion
FROM fotos AS f
INNER JOIN amigos AS a ON a.email = f.owner_id
INNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;
VACUUM y EXPLAIN
Los datos de los que informa EXPLAIN y EXPLAIN ANALYZE pueden estar
desfasados. Es necesario ejecutar VACUUM ANALYZE para obtener
información precisa del coste y el tiempo necesarios.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
82/92
Índices
¿Cómo mejoramos una consulta?
Una vez que hemos obtenido información con EXPLAIN ANALYZE, ¿cómo
podemos mejorar una consulta?.
Si estamos en una fase temprana de desarrollo, podemos intentar
mejorar el modelo de datos.
Pero antes es mejor intentar añadir índices a las tablas involucradas en
los cuellos de botella.
Los índices aceleran las consultas, y se aplican sobre las columnas.
Las columnas que forman parte de una clave primaria siempre tienen un
índice que PostgreSQL añade automáticamente.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
83/92
Creación de índices
Índice en la columna del lugar de residencia
CREATE INDEX residencia_idx ON amigos(residencia);
DROP INDEX residencia_idx;
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
84/92
Creación de índices
Índice en la columna del lugar de residencia
CREATE INDEX residencia_idx ON amigos(residencia);
DROP INDEX residencia_idx;
Ejercicio
Comprueba que el índice de arriba mejora esta consulta, usando EXPLAIN
ANALYZE antes y después de crear el índice:
SELECT residencia, COUNT(∗) FROM amigos GROUP BY residencia;
¿Qué hace esa consulta? ¿Cuánto mejora? ¿Por qué mejora la consulta?
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
84/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
85/92
Exportar e importar bases de datos
Exportar e importar con pgAdmin III
Las utilidades gráficas de PostgreSQL nos permiten guardar copias de
seguridad y restaurarlas de una manera sencilla.
En el object browser, al hacer clic con el botón derecho sobre el nombre de
una base de datos podemos seleccionar las opciones Backup o Restore.
En Windows es mejor usar el formato tar de entre las diferentes opciones,
para evitar problemas de compatibilidad al importar y exportar bases de
datos entre diferentes sistemas operativos.
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
86/92
Opciones en la interfaz gráfica
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
87/92
Opciones en la interfaz gráfica
Backup y Restore
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
88/92
1
Introducción a las bases de datos
2
Primeros pasos en SQL
3
Diseño de bases de datos
4
Tipos de datos en PostgreSQL
5
SQL como lenguaje de consulta y actualización de información
6
Consultas múltiples
7
Optimización de consultas
8
Exportación e importación. Copias de seguridad
9
Ejercicios
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
89/92
Tienda de Informática
Obtener
Nombres y precios de los
productos
Número de artículos con
precio superior a 180 Euros
Fabricantes con artículos
entre 60 y 200 Euros
Los cinco productos más
baratos
Precio en pesetas de los
artículos del punto anterior
Listado de artículos, precio y
el nombre del fabricante
Precio medio de todos los
artículos
Precio medio de los artículos
por fabricante (con nombre)
Israel Herraiz, UPM
SQL: Lenguaje de acceso a bases de datos
90/92
Sala de cine
Obtener
Calificaciones de edad de las
películas
Películas sin clasificar
Salas sin películas
Añade una película nueva
Info de las salas, y si se
proyecta alguna película, su
info
Israel Herraiz, UPM
Info de las películas, y si se
proyecta en alguna sala, su
info
Nombres de películas sin
salas
Las películas sin clasificar
ahora son para mayores de
13 años
SQL: Lenguaje de acceso a bases de datos
91/92
Grandes Almacenes
Obtener
Número de ventas de cada
producto, de mayor a menor
Informe completo de ventas,
incluye nombre del cajero,
nombre y precio de los
productos, piso de la
máquina registradora
Israel Herraiz, UPM
Ventas (en euros) por piso
Código y nombre de
empleado, con ventas totales
por empleado
Código y nombre de los que
venden más de 10,000 Euros
SQL: Lenguaje de acceso a bases de datos
92/92