SQL: Lenguaje de acceso a bases de datosmat.caminos.upm.es/~iht/sql/pdf/sql_20120215.pdf · Oracle...

99
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/88

Transcript of SQL: Lenguaje de acceso a bases de datosmat.caminos.upm.es/~iht/sql/pdf/sql_20120215.pdf · Oracle...

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/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 2/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 3/88

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 einformáticosLos datos pueden ser en cualquier formato y de cualquier tipo

Texto en diferentes idiomasImágenesSonidosVídeos

No podemos permitirnos perder información

La información tiene que estar almacenada de manera segura ypermanente

Accesible por múltiples usuarios

Fácilmente actualizable

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 4/88

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/88

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 elSGBD.

AlmacenamientoLa base de datos está en uno o varios ficheros en el disco.

Número de usuariosEn la mayoría de las aplicaciones varios usuarios accederán a la vez ala base de datos.

SeguridadNo todos los usuarios pueden acceder a los mismos datos, ni con losmismos permisos. Los datos están protegidos de accesos noautorizados.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 6/88

Sistemas de gestión de base de datos

(cont.)

RendimientoLa cantidad de datos, el tipo de datos, el número de usuarios, influyenen el rendimiento (la velocidad y los recursos que necesitará el SGBDpara dar una respuesta).

Escalabilidad¿Es fácil migrar a una plataforma diferente? ¿Y añadir más capacidada la base de datos?

CosteAlgunos SGBD son muy caros, otros literalmente se pueden obtener demanera gratuita.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 7/88

¿Cuáles son los SGBD más habituales?

SGBD Coste EntornoIBM DB2 Medio ProfesionalesOracle Alto Profesionales, admón. públicaMS SQL Server Bajo Web con servidores MSMySQL Gratis Web con servidores LAMPPostgreSQL Gratis Profesionales, webMS Access Bajo DomésticoLibreOffice Base Gratis Doméstico

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 8/88

¿Cómo organizamos los datos en la base de datos?

La actividad de decidir y organizar los datos que se almacenarán en la BDse 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 entrelos datos, y propiedades de manipulación de los datos.

Documentación de referenciahttp://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/88

¿Cómo funciona un SGBD?

Arquitectura cliente-servidor

PostgreSQL

El servidor escucha normalmente en el puerto 5432 TCP. En Ubuntu, laversión 9.1 está configurada para escuchar en el puerto 5434 TCP.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 10/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 11/88

Primeros pasos en SQL

Estas operaciones se pueden hacer usando el gestor pgAdmin, odirectamente 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/88

Tablas

Los datos se organizan en tablas. Las tablas tienen columnas, que puedenser de diferentes tipos (texto, números, fechas).

Crear y borrar una tabla

CREATE TABLE amigos (nombre VARCHAR, edad INT, emailVARCHAR);

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/88

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/88

Filtrar información

Igual que seleccionamos columnas, podemos seleccionar solo las filas quecumplan 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/88

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 basede datos.

Cada persona estará identificada por su nombre, edad, lugar deresidencia y dirección de correo electrónico

Tiene que contener al menos 10 personas (anota las consultas usadaspara 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 enMadrid.

Escribe una consulta para obtener todos los datos de todas laspersonas que están en la base de datos.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 16/88

Borrar información

Del mismo modo que seleccionamos información que cumple unosdeterminados 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/88

Diferencias entre DROP y DELETE

Pregunta

Hemos visto los comandos DROP y DELETE, que sirven para quitarinformació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/88

Diferencias entre DROP y DELETE

Pregunta

Hemos visto los comandos DROP y DELETE, que sirven para quitarinformació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 puedeeliminar de manera selectiva. Se usa si ya no necesitamos una tabla, siestamos haciendo pruebas o si hay que volver a crear una tabla.

DELETE borra filas (registros) de una tabla, de manera selectiva, y deja elresto de la tabla intacta. Se usa por ejemplo para eliminar un usuario denuestro sistema.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 18/88

Cambiar una tabla sin borrarla

Es habitual que necesitemos cambiar el esquema de una tabla para añadircolumnas, o eliminar columnas que ya no necesitemos. El resto de datos nose 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/88

Actualizar información

Podemos cambiar datos específicos de una tabla sin tocar el resto, usandoel 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/88

Ejemplo

Ejercicio

Añade una columna para el número de teléfono y otra para que indique sudirecció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 latabla amigos, usando cualquier número que se te ocurra.

Todos los amigos de la tabla usan su dirección de email para el chatMSN, así que ambos datos coinciden. ¿Cómo puedes aprovechar losdatos que ya están en la tabla para actualizar las columna con ladirección del chat?

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 21/88

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é necesitamosespecificar?

¿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/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 23/88

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 puedenestablecer relaciones entre sí.

¿Cómo creamos una base de datos?

Primero es necesario crear un modelo de datos. El modelo de datostransforma 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/88

Pasos en el modelado

Conceptual → Lógico → Físico

Pasos Conceptual Lógico FísicoEntidades XRelaciones X XAtributos XClaves primarias X XClaves ajenas X XTablas / Vistas XColumnas XTipos de datos X

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 25/88

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 prestarvarios libros.

Las relaciones se definen mediante claves primarias y ajenas.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 26/88

Modelado lógico

Atributos

Se definen qué atributos tienen las diferentes entidades.

Por ejemplo, un autor tiene un nombre, fecha de nacimiento. Un libro tienetí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, esirrelevante el color de ojos de un autor.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 27/88

Modelado físico

Detalles relacionados con el SGBD elegido

Implementación de la información anterior en SQL, usando los tipos dedatos proporcionados por el SGDB elegido. Es necesario especificar tambiénlos nombres de las columnas.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 28/88

Modelado físico

Detalles relacionados con el SGBD elegido

Implementación de la información anterior en SQL, usando los tipos dedatos proporcionados por el SGDB elegido. Es necesario especificar tambiénlos 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 loscampos de todas las tablas como texto?

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 28/88

¿Cómo hacemos un buen modelo de datos?

El requisito fundamental es entender el problema que estamosintentando modelar.

Para entender el problema es necesario realizar una ingeniería derequisitos, preguntando a las personas que van a usar el sistema.

Una vez que tengamos la información necesaria para saber cómofunciona el sistema, podemos empezar con las tres etapas delmodelado.

El modelado es iterativo. Conforme vamos obteniendo un modelo másdetallado será necesario volver atrás para cambiar algo decidido en unaetapa anterior.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 29/88

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 dedatos 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 claveprimaria (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/88

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/88

Claves ajenas

Una clave ajena se refiere a un registro de otra tabla. La clave ajena serefiere normalmente a la clave primaria de otra tabla. Es necesario que serefiera a un atributo único de otra tabla, pero no es imprescindible que seaclave 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/88

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/88

Precauciones con claves ajenas

Hay que preservar la integridad referencial. Una clave ajena siempre tieneque 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, yal borrar datos de la base de datos.

Para evitar estos problemas, existen opciones dentro de PostgreSQL paradesactivar momentáneamente la comprobación de la integridad referencial(útil al popular una base de datos), y opciones dentro del lenguaje SQLpara borrar en cascada registros involucrados en claves ajenas.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 34/88

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 usuarioregistrado en Facebook.

¿Qué información define las relaciones entre entidades?

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 35/88

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/88

Ejemplo

¿Qué significa este diagrama?

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 37/88

Ejemplo

Diagrama de relaciones de Facebook

Basándote en el modelo lógico obtenido anteriormente, dibuja el diagramade relaciones del modelo de datos de Facebook.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 38/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 39/88

Tipos de datos

Los tipos de datos definen qué clase de información podemos almacenar enun campo. SQL define algunos tipos básicos (textos, números), pero lamayorí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/88

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 Falso’1’ ’0’

’yes’ ’no’’y’ ’n’

’true’ ’false’’t’ ’f’

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 41/88

Texto

Se puede representar un solo carácter, cadenas de texto de longitud fija ycadenas de texto de longitud variable.

Comando Explicaciónchar Un único carácterchar(n) Cadena de longitud fijavarchar(n) Cadena de longitud variable, máximo n caracteresvarchar Cadena de longitud arbitraria. Específico de PostgreSQLtext Igual que varchar. Específico de PostgreSQL

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 42/88

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/88

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 zonahoraria. Específico de PostgreSQL

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 44/88

Funciones para usar con fechas y horas

Todas las funciones de fecha y hora que veremos aquí son específicas dePostgreSQL.

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/88

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/88

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/88

Compatibilidad de las funciones de hora y fecha

Todas las funciones para hacer cálculos con fechas y horas que hemos vistoson específicas de PostgreSQL.

Existen algunas equivalencias que mejoran la portabilidad del código queuse estas funciones, pero el SQL estándar no tiene tantas facilidades comolas 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 elnúmero de días entre ambas fechas.

No hay otras funciones que podamos usar en SQL estándar paramanejar fechas y horas.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 48/88

Un tipo especial: NULL

NULL es un tipo especial que representa la ausencia de valor. Cuando uncampo no contenga datos, debe contener NULL. Ningún campo deberíaaceptar NULL como un valor posible, desde el punto de vista de cómofunciona nuestra aplicación.

¿Cómo se introduce un valor NULL?

Cuando creamos campos (añadiendo filas o columnas) sin especificar sucontenido, 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/88

Ejemplo

Ejercicio: escribe el código SQL

Con lo que ya aprendido sobre cómo crear una tabla, cómo establecerrelaciones entre tablas en SQL (claves primarias, claves ajenas) y sobre lostipos de datos disponibles, transforma el diagrama del modelo de datos deFacebook a código SQL.

Puede que tras conocer qué tipos de datos hay disponibles en SQL, quierasrefinar y mejorar el modelo de datos. Cámbialo si lo crees necesario, yactualiza el diagrama de relaciones.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 50/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 51/88

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 sussiglas 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/88

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 sussiglas 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 enla siguiente clasificación?

DDL

DML

DQL

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 52/88

Alias

Un alias sirve para cambiar momentáneamente el nombre a algo, duranteuna consulta, para hacer la escritura de la consulta más sencilla, o paravisualizar 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/88

Eliminar duplicados

Con el comando DISTINCT podemos seleccionar solo resultados que noestá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/88

Eliminar duplicados

Con el comando DISTINCT podemos seleccionar solo resultados que noestá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/88

Ordenar los resultados

Cuando hacemos una consulta, el orden de los resultados no estágarantizado. Normalmente se devuelven en el mismo orden en que seescribieron. 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/88

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/88

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 5ROWS ONLY;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 57/88

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 5FIRST 3 ROWS ONLY;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 58/88

Añadir registros con información parcial

Como vimos, podemos añadir registros a una tabla con el comandoINSERT indicando los valores de cada columna.

Si no tenemos los datos correspondientes a alguna columna, se puedeobviar.

Nos falta la fecha de nacimiento

INSERT INTO amigos (nombre, email) VALUES (’LionelMessi’,’[email protected]’);

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 59/88

Añadir registros con información parcial

Como vimos, podemos añadir registros a una tabla con el comandoINSERT indicando los valores de cada columna.

Si no tenemos los datos correspondientes a alguna columna, se puedeobviar.

Nos falta la fecha de nacimiento

INSERT INTO amigos (nombre, email) VALUES (’LionelMessi’,’[email protected]’);

Pregunta

¿Se te ocurre algún caso en el que un INSERT con información puedefallar? Es decir, ¿hay alguna columna que nunca se pueda omitir?

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 59/88

Operadores en consultas SQL

Operadores lógicos

ALL

AND

ANY

BETWEEN

IN

NOT

OR

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/88

Agregar y agrupar registros

Funciones que usan información compuesta

AVG

COUNT

MAX

MIN

SUM

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/88

Consultas por grupos

Podemos usar GROUP BY para agrupar los resultados por uno o varioscampos, y aplicar las funciones anteriores solo a los campos dentro de cadagrupo.

Ejemplo

SELECT residencia, COUNT(∗), AVG(edad) FROM amigos GROUP BY

residencia;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 62/88

Consultas por grupos

Podemos usar GROUP BY para agrupar los resultados por uno o varioscampos, y aplicar las funciones anteriores solo a los campos dentro de cadagrupo.

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/88

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/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 64/88

Consultas múltiples

Cuando hacemos una consulta, el resultado no es más que una tablatemporal, que tiene las mismas propiedades que el resto de tablas.Por tanto, podemos aplicar a su vez consultas sobre los resultados deconsultas.Es obligatorio asignar un alias a cada una de las consultas que vamos aconsultar a su vez.

Ejemplo

La tabla amigos sin el campo edad, pero con un campo fecha_nac. ¿Cómoseleccionamos 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/88

Consultas múltiples en WHERE

Dentro de la cláusula WHERE podemos hacer consultas y comprobarlasusando 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/88

Consultas múltiples en WHERE

Dentro de la cláusula WHERE podemos hacer consultas y comprobarlasusando 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ómocambiaría el resultado de la consulta anterior si ejecutamos la siguienteconsulta? ¿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/88

Consultas múltiples en HAVING

Cuando agrupamos, si imponemos una condición, también puede ser elresultado 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/88

Consultas múltiples en HAVING

Cuando agrupamos, si imponemos una condición, también puede ser elresultado 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/88

JOINS

Cuando la consulta múltiple extrae información de varias tablas, también sepueden 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 unainformación en algún otro lugar del modelo, hay que incluir una relaciónpara poder combinar diferentes tablas de manera sencilla. Esto facilita elmantenimiento y la integridad de los datos.Por otro lado, las consultas múltiples son más lentas y pueden consumirmás memoria. El modelo de datos debe facilitar las consultas múltiples quenecesitemos, pero siempre sin caer en la duplicidad de datos.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 68/88

INNER JOIN

Combina datos de varias tablas, ydevuelve el solapamiento entretodas 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/88

Sintaxis alternativa para INNER JOIN

El estándar SQL prefiere la forma con INNER JOIN a la alternativa, peroambas 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/88

Sintaxis alternativa para INNER JOIN

El estándar SQL prefiere la forma con INNER JOIN a la alternativa, peroambas 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 losmenores de edad. Al lado de cada foto_id debe aparecer el email y la edaddel dueño.

Escribe una consulta para contar el número de fotos que ha subido cadauno de los menores de edad.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 70/88

JOIN con varias tablas

Un INNER JOIN puede hacerse con tantas tablas como queramos.

Fotos, edad y ciudades

SELECT foto_id, owner_id, residencia, poblacionFROM fotos AS fINNER JOIN amigos AS a ON a.email = f.owner_idINNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 71/88

LEFT OUTER JOIN

Todos los registros de la tablaizquierda, junto con los datosadicionales que puedan tener enla 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 aON f.owner_id = a.email;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 72/88

Ejemplo

¿El resultado es el mismo? ¿Cuál devolverá más registros?

SELECT foto_id FROM fotos AS fLEFT OUTER JOIN amigos AS aON f.owner_id = a.email;

SELECT foto_id FROM fotos AS fINNER JOIN amigos AS aON f.owner_id = a.email;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 73/88

RIGHT OUTER JOIN

Todos los registros de la tabladerecha, junto con los datosadicionales que puedan tener enla tabla izquierda.

Fotos de los usuarios junto a usuarios sin fotos

SELECT email, foto_id FROM amigos AS aRIGHT OUTER JOIN fotos AS fON f.owner_id = a.email;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 74/88

FULL JOIN

Combinación del LEFT OUTERJOIN y del RIGHT OUTER JOIN

Todas las fotos (con y sin dueño), todos los usuarios (con y sinfotos)

SELECT email, foto_id FROM amigos AS aFULL JOIN fotos AS fON f.owner_id = a.email;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 75/88

Ejemplo

Ejercicio

Usando las tablas amigos y fotos y las consultas que hemos visto en losejemplos con los JOIN, ordena los siguientes de mayor a menor número deresultados:

INNER JOIN

LEFT OUTER JOIN

FULL JOIN

RIGHT OUTER JOIN

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 76/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 77/88

Optimización de consultas

Depende de cómo se haga una consulta, el resultado puede obtenerse muyrápido o tardar días.Además de un correcto diseño del modelo de datos, y de escribir la mejorconsulta para la información que queremos obtener, el mantenimiento de labase de datos puede acelerar su rendimiento.También podemos usar PostgreSQL para que ayude a optimizar nuestrasconsultas.

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/88

VACUUM

El comando VACUUM actualiza las estadísticas que usa PostgreSQL paradecidir cómo hace las consultas (el optimizador) y compacta la base dedatos 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/88

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/88

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 lainformación, qué coste va a tener cada paso, y cuánto va a tardar en cadapaso. 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, poblacionFROM fotos AS fINNER JOIN amigos AS a ON a.email = f.owner_idINNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 81/88

EXPLAIN con información del tiempo requerido

Con ANALYZE se averigua del tiempo necesario

EXPLAIN ANALYZE SELECT foto_id, owner_id, residencia, poblacionFROM fotos AS fINNER JOIN amigos AS a ON a.email = f.owner_idINNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 82/88

EXPLAIN con información del tiempo requerido

Con ANALYZE se averigua del tiempo necesario

EXPLAIN ANALYZE SELECT foto_id, owner_id, residencia, poblacionFROM fotos AS fINNER JOIN amigos AS a ON a.email = f.owner_idINNER JOIN ciudades AS c ON a.residencia = c.nombre_ciudad;

VACUUM y EXPLAIN

Los datos de los que informa EXPLAIN y EXPLAIN ANALYZE pueden estardesfasados. Es necesario ejecutar VACUUM ANALYZE para obtenerinformación precisa del coste y el tiempo necesarios.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 82/88

Índices

¿Cómo mejoramos una consulta?

Una vez que hemos obtenido información con EXPLAIN ANALYZE, ¿cómopodemos mejorar una consulta?.

Si estamos en una fase temprana de desarrollo, podemos intentarmejorar el modelo de datos.

Pero antes es mejor intentar añadir índices a las tablas involucradas enlos 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/88

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/88

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 EXPLAINANALYZE 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/88

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

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 85/88

Exportar e importar bases de datos

Exportar e importar con pgAdmin III

Las utilidades gráficas de PostgreSQL nos permiten guardar copias deseguridad y restaurarlas de una manera sencilla.

En el object browser, al hacer clic con el botón derecho sobre el nombre deuna 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 dedatos entre diferentes sistemas operativos.

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 86/88

Opciones en la interfaz gráfica

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 87/88

Opciones en la interfaz gráfica

Backup y Restore

Israel Herraiz, UPM SQL: Lenguaje de acceso a bases de datos 88/88