Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen Tema 04 - SQL Intermedio
Resumen Tema 04 - SQL Intermedio
• Expresiones de reunión
• Vistas
• Transacciones
• Restricciones de integridad
• Tipos de datos y esquemas de SQL
• Autorización
2
Expresiones de reunión
• En capítulo anterior se vio reunión natural
• SQL proporciona otras formas de reunión que permiten:
– Especificar predicados
– Incluir tuplas que excluye la reunión natural
• Condiciones de reunión
– SQL permite la reunión donde se pueden especificar condiciones arbitrarias:
from relación1 join relación2 on predicado
3
Reunión externa
• La operación de reunión, no conserva las tuplas que no casan
• La operación reunión externa (outer join) sí conserva tuplas que no casan, creando tuplas en el resultado
que contienen null en los atributos de esas tuplas que no casan.
• Tres formas de reunión externa:
– Reunión externa izquierda (left outer join)
– Reunión externa derecha (right outer join)
– Reunión externa completa (full outer join).
• Reunión externa izquierda
– Primero se calcula el resultado de la reunión interna
– Para cada tupla t en la parte izquierda de la relación que no casa con ninguna tupla de la parte
derecha en una reunión interna (y se perdería), se añade una tupla r al resultado, que se construye de
la siguiente forma:
• Los atributos de la tupla r que se derivan de la relación de la parte izquierda se rellenan con los
valores de la tupla t
• El resto de atributos de r se rellenan con valores null
• La reunión externa derecha es simétrica a la reunión externa izquierda. La reunión externa completa es
una combinación de la reunión externa derecha e izquierda.
4
Reunión externa - Ejemplo
• Relación course
• Relación prereq
5
Reunión externa - Ejemplo
• Reunión interna
course inner join prereq on
course.course_id = prereq.course_id
6
Reunión externa - Ejemplo
• Reunión externa
course natural left outer join prereq
7
Tipos de reunión y condiciones
• Para distinguir las reuniones internas y externas, se utiliza inner join y outer join.
• La condición on permite la reunión utilizando un predicado sobre relaciones:
from relación1 join relación2 on predicado
8
Reunión interna vs reunión natural
• Inner join
9
Vistas
• Por motivos de seguridad o de trabajo se puede requerir que ciertos datos de la base de
datos queden ocultos a determinados usuarios.
• SQL permite definir una relación virtual que contenga el resultado de una consulta.
• Una relación como esta que no forma parte del modelo lógico pero se hace visible a los
usuarios como una relación virtual se denomina vista.
• Es posible manejar un gran número de vistas sobre cualquier conjunto de relaciones reales.
• La relación virtual no se precalcula ni se almacena, sino que se calcula ejecutando la
consulta cuando la vista se utiliza.
– El sistema de bases de datos almacena la expresión de la consulta asociada a la relación
de la vista.
– Siempre que se accede a la relación de la vista se crea cuando se necesita, bajo demanda.
10
Definición de vistas
• En SQL se define una vista usando el comando create view
• Para ello se debe dar un nombre a la vista (nombre_vista ) e indicar la consulta que la calcula, su
formato es:
create view nombre_vista as <expresión de consulta>
Ejemplo: Crear una vista que permita acceder a todos los datos de la relación profesor, excepto el
sueldo
Ejemplo: crear una vista con la lista de todas las secciones de asignaturas que ofertó el departamento
de Física en el semestre del otoño de 2009 con su edificio y el nombre del aula de cada sección
11
Definición de vistas
• Se puede utilizar una vista en una expresión que define otra vista.
12
Uso de vistas
• El nombre de la vista se utiliza para hacer referencia a la relación virtual que genera
• Los nombres de las vistas pueden emplearse en cualquier lugar en el que puedan hacerlo los
nombres de las relaciones
– Los nombres de los atributos de las vistas se pueden especificar explícitamente
13
Actualización de vistas
• Aunque las vistas resultan una herramienta ítil para las consultas, presentan serios
problemas si se expresan con ellas actualizaciones, inserciones o borrados.
• La dificultad radica en que las modificaciones de la base de datos expresadas en términos de
vistas deben traducirse en modificaciones de las relaciones reales del modelo lógico de la
base de datos.
• En general se dice que una vista de SQL es actualizable (es decir, se pueden aplicar
inserciones, actualizaciones y borrados) si se cumplen todas las condiciones siguientes:
– La cláusula from solo tiene una relación de bases de datos.
– La cláusula select solo contiene nombres de atributos de la relación y no tiene ninguna
expresión, valor agregado ni especificación distinct.
– Cualquier atributo que no aparezca en la cláusula select puede definirse como null, es
decir, no contiene ninguna restricción not null y no forma parte de una clave primaria.
– La consulta no tiene cláusulas group by ni having.
14
Vistas materializadas
• Vista materializada:
– Algunos sistemas de bases de datos permiten que se guarden las relaciones de vista,
pero se aseguran de que si las relaciones reales utilizadas en la definición de la vista
cambian, la vista se mantenga actualizada
• Este proceso se denomina mantenimiento de vistas materializadas o mantenimiento
de vistas
• Las ventajas para las consultas de vistas materializadas deben sopesarse frente a:
– Costes de almacenamiento y la
– Sobrecarga de trabajo añadida por las actualizaciones
• SQL no define ninguna forma estándar de especificar que una vista es materializada.
– Transact-SQL: CREATE MATERIALIZED VIEW
15
Actualización de vistas
• Las vistas presentan serios problemas si se expresan con ellas actualizaciones, inserciones o
borrados
• La dificultad radica en que las modificaciones de la base de datos, expresadas en términos
de vistas, deben traducirse en modificaciones de las relaciones reales y la vista sólo da
acceso a una parte de ellos (¿añadir null resto atributos?).
• Debido a este problema no se suelen permitir las actualizaciones de las relaciones de
vistas, salvo en casos concretos
• Los diferentes sistemas de bases de datos especifican condiciones para permitir las
actualizaciones de las relaciones de vistas
• Existen condiciones generales para que una vista de SQL sea actualizable, pero incluso con
estas condiciones pueden seguir existiendo problemas.
16
Actualización de vistas
• Algunas actualizaciones no pueden hacerse de forma única
Ejemplo: en la vista profesor_info de dos tablas definida como:
– Si se actualiza con:
17
Transacciones
• Una transacción consiste en una secuencia de instrucciones de consulta o de actualización
• Sentencias para finalizar una transacción:
– Rollback work (retroceso), deshace todas las actualizaciones realizadas por la transacción
– Commit work (compromiso), hace que las actualizaciones realizadas por la transacción pasen a ser
permanentes en la base de datos. Sus efectos ya no se pueden deshacer con rollback
• La base de datos proporciona una abstracción de que la transacción es atómica (indivisible)
– Se ejecuta completamente o no tiene ningún efecto
• En muchas implementaciones de SQL, cada instrucción se considera como una transacción y se
compromete en cuanto se ejecuta
– Posible desactivar si son varias instrucciones seguidas
• En SQL:1999, se puede usar: begin atomic …. End
– Encerrar varias instrucciones SQL y formar una única transacción
• Se ejecutan todas o no tiene efecto ninguna
– No está soportada para la mayoría de los sistemas de bases de datos
18
Restricciones de integridad
• Garantizan que las modificaciones realizadas en la base de datos no den lugar a una pérdida
de la consistencia de los datos.
– Ejemplos:
• El sueldo debe ser mayor de 20.000€
• El atributo teléfono de un cliente no puede ser null
• Un atributo no puede tener valores repetidos
• Las restricciones de integridad suelen identificarse como parte del proceso de diseño del
esquema de la base de datos, y se declaran como parte del comando create table
– También se pueden añadir restricciones a relaciones existentes
alter table nombre-tabla add restricción
• Cuando se ejecuta uno de estos comandos, el sistema primero se asegura que la relación
existente y su contenido satisface la restricción indicada:
– Si se cumple se añade la restricción a la relación
– Si no se cumple el comando se rechaza y no se añade restricción
19
Restricciones sobre una relación
• El comando create table puede incluir instrucciones para restricciones de integridad
– not null : no permitir valores nulos
– primary key : definir los atributos que forman clave primaria
– unique : atributos que forman clave candidata (permite null)
– check(P) : predicado P que debe satisfacer tuplas de la relación
Ejemplo: los atributos nombre y presupuesto no admiten valores nulos (not null)
20
Restricciones sobre una relación
Ejemplo: check y primary key:
– El atributo semestre puede tomar únicamente los valores “Otoño”, “Invierno”,
“Primavera” y “Verano”
– La clave primaria está compuesta por los atributos asignatura_id, secc_id, semestre, año.
21
Integridad referencial
• Integridad referencial: garantizar que el valor que aparece en una relación para un
conjunto dado de atributos aparezca también para un conjunto determinado de atributos
en otra relación
• Las claves externas pueden especificarse como parte de la instrucción create table
mediante la cláusula foreign key.
– Las claves externas hacen referencia a los atributos de la clave primaria de la tabla
referenciada.
Ejemplo: declaración de clave externa especifica que para cada tupla de asignatura, el
nombre de departamento (nombre_dept) especificado en la tupla debe existir en la relación
departamento
22
Integridad referencial
• Recordemos qué es foreign key (clave externa)
– Sea A un conjunto de atributos
– Sean R y S dos relaciones que contienen el conjunto de atributos A
• El conjunto de atributos A es clave primaria de la relación S
– Se dice que A es clave externa de R, si para cualquier valor que aparezca en el conjunto
A de R, ese valor también aparece en S
Ejemplo: edificio y numero_aula es
clave externa en la relación seccion
23
Integridad referencial - Acciones
• Cuando se viola una restricción de integridad referencial:
– El procedimiento normal es rechazar la acción que ha causado esa violación
• Sin embargo, la cláusula foreign key puede especificar qué hacer si una acción de borrado o
de actualización viola una restricción:
– En lugar de rechazar la acción, el sistema lleva a cabo los pasos necesarios para modificar
la tupla de la relación que hace la referencia para que se restaure la restricción.
– Si hay una cadena de dependencias de clave externa que afecta a varias relaciones, el
borrado o la actualización de un extremo de la cadena puede propagarse por toda ella.
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
24
Integridad referencial - Acciones en cascada
Ejemplo:
• Alternativas:
on delete { no action | cascade | set null | set default }
on update { no action | cascade | set null | set default }
25
Integridad referencial - Acciones
Ejemplos:
26
Violación restricción de integridad durante transacción (1/2)
• Las transacciones pueden constar de varios pasos, y las restricciones de integridad pueden
violarse temporalmente tras uno de los pasos, pero puede que uno posterior subsane la
violación
Ejemplo:
create table persona (
ID char(10),
nombre char(40),
conyuge char(10),
primary key ID,
foreign key conyuge references persona)
– Si se añade a una pareja casada, siempre da problemas de integridad referencial el
primero que se añada, pq no está su conyuge todavía
• Soluciones posibles:
– Permitir valores null
– Diferir la comprobación de la restricción al final de la transacción
27
Violación restricción de integridad durante transacción (2/2)
• Para tratar estas situaciones SQL permite que se añada la cláusula initially deferred a la
especificación de la restricción (la restricción se comprueba al final de la transacción y no en
los pasos intermedios).
• Para las restricciones declaradas como diferibles, la ejecución de la instrucción:
set constraints lista_restricciones deferred
hace que se difiera la comprobación de las restricciones especificadas hasta el final de esa
transacción
• A pesar de ello, el comportamiento predeterminado es comprobar las restricciones de
manera inmediata (muchas implementaciones no soportan la comprobación diferida)
28
Condiciones de comprobación complejas y asertos
• SQL soporta construcciones adicionales para especificar las restricciones de integridad
• Check:
– Como se define en la norma de SQL, el predicado de la cláusula check puede ser un
predicado arbitrario, que puede incluir una subconsulta.
– La condición de check verifica que el franja_horaria_id de las tuplas en la relación sección
es realmente el identificador de una franja horaria en la relación franja_horaria
• Las condiciones check complejas pueden ser útiles cuando se desea asegurar la integridad
de los datos, pero puede ser costoso comprobarlo. Por ejemplo, el predicado de la cláusula
check no solo tiene que evaluarse cuando se realiza una modificación en la relación sección,
sino que puede que tenga que comprobarse si se realiza una modificación en la relación
franja_horaria, ya que esta relación se referencia en la subconsulta.
29
Condiciones de comprobación complejas y asertos
• Aserto: predicado que expresa una condición que la base de datos debe satisfacer siempre
– Restricciones de dominio y las de integridad referencial son formas especiales de
asertos
• En SQL los asertos adoptan la forma:
create assertion <nombre_aserto> check <predicado>
• Cuando se crea un aserto, el sistema comprueba su validez
– Si el aserto es válido, solo se permiten las modificaciones de la base de datos que no
hagan que se viole el aserto
– Esta comprobación puede producir una sobrecarga si el aserto es complejo (los asertos
deben utilizarse con mucha cautela).
• Hay que comprobar si el sistema de bases de datos soporta las subconsultas en el
predicado de la cláusula check, o las construcciones assertion.
• Se puede implementar una funcionalidad equivalente usando disparadores, si dispone de
ellos el sistema de bases de datos (se ven más adelante)
30
Tipos de datos de SQL – Fecha y hora
• SQL soporta tipos de datos relacionados con fecha y hora
– date: fechas en formato año (4 dígitos), mes y dia
• Ejemplo: date ‘2020-07-27’
– time: hora del día en formato horas, minutos y segundos
• Ejemplo: time ‘09:00:30’ time ‘09:00:30.75’
– timestamp: fecha más la hora
• Ejemplo: timestamp ‘2005-7-27 09:00:30.75’
– interval: intervalo de tiempo
• Ejemplo: interval ‘1’ day
• Restar valores date-time-timestamp devuelve un intervalo
• Intervalo se pueden sumar/restar a valores date-time-timestamp
31
Tipos de datos de SQL – Fecha y hora
• SQL proporciona clausulas para trabajar con tipos de fecha y hora
• Convertir una cadena de texto a tipos de fecha y hora
– cast e as t
• e cadena de texto
• t tipo date, time o timestamp
• Extraer campo
– extract( campo from d)
• Donde campo puede ser year, month, day , hour, minute o second.
• d valor de tipo time o date
• Funciones para obtener la fecha y hora actuales:
– current_date (fecha actual), current_time (hora actual con uso horario), localtime (hora
local sin uso horario), current_timestamp (con huso horario) y localtimestamp (fecha y
hora locales sin huso horario).
32
Tipos de datos de SQL - Valores predeterminados
• SQL permite especificar un valor predeterminado para un atributo, como se muestra en la
siguiente sentencia create table:
– El valor predeterminado del atributo tot_creditos se declara como 0
– Si se inserta una tupla en la relación estudiante, sin proporcionar un valor para el atributo
tot_créditos su valor se pone a 0
33
Tipos de datos de SQL – Objetos grandes
• Muchas aplicaciones de bases de datos de última generación necesitan almacenar atributos
que pueden ser grandes en tamaño
• Fotos, audios, videos, CAD, documentos, etc.
• SQL ofrece nuevos tipos de datos para objetos de gran tamaño:
– clob : datos de caracteres
– blob: datos binarios lob: large object
c: carácter
b: binario
• Las aplicaciones suelen utilizar las consultas SQL para recuperar “localizadores” o “punteros”
de los objetos de gran tamaño
– Emplean el puntero para manipular el objeto desde el lenguaje anfitrión en que está
escrita la aplicación
34
Tipos de datos de SQL – Definidos por el usuario
• SQL soporta dos formas de tipos de datos definidos por los usuarios
– Alias de tipos (distinct types)
– Tipos de datos estructurados: permite la creación de tipos de datos complejos, que
pueden anidar estructuras de registro, arrays y multiconjuntos (Cap 22, 3er curso)
• La cláusula create type se utiliza para definir tipos de datos nuevos:
create type <nombre de tipo> as <tipo de datos> final
• Los dominios:
– Permiten especificar restricciones como not null
37
Extensiones a la creación de tablas
• SQL proporciona la extensión create table like para la creación de tablas que tienen el
mismo esquema que una ya existente:
create table <nueva tabla> like <tabla>
Ejemplo: crear la tabla temp_profesor con = esquema que profesor
38
Esquemas, catálogos y entornos
• Para realizar cualquier acción sobre una base de datos los usuarios deben conectarse a ella
proporcionando un nombre de usuario y contraseña
• Una vez conectado, para los nombres de las relaciones de las relaciones se utiliza una
jerarquía de tres niveles:
1. Catálogo
2. Esquema
3. Relación
• Para identificar de manera única cada relación hay que utilizar un nombre con tres partes.
Ejemplo: acceder al catalogo catalogo5, al esquema univ_esquema y a la relación
asignatura:
39
Autorización de acceso a la base de datos
• Se pueden asignar a los usuarios varios tipos de autorización para diferentes partes de la
base de datos.
• Las autorizaciones sobre datos incluyen:
– lectura de datos
– inserción de datos
– actualización de datos
– borrado de datos.
• Cada uno de estos tipos de autorización se denomina privilegio, que se pueden establecer
para relaciones y vistas.
• Cuando un usuario envía una consulta o una actualización, SQL comprueba si el usuario está
autorizado
• Un usuario que disponga de alguna forma de autorización puede autorizar a otros usuarios
o revocar autorizaciones
• El último elemento de autoridad es el administrador de la base de datos (puede autorizar
nuevos usuarios, reestructurar la base de datos y mucho más).
40
Autorización de acceso a la base de datos
• Lista de privilegios sobre partes de la base de datos
– select Permite lectura, pero no la modificación de los datos
– insert Permite insertar nuevos datos, pero no modificar existentes
– update Permite modificar, pero no borrar los datos
– delete Permite borrar datos
– all privileges Todos los privilegios posibles
41
Autorización – Concesión y revocación de privilegios
• El estamento grant se usa para otorgar autorización
42
Autorización – Concesión y revocación de privilegios
• El estamento revoke se usa para quitar autorización
– Quitar privilegios:
• La revocación de privilegios resulta más compleja si el usuario al que se le revocan los privilegios se
los ha concedido a otros usuarios
43
Roles
• Para facilitar la gestión de privilegios se crean tipos de usuarios
• La base de datos permite definir roles (función que algo desempeña)
– A los roles se le puede asignar privilegios
– A los usuarios se les puede asignar uno o varios roles
• Ejemplo: Administrador, profesor, estudiante, visitante, etc.
• En SQL se usa la clausula create rol
Ejemplos:
– Crear un rol:
– Asignar privilegios a un rol:
44
Autorización sobre vistas
• Un usuario que crea una vista no necesariamente recibe todos los privilegios sobre dicha
vista:
– Recibe los privilegios que ya tiene sobre las relaciones de la vista
Ejemplo:
– Crear la vista geo_instructor:
46
Autorizaciones sobre funciones y procedimientos
• SQL soporta la creación de funciones y procedimientos
– Pueden, a su vez, contener consultas y actualizaciones
• execute: privilegio para la ejecución de una función o procedimiento
• De forma predeterminada, como con las vistas, las funciones y procedimientos tienen
todos los privilegios que tenía su creador
– La función o procedimiento se ejecuta como si lo invocase el usuario que los creó
• Si la definición de la función tiene una cláusula extra sql security invoker, entonces se
ejecuta con los privilegios del usuario que invoca la función, en lugar de con los privilegios
de quien define la función
– Permite al administrador u otro usuario la creación de bibliotecas de funciones sin el
peligro de tener los privilegios de su creador
47
Transferencia de privilegios
• De manera predeterminada, un privilegio que se concede a un usuario o a un rol no se
puede trasladar a otros usuarios o roles
• La clausula with grant option añadida al final del comando grant permite al receptor del
privilegio transferirlo a otros:
Ejemplo: conceder a Amit el privilegio select sobre departamento y permitir que Amit pueda
conceder este privilegio a otros:
48
Revocación de privilegios
• Por defecto, la revocación de un privilegio de un usuario o rol causa que otros usuarios o
roles también lo pierdan (revocación en cascada)
– restrict : clausula usada en la sentencia revoke para evitar que se produzca revocación
en cascada
revoke select on <relación> from <usuario> restrict
– cascade: fuerza revocación en cascada (valor defecto, no necesario)
Ejemplo:
– Conceder a Amit el privilegio select sobre departamento y permitir que Amit pueda
conceder este privilegio a otros:
49