Professional Documents
Culture Documents
Israel Herraiz
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
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.
(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.
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
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
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
Eliminar una BD
Igual que seleccionamos columnas, podemos seleccionar solo las filas que
cumplan determinadas condiciones.
Ejemplo de filtro
Distinto que
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
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?
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.
Podemos cambiar datos específicos de una tabla sin tocar el resto, usando
el comando UPDATE.
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?
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
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.
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.
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.
Si la tabla ya existe
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.
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?
Símbolos de cardinalidad
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
Verdadero Falso
’1’ ’0’
’yes’ ’no’
’y’ ’n’
’true’ ’false’
’t’ ’f’
Comando Explicación
char Un único carácter
char(n) Cadena de longitud fija
varchar(n) Cadena de longitud variable, máximo n caracteres
varchar Cadena de longitud arbitraria. Específico de PostgreSQL
text Igual que varchar. Específico de PostgreSQL
Números enteros:
smallint (entre −32768 y 32767)
int
Números reales:
float
Todas las funciones de fecha y hora que veremos aquí son específicas de
PostgreSQL.
Formato de fechas
Manejar intervalos
SELECT email FROM amigos WHERE AGE(NOW(),fecha_nac) >
INTERVAL ’17 years’;
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
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
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
De menor a mayor
De mayor a menor
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?
Operadores lógicos
ALL IN
AND NOT
ANY OR
BETWEEN
AVG MIN
COUNT SUM
MAX
Ejemplos
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
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
Pregunta
¿Qué calcula la consulta anterior?
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
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’;
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’);
Ejemplo
Ejemplo
Pregunta
¿Qué resultados devuelve la consulta anterior?
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.
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
Todas las fotos (con y sin dueño), todos los usuarios (con y sin
fotos)
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
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
VACUUM amigos;
Optimización agresiva
Ejemplo
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.
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?
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
Backup y Restore
6 Consultas múltiples
7 Optimización de consultas
9 Ejercicios
Obtener
Obtener
Obtener