SQL-92 - Departamento de Informática y Sistemas

Anuncio
2.4 Manipulación de datos
2.4.3. El lenguaje relacional SQL-92
Structured Query Language (lenguaje estructurado de consulta)
• Primer lenguaje de BD de alto nivel. Años 70.
– Diseñado e implementado en el IBM’s Research Laboratory (San José California), para el SGBD Relacional experimental System R
• Definición de un lenguaje estándar para SGBDR
ANSI (American National Standards Institute)
+ ISO (International Standardization Organization)
– SQL1 (ANSI 1986), extendido en 1989 (SQL-89)
– SQL-92 (SQL2), y
– SQL:1999 (extensiones de Orientación a Objetos, disparadores, …)
– SQL:2003 (incluye XML y otros conceptos recientes)
• Primeras implementaciones:
– ORACLE (finales 70) y poco después INGRES
Tema 2. Modelo relacional de datos
97
2.4 Manipulación de datos: SQL-92
• Lenguaje de bases de datos completo (no sólo «de consulta»)
– Definición y Manipulación de Datos (LDD + LMD)
– Definición y destrucción de Vistas (LDV)
– Creación y destrucción de índices (aunque en SQL-92 «ya no existen»)
– Incorporación de SQL dentro de código escrito con un Lenguaje de
Programación de propósito general (Pascal, C, etc.)
• Los proveedores de SGBDR comerciales (Oracle) implementan
variaciones de SQL
– Algunas incluyen características que no están estandarizadas
(triggers /reglas activas incluidos en la versión SQL:1999)
• Niveles de compatibilidad con el estándar de SQL
– Entry SQL
– Intermediate SQL
– Full SQL
Tema 2. Modelo relacional de datos
98
2.4 Manipulación de datos: SQL-92
Lo que vamos a estudiar...
• Consultas o Selección de datos
• Modificación de datos
• Vistas
• Definición y Alteración de datos
– Esquemas, Dominios, Tablas
• Restricciones de Integridad Generales (Asertos)
• Seguridad y Control de Acceso
99
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
Consultas básicas (4)
• SQL-92 vs. Modelo Relacional Formal
– No utiliza los términos formales relación, atributo, tupla…,
sino tabla, columna, fila…
– Permite que las tablas tengan 2 o más filas idénticas en todos los
valores de sus columnas
En general, tabla SQL
≠ conjunto de filas, sino que
Tabla SQL = Multiconjunto de filas (saco, bag)
Es posible forzar que las tablas SQL sean conjuntos de filas:
- con restricciones de clave o
- mediante opción DISTINCT en una SELECT (*se verá*)
– Las columnas de una tabla están ordenadas, y es posible indicar
un orden de visualización de las filas
– Una clave ajena puede referenciar a una clave candidata
Tema 2. Modelo relacional de datos
100
2.4 Manipulación de datos: SQL-92
Esquema de base de datos COMPAÑÍA
EMPLEADO
NOMBRE
APELLIDO
NSS NIF FECHAN DIRECCION SEXO SALARIO
NSSJEFE ND
DEPARTAMENTO
NOMBRED NUMEROD NSSDIRE FECHAINICDIRE
OFICINA_DEPTO
NUMEROD OFICINA
PROYECTO
NOMBREP NUMEROP LUGARP
NUMEROD
TRABAJA_EN
NSSE
NUMP
HORAS
FAMILIAR
NSSE NOMBRE_FAMILIAR SEXO FECHAN PARENTESCO
101
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
Consultas básicas
• Orden SELECT:
Instrucción básica de
obtención de
información
donde:
<lista columnas>
<lista tablas>
<condición>
SELECT <lista columnas>
FROM <lista tablas>
WHERE <condición>
columnas cuyos valores va a obtener la consulta
tablas necesarias para realizar la consulta
expresión booleana para identificar filas que obtendrá la consulta
(expresión de reunión y/o de selección)
Fecha de nacimiento y dirección del empleado llamado José Silva
SELECT fechan, direccion
FROM Empleado
WHERE nombre = ‘José’ AND apellido = ‘Silva’;
• La consulta selecciona las filas de <lista tablas>
que satisfacen <condición> y
proyecta el resultado sobre las columnas de <lista columnas>
Tema 2. Modelo relacional de datos
102
2.4 Manipulación de datos: SQL-92
Consultas básicas (2)
• La orden SELECT ... FROM ... WHERE...
– No es igual a la operación restricción σ del Álgebra Relacional
– SELECT de SQL tiene muchas más opciones y matices
– En caso de una única tabla T en <lista tablas>
SELECT <lista columnas>
FROM T
WHERE <condición>
es equivalente a...
Π <lista columnas>(σ<condición> ( T ))
* Nombre, apellido y dirección de los empleados del departamento de Investigación
SELECT nombre, apellido, direccion
FROM Empleado, Departamento → reunión o join de tablas
WHERE nombred=‘Investigación’ → condición de selección
AND numerod=nd;
→ condición de reunión entre tablas
Tema 2. Modelo relacional de datos
103
2.4 Manipulación de datos: SQL-92
Consultas básicas (3)
• Cualquier nº de condiciones selección/reunión en SELECT
* Para cada proyecto ubicado en Santiago, obtener el nº del proyecto, nº del departamento que lo
controla y el apellido, dirección y fecha de nacimiento del gerente de ese departamento
SELECT numerop, numd, apellido, direccion, fechan
FROM Proyecto, Departamento, Empleado
WHERE numd=numerod AND nssdire=nss AND lugarp=‘Santiago’;
• Una SELECT puede obtener filas repetidas
* Salario de los empleados de los departamentos de Administración y de Investigación
SELECT salario
FROM Empleado, Departamento
WHERE (nombred = ‘Administración’ OR nombred = ‘Investigación’)
AND numerod=nd;
Tema 2. Modelo relacional de datos
104
2.4 Manipulación de datos: SQL-92
Consultas básicas (5): uso de *
• Obtención de los valores de todas las columnas de las filas
seleccionadas
– No es necesario listar todos los nombres tras cláusula SELECT
– Uso del símbolo * (todas las columnas)
SELECT *
FROM Empleado
WHERE nd=5;
SELECT *
FROM Departamento
WHERE nombred=‘Investigación’;
SELECT *
FROM Empleado, Departamento
WHERE nombred=‘Investigación’ AND nd=númerod;
Tema 2. Modelo relacional de datos
105
2.4 Manipulación de datos: SQL-92
Consultas básicas (6): omisión de WHERE
• Selección incondicional
– Equivale a una condición TRUE para todas las filas
selección de todas las filas de...
una tabla (si la cláusula FROM sólo contiene una tabla), o
el producto cartesiano entre varias tablas (si FROM incluye más de una)
* Seleccionar todos los nss de empleados
SELECT nss
FROM Empleado;
* Obtener todas las combinaciones de nss de empleados y nombres de departamentos
SELECT nss, nombred
FROM Empleado, Departamento;
Tema 2. Modelo relacional de datos
106
2.4 Manipulación de datos: SQL-92
Consultas básicas (7): cadenas de caracteres
• Operador LIKE
– Comparación de cadenas de caracteres
– Caracteres reservados: ‘%’ y ‘_’ (comodines)
*Nombres y apellidos de los empleados cuya dirección esté en Higueras, estado de México
SELECT nombre, apellido
FROM Empleado
WHERE direccion LIKE ‘%Higueras, MX%’ ;
• Operador ||
– Concatenación de cadenas de caracteres
* Nombres completos en una sola columna de empleados con dirección en Higueras (México)
SELECT nombre || ‘ ’ || apellido
FROM Empleado
WHERE direccion LIKE ‘%Higueras, MX%’ ;
107
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
Consultas básicas (8): aritmética y tiempo
• Operaciones aritméticas
– Aplicación de operadores aritméticos ( + - * / ) sobre valores numéricos
* Salarios de los empleados que trabajan en el proyecto ProductoX, tras un aumento del 10%
SELECT apellido, nombre, 1.1*salario
FROM Empleado, Trabaja_en, Proyecto
WHERE nss=nsse AND nump=numerop AND nombrep=‘ProductoX’ ;
1 el valor real de los salarios en la tabla EMPLEADO no cambia
• Operaciones con fechas, horas, marcas de tiempo e intervalos
– Especificación del valor de un INTERVAL
como diferencia de dos valores DATE, TIME o TIMESTAMP
– Incremento y Decremento de valores de columnas de tipo DATE, TIME,
TIMESTAMP en un intervalo compatible con el tipo
Tema 2. Modelo relacional de datos
108
2.4 Manipulación de datos: SQL-92
Consultas básicas (9): calificación
• En SQL los nombres de las columnas deben ser únicos
dentro de cada tabla
• Consulta que referencia a varias columnas de igual
nombre, pero de tablas distintas...
AMBIGÜEDAD --------------Solución: CALIFICACIÓN
El esquema COMPAÑÍA incluye las siguientes tablas:
DEPARTAMENTO (nombred, numerod, nssdire, fechainicdire)
OFICINA_DEPTO (numerod, oficina)
* Código, nombre y lugares de los departamentos de Marketing y de Investigación
SELECT Departamento.numerod, nombred, oficina
FROM Departamento, Oficina_depto
WHERE Departamento.nombred IN (‘Marketing’, ‘Investigación’)
AND Departamento.numerod = Oficina_depto.numerod;
Tema 2. Modelo relacional de datos
109
2.4 Manipulación de datos: SQL-92
Consultas básicas (10): seudónimos
• Puede utilizarse seudónimos para acortar nombres de tabla
dentro de las consultas con calificación:
SELECT nombred, D.numerod, oficina
FROM Departamento AS D, Oficina_depto L
← ‘AS’ es opcional
WHERE D.nombred IN (‘Marketing’, ‘Investigación’)
AND D.numerod = L.numerod;
• Consulta que se refiere dos veces a la misma tabla
AMBIGÜEDAD ------------------- Solución: SEUDÓNIMOS
* Obtener nombre y apellido de cada empleado y de su supervisor inmediato
SELECT E.nombre, E.apellido, S.nombre, S.apellido
FROM Empleado E, Empleado S
WHERE E.nssjefe=S.nss;
Tema 2. Modelo relacional de datos
110
2.4 Manipulación de datos: SQL-92
Consultas básicas (11): renombrar columnas
• En el resultado de evaluar la consulta
* Nombres de cada empleado y su supervisor, cambiando al mismo tiempo los nombres de las
columnas resultantes a ‘nom_empleado’ y ‘nom_supervisor’
SELECT E.nombre AS nom_empleado,
S.nombre AS nom_supervisor
FROM Empleado E, Empleado S
WHERE E.nssjefe = S.nss;
Nueva cabecera para la tabla resultado
• Seudónimos de columnas (y/o tablas) en cláusula FROM
SELECT nom, num, oficina
FROM Departamento D(nom, num, dire, inidire), Oficina_depto
WHERE nom IN (‘Marketing’, ‘Investigación’) AND num = numerod;
Tema 2. Modelo relacional de datos
111
2.4 Manipulación de datos: SQL-92
Consultas básicas (y 12): orden de presentación
• SQL permite presentar las filas resultado de una consulta
de forma ordenada: Cláusula ORDER BY
– Ordenación según valores de una o varias columnas
– Ascendente ASC (por defecto) o Descendente DESC
– Suele ser una operación muy costosa
las filas no se ordenan en disco: se ven ordenadas, pero no lo están
*Nombre y apellido de los empleados, y proyectos en los que trabajan, en orden descendente por
departamentos y, dentro de cada departamento, en orden alfabético ascendente por apellido y
nombre
SELECT nombred, apellido, nombre, nombre
FROM Departamento, Empleado, Trabaja_en, Proyecto
WHERE numerod=nd AND nss=nsse AND nump=numerop
ORDER BY nombred DESC, apellido ASC, nombre ASC;
Tema 2. Modelo relacional de datos
112
2.4 Manipulación de datos: SQL-92
Tablas como conjuntos
• SQL no elimina filas repetidas del resultado de una
consulta, porque...
– Eliminación de duplicados costosa (ordenar+recorrer+eliminar)
– El usuario puede desear ver las filas repetidas en el resultado
– Si se aplica una función agregada a filas, rara vez deben eliminarse las
duplicadas
• Operador DISTINCT:
– Para eliminar duplicados del resultado de una consulta SQL
» Resultado = Relación del Modelo Relacional Formal (conjunto de filas)
* Salarios de todos los empleados
SELECT salario FROM Empleado;
* Salarios distintos de empleados, sin importar cuántos perciban cada cantidad
SELECT DISTINCT salario
FROM Empleado;
Tema 2. Modelo relacional de datos
113
2.4 Manipulación de datos: SQL-92
Tablas como conjuntos (2)
• Operaciones de conjuntos
– UNION( ∪ ), INTERSECT( ∩ ), EXCEPT ( — ) (minus en ORACLE)
– Resultado: conjunto de filas
las filas repetidas se eliminan
– Las tablas operando han de ser compatibles en tipo:
– igual nº de columnas, y
– columnas “correspondientes” con el mismo dominio
* Nombres de los proyectos en que participa el empleado de apellido ‘Silva’, ya sea como trabajador
o como gerente del departamento que controla el proyecto
( SELECT nombrep FROM Proyecto, Trabaja_en, Empleado
WHERE numerop=nump AND nsse=nss AND apellido=‘Silva’ )
UNION
( SELECT nombrep FROM Proyecto, Departamento, Empleado
WHERE numd=numerod AND nssdire=nss AND apellido=‘Silva’ );
• Para no eliminar duplicados...
– UNION ALL, INTERSECT ALL, EXCEPT ALL
Tema 2. Modelo relacional de datos
114
2.4 Manipulación de datos: SQL-92
Tablas como conjuntos (3): conjuntos explícitos
• Un conjunto explícito de valores es una lista de valores
encerrada entre paréntesis
• Puede aparecer en la cláusula WHERE
* nss de los empleados que trabajan en los proyectos 1, 2 ó 3
SELECT DISTINCT nsse FROM Trabaja_en
WHERE nump IN (1, 2, 3);
• Operador IN
v IN V
– Indica si el valor v pertenece al conjunto de valores V
– Devuelve TRUE si algún elemento e de V cumple que v = e
* nss de los empleados que trabajan en algún proyecto que no sea el 4 ni el 6
SELECT DISTINCT nsse FROM Trabaja_en
WHERE nump NOT IN (4, 6);
Tema 2. Modelo relacional de datos
115
2.4 Manipulación de datos: SQL-92
Tablas como conjuntos (4): conjuntos explícitos
• Operador ANY (o SOME)
v <op> ANY V o v <op> SOME V ,, <op> ∈ { >, ≥, <, ≤, <>, = }
– Compara un valor individual v con los elementos de un conjunto V
– Devuelve TRUE si algún elemento e de V cumple que v <op> e
* nss de los empleados que trabajan en alguno de los proyectos 1, 2 ó 3
SELECT DISTINCT nsse FROM Trabaja_en
WHERE nump = ANY (1, 2, 3);
• Operador ALL
v <op> ALL V,, <op> ∈ { >, ≥, <, ≤, <>, = }
– Compara un valor v con los elementos de un conjunto V
– Devuelve TRUE si para todo elemento e de V se cumple v <op> e
* nss de los empleados que no trabajan en ninguno de los proyectos 1, 2 y 3
SELECT DISTINCT nsse FROM Trabaja_en
WHERE nump <> ALL (1, 2, 3);
Tema 2. Modelo relacional de datos
116
2.4 Manipulación de datos: SQL-92
Consultas anidadas
• Es una consulta SELECT completa, dentro de cláusula
WHERE de otra consulta (consulta exterior)
• Obtiene valores de la BD que se usan en la condición de otra
consulta, para obtener otros datos
* Números de los proyectos en que participa el empleado de apellido ‘Silva’, sea como trabajador o
como gerente del departamento que controla el proyecto
SELECT DISTINCT numerop FROM PROYECTO
WHERE numerop IN ( SELECT nump
FROM Trabaja_en, Empleado
WHERE nsse=nss AND apellido=‘Silva’ )
OR numerop IN ( SELECT numerop
FROM Proyecto, Departamento, Empleado
WHERE numd=númerod
AND nssdire=nss AND apellido=‘Silva’ ) ;
• Es posible tener varios niveles de consultas anidadas
Tema 2. Modelo relacional de datos
117
2.4 Manipulación de datos: SQL-92
Consultas anidadas (2): comparar conjuntos
• Operador IN (otro uso del mismo operador)
t IN S
– indica si la fila t pertenece al conjunto de filas S (subconsulta)
* Nombre y dirección de los empleados que trabajan en algún proyecto.
SELECT nombre, dirección FROM Empleado
WHERE nss IN ( SELECT nsse FROM TRABAJA_EN );
* Números de seguridad social de aquellos empleados que trabajan en algún proyecto en el que
trabaje el empleado ‘José B. Silva’, de forma que ambos tengan la misma combinación (proyecto,
horas); es decir, todo empleado que trabaje las mismas horas que ‘José B. Silva’, en cada proyecto
en el que trabajen ambos. El nss de ‘José B. Silva’ es ‘123456789’.
SELECT DISTINCT nsse FROM Trabaja_en
WHERE (númp, horas) IN ( SELECT númp, horas
FROM Trabaja_en
WHERE nsse=‘123456789’);
Tema 2. Modelo relacional de datos
118
2.4 Manipulación de datos: SQL-92
Consultas anidadas (3): comparar conjuntos
• Operador ANY o SOME (otro uso del mismo operador)
t <op> ANY S o t <op> SOME S,, <op> ∈ { >, ≥, <, ≤, ≠, = }
– Compara una fila t con las filas resultado de una consulta anidada S
– Devuelve TRUE si alguna fila e de S cumple que t <op> e
• Operador ALL (otro uso del mismo operador)
t <op> ALL S,, <op> ∈ { >, ≥, <, ≤, ≠, = }
– Compara una fila t con filas resultado de una consulta anidada S
– Devuelve TRUE si para toda fila e de S se cumple que t <op> e
* Nombres y apellidos de los empleados cuyo salario es menor que el de todos los empleados del
departamento 5
SELECT nombre, apellido FROM Empleado
WHERE salario < ALL ( SELECT salario
FROM Empleado
WHERE nd=5 );
¿”Mejor” con DISTINCT
en la subconsulta?
Tema 2. Modelo relacional de datos
119
2.4 Manipulación de datos: SQL-92
Consultas anidadas (4): columnas ambiguas
• Coincidencia de nombres de columnas en las consultas
exterior y anidada Ambigüedad
* Nombre y apellidos de cada empleado con familiares de igual nombre y sexo que él
SELECT nombre, apellido FROM Empleado
WHERE nss IN ( SELECT nsse FROM Familiar
WHERE nsse=nss AND nombre_familiar=nombre
AND sexo=sexo ); ¿cómo evitar esta ambigüedad?
Regla: Una columna no calificada se refiere a la tabla
declarada en la consulta anidada más interior
Si en una consulta anidada es necesario usar columnas de
tablas declaradas en una consulta exterior calificar
* Nombre y apellidos de cada empleado con familiares de igual nombre y sexo que él
SELECT nombre, apellido FROM Empleado E
WHERE nss IN ( SELECT nsse FROM Familiar
WHERE nss=nsse AND nombre_familiar=nombre
AND sexo= E.sexo );
Tema 2. Modelo relacional de datos
120
2.4 Manipulación de datos: SQL-92
Consultas anidadas (5): correlación
• Una consulta exterior y otra anidada están correlacionadas
si una condición de la anidada contiene columnas de
una tabla declarada en la consulta exterior
SELECT nombre, apellido FROM Empleado
WHERE nss IN ( SELECT nsse FROM Familiar
WHERE nss=nsse AND sexo=‘F’ );
• La consulta anidada se evalúa una vez para cada fila (o
combinación de filas) de la consulta exterior
– Evalúa la consulta anidada para cada fila de EMPLEADO,
– Si el valor de nss de la fila EMPLEADO está en el resultado de la consulta
anidada, selecciona la fila EMPLEADO para el resultado final
• Una consulta anidada que use el operador = o IN
siempre puede expresarse como una reunión (join)
SELECT E.nombre, E.apellido
FROM Empleado, Familiar D
WHERE nss=nsse AND D.sexo=‘F’;
Tema 2. Modelo relacional de datos
121
2.4 Manipulación de datos: SQL-92
Consultas anidadas (6): EXISTS
• Operador EXISTS (S): comprobación de tablas vacías
– Devuelve TRUE si la tabla S contiene al menos una fila
– Devuelve FALSE si S es una tabla vacía (sin filas)
L S suele ser una consulta anidada correlacionada
* Nombre y apellido de cada empleado con familiares de igual nombre y sexo que él
SELECT E.nombre, E.apellido FROM Empleado E
WHERE EXISTS ( SELECT * FROM Familiar
WHERE nsse=nss AND nombre_familiar=nombre
AND sexo=E.sexo );
* Nombres de empleados sin familiares
SELECT nombre, apellido FROM Empleado E
WHERE NOT EXISTS (SELECT * FROM Familiar WHERE nsse=nss);
Tema 2. Modelo relacional de datos
122
2.4 Manipulación de datos: SQL-92
Consultas anidadas (y 7): UNIQUE
• Operador UNIQUE (S): Comprobación de filas duplicadas
– Devuelve TRUE si NO hay filas repetidas en S
L S suele ser una consulta anidada correlacionada
* Nombres y apellidos de los empleados que trabajan en un único proyecto
SELECT nombre, apellido FROM Empleado
WHERE UNIQUE ( SELECT nsse
FROM Trabaja_en
WHERE nsse = nss );
* Nombres, apellidos y salario de los empleados con un solo familiar
SELECT nombre, apellido, salario FROM Empleado
WHERE UNIQUE ( SELECT *
FROM Familiar
WHERE nsse = nss );
Tema 2. Modelo relacional de datos
123
2.4 Manipulación de datos: SQL-92
Nulos
• Null
– Ausencia o desconocimiento de información
– Comparar NULL con cualquier cosa da FALSE
• Operador IS NULL ,, IS NOT NULL
v IS NULL
– es TRUE si v es NULL
v IS NOT NULL
– es TRUE si v es un valor no NULL
* Nombres de empleados sin supervisores
SELECT nombre, apellido FROM Empleado
WHERE nssjefe IS NULL;
Tema 2. Modelo relacional de datos
124
2.4 Manipulación de datos: SQL-92
Funciones agregadas
• Función COUNT( )
– Cuenta el número de filas o de valores especificados en una consulta
• Funciones SUM( ), MAX( ), MIN( ), AVG( )
– Suma, máximo, mínimo y media aritmética (promedio)
– Aplicadas a un multiconjunto (saco, bag) de valores numéricos
L Pueden aparecer en cláusula SELECT
* Suma de los salarios y salario máximo, mínimo y medio de los empleados
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)
FROM EMPLEADO;
* Suma de los salarios y salario máximo, mínimo y medio de empleados del depto. de Investigación
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)
FROM Empleado, Departamento
WHERE nd=númerod AND nombred=‘Investigación’;
L También pueden aparecer en cláusula HAVING
(*se verá*)
125
Tema 2. Modelo relacional de datos
2.4 Manipulación
de AGREGADAS
datos: SQL-92
FUNCIONES
Funciones agregadas (2): uso de * y de DISTINCT
• Uso de *
* Número total de empleados de la compañía
SELECT COUNT(*) FROM Empleado
(
cuenta filas)
* Contar el número de empleados de la compañía que tienen un jefe
SELECT COUNT(nssjefe) FROM Empleado;
(
cuenta filas con nssjefe no NULL)
* Número de empleados en el departamento de Investigación
SELECT COUNT(*) FROM Empleado, Departamento
WHERE nd=númerod AND nombred=‘Investigación’;
• Uso de DISTINCT
* Contar el nº de valores distintos de salario que pueden cobrar los empleados
SELECT COUNT(salario) FROM Empleado;
Error: NO se eliminan duplicados, así que COUNT(salario) ≡ COUNT(*)
SELECT COUNT(DISTINCT salario) FROM Empleado; OK !!
Tema 2. Modelo relacional de datos
126
2.4 Manipulación de datos: SQL-92
Funciones agregadas (y 3) y correlación
• Es posible que una consulta anidada y correlacionada con
otra exterior, incluya una función agregada
* Nombres de los empleados con 2 o más familiares
SELECT apellido, nombre FROM Empleado
WHERE 2 ≤ ( SELECT COUNT(*)
FROM Familiar
WHERE nss=nsse );
Tema 2. Modelo relacional de datos
127
2.4 Manipulación de datos: SQL-92
Agrupación
• Cláusula GROUP BY
– Para formar subgrupos de filas dentro de una tabla
– Los grupos se forman según el valor de las columnas de agrupación
– Las filas de cada grupo tendrán el mismo valor en las columnas
de agrupación
• Aplicación de funciones agregadas a grupos de filas
* Para cada departamento, obtener su número, cuántos empleados tiene dicho departamento y el
salario medio de los empleados del mismo
SELECT nd, COUNT(*), AVG(salario)
FROM Empleado
GROUP BY nd ; ← una columna de agrupación
Las columnas de agrupación deben aparecer en la cláusula SELECT,
antes de cualquier función agregada, para que su valor (único para cada
grupo) aparezca junto al resultado de aplicar la función al grupo
Tema 2. Modelo relacional de datos
128
2.4 Manipulación de datos: SQL-92
Agrupación (2)
• Cláusula HAVING
– Siempre junto a GROUP BY
– Condición que deben cumplir los grupos de filas asociados a
cada valor de las columnas de agrupación
– Un grupo que no cumple la condición, no es seleccionado para el
resultado
* Para cada proyecto en el que trabajen más de dos empleados, obtener el número y nombre
del proyecto, y el nº de empleados que trabajan en él
SELECT numerop, nombrep, COUNT(*)
FROM Proyecto, Trabaja_en
WHERE numerop=nump
GROUP BY numerop, nombrep
HAVING COUNT(*) > 2 ;
129
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
Agrupación (y 3)
• WHERE... se aplica a filas individuales
• HAVING... se aplica a grupos de filas
* Nº de empleados cuyos salarios superan los 1.800€ en cada departamento, pero sólo en el caso
de departamentos en los que trabajen más de 5 empleados
(* Consulta incorrecta ¿por qué? *)
(* Consulta correcta *)
SELECT nombred, COUNT(*)
FROM Departamento, Empleado
WHERE númerod=nd
AND salario>1800
GROUP BY nombred
HAVING COUNT(*) > 5 ;
SELECT nombred, COUNT(*)
FROM Departamento, Empleado
WHERE númerod=nd
AND salario>1800
AND nd IN (SELECT nd
FROM Empleado
GROUP BY nd
HAVING COUNT(*) > 5)
GROUP BY nombred ;
(* pista: orden de ejecución *)
Tema 2. Modelo relacional de datos
130
2.4 Manipulación de datos: SQL-92
Tablas reunidas
• Reunión especificada en la cláusula FROM de una consulta
• Hasta ahora la hemos especificado en cláusulas FROM y WHERE
* Nombres y dirección de empleados del departamento de Investigación
SELECT nombre, apellido, direccion
FROM Empleado, Departamento
WHERE nombred=‘Investigacion’
AND nd=numerod;
← reunión de tablas
← condición de reunión
• Consultas más comprensibles: separa condiciones de reunión
y de selección
* Nombres y dirección de empleados del departamento de Investigación
SELECT nombre, apellido, direccion
FROM (Empleado JOIN Departamento ON nd=numerod)
WHERE nombred=‘Investigacion’;
← tabla reunida
Tema 2. Modelo relacional de datos
131
2.4 Manipulación de datos: SQL-92
Tablas reunidas (2): anidamiento
• Es posible anidar varias especificaciones de reunión de tablas
* Para cada proyecto ubicado en ‘Santiago’, obtener el nº de proyecto, el nº del departamento que
lo controla y el apellido, dirección y fecha de nacimiento del gerente de ese departamento
SELECT númerop, númd, apellido, dirección, fechan
FROM ( ( Proyecto JOIN Departamento ON númd=númerod )
JOIN Empleado ON nssdire=nss )
WHERE lugarp=‘Santiago’;
Tema 2. Modelo relacional de datos
132
2.4 Manipulación de datos: SQL-92
Reunión Interna de tablas (inner join)
• Es el tipo de reunión “por defecto”
SELECT ...
FROM ( R1 JOIN R2 ON <condición_reunión> )
WHERE ...
• Si existe una fila t1 en R1 y otra fila t2 en R2, tales que
cumplen la condición de reunión, la tabla resultado (reunida)
incluirá la fila obtenida al combinar t1 y t2
SELECT E.nombre AS nom_empleado, S.nombre AS nom_supervisor
FROM (Empleado E JOIN Empleado S ON E.nssjefe = S.nss);
– Son excluidas las filas EMPLEADO con NULL en nssjefe
• También puede especificarse como
R1 INNER JOIN R2 ON <condición_reunión>
Tema 2. Modelo relacional de datos
133
2.4 Manipulación de datos: SQL-92
Reunión Natural de tablas (natural join)
• Sin condición de reunión explícita
SELECT ...
FROM ( R1 NATURAL JOIN R2 )
WHERE ...
• Equi-reunión implícita para cada par de columnas con
igual nombre en una y otra tabla
̶ Sólo se incluye una de estas columnas en el resultado
̶ Si no coinciden los nombres de las columnas, es necesario
RENOMBRAR una de ellas mediante AS en la cláusula FROM
SELECT nombre, apellido, direccion
FROM ( Empleado NATURAL JOIN (Departamento AS DEP(nombred, nd, dire, fech)) )
WHERE nombred=‘Investigacion’;
Tema 2. Modelo relacional de datos
134
2.4 Manipulación de datos: SQL-92
Reunión Externa de tablas (outer join)
• Útil si en una reunión se necesita obtener las filas…
– con valor NULL en las columnas de reunión, o
– sin correspondencia en la otra tabla
• Tipos de reunión externa:
– LEFT [OUTER] JOIN
– RIGHT [OUTER] JOIN
– FULL [OUTER] JOIN
Reunión externa izquierda
Reunión externa derecha
Reunión externa completa o total
SELECT E.nombre AS nom_empleado, S.nombre AS nom_supervisor
FROM (Empleado E LEFT OUTER JOIN Empleado S ON E.nssjefe=S.nss);
̶
Obtiene también los empleados sin supervisor (con NULL en nssjefe)
135
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
Evaluación de consultas
• En una consulta SQL hay un máximo de 6 cláusulas
• Sólo son obligatorias SELECT y FROM
• Orden de especificación de las cláusulas:
SELECT <lista columnas>
columnas o funciones que se van a obtener
FROM <lista tablas>
tablas necesarias (incluso las reunidas)
WHERE <condición para filas>
condiciones para selección de filas
GROUP BY <lista columnas agrupación> especificación del agrupamiento de filas
HAVING <condición para grupos>
condición para selección de grupos de filas
ORDER BY <lista columnas ordenación> orden de presentación del resultado
Tema 2. Modelo relacional de datos
136
2.4 Manipulación de datos: SQL-92
Evaluación de consultas (2)
• Orden de evaluación de las cláusulas:
1) FROM (es decir, la reunión o join de tablas, si se especifica más de una)
2) WHERE
3) GROUP BY
4) HAVING
5) SELECT
6) ORDER BY
• Diversas formas de especificar una misma consulta
Ejemplo: es posible expresar una consulta utilizando...
a) condiciones de reunión en cláusula WHERE, o
b) tablas reunidas en la cláusula FROM, o
c) consultas anidadas y el operador de comparación IN ...
Flexibilidad
137
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
Evaluación de consultas (y 3)
• Ventajas e inconvenientes de esta flexibilidad:
☺ – el usuario elige la técnica o enfoque más cómodo
– Confusión del usuario: ¿qué técnica uso?
– Algunas técnicas son más eficientes que otras
el usuario debe determinar cuál
• En condiciones ideales...
– Usuario: se preocupa sólo de especificar la consulta correctamente
– SGBD: se ocupa de ejecutar la consulta de manera eficiente
• Pero en la práctica no suele ser así...
conviene saber qué tipos de consulta son más y menos costosos
Recomendación (optimización de consultas):
Consultas con mínimo anidamiento correlacionado
y mínimo ordenamiento implícito
Tema 2. Modelo relacional de datos
138
2.4 Manipulación de datos: SQL-92
Inserción de datos
• Orden INSERT
– Añade una fila completa a una tabla
– Incluye nombre de la tabla y lista de valores para las columnas,
escritos en igual orden al especificado en la orden CREATE TABLE
INSERT INTO Empleado
VALUES ( 'Ricardo', ‘C’, 'Martínez', '653298653123', ‘987654321’, '30-DIC-52',
'Olmo 98, Cedros, MX', ‘M’, 37000, '987654321321', 4 ) ;
– Si se desea poner los valores de las columnas en cualquier orden,
hay que especificar los nombres de las columnas en dicho orden
INSERT INTO Empleado ( nombre, apellido, nss, nif, nd, salario,
nssjefe, direccion, fechan, sexo )
VALUES ( 'Ricardo', ‘C’, 'Martínez', '653298653123', ‘987654321’, 4, 37000,
'987654321321', 'Olmo 98, Cedros, MX', '30-DIC-52', ‘M’ ) ;
Tema 2. Modelo relacional de datos
139
2.4 Manipulación de datos: SQL-92
Inserción (2)
• Inserción de varias filas en una sola orden INSERT
– Filas separadas por comas
– Cada fila se encierra entre paréntesis
• Especificación explícita de algunas columnas (y no todas)
– Omisión de columnas cuyo valor se desconoce
– Cada columna no especificada tomará el...
· valor por omisión: valor tomado de su cláusula DEFAULT, o
· NULL: si la columna permite nulos y no se definió cláusula
DEFAULT para la misma
* Inserción de un empleado del que sólo se conoce su nombre, apellidos, nss y nif
INSERT INTO Empleado (nombre, apellido, nss, nif)
VALUES ( 'Rubén', 'Ripoll', '553298653111‘, ‘11222333R’ ) ;
Tema 2. Modelo relacional de datos
140
2.4 Manipulación de datos: SQL-92
Inserción (3): Restricciones de Integridad
• Si SGBD con implementación total de SQL-92
- El SGBD maneja e impone toda RI definida en esquema de BD (LDD)
• Si SGBD con implementación de algunas RI
- Menor complejidad, mayor eficiencia
- SGBD implementa comprobaciones para imponer RI que sí maneja
INSERT INTO Empleado (nombre, apellido, nd) VALUES ( 'Roberto', 'Huertas', 2 ) ;
Inserción rechazada: no se incluye valor para nss, que debe ser NOT NULL
- Programador debe asegurar la no violación de las RI no
manejadas por el SGBD
LSupongamos que no existe departamento con numerod=8
INSERT INTO Empleado (nombre, apellido, nss, nif, nd)
VALUES ( 'Roberto', 'Huertas', '980760540222', ‘22333444H’, 8 ) ;
Si el SGBD sí maneja la Integridad Referencial
Inserción rechazada
Si el SGBD NO soporta la Integridad Referencial
Inserción permitida ¡el programador debe asegurar que esto no pase!
Tema 2. Modelo relacional de datos
141
2.4 Manipulación de datos: SQL-92
Inserción (y 4): filas resultado de una consulta
• Carga de una tabla con información sinóptica de la BD
Sea una tabla INFO_DEPTOS vacía. En ella queremos almacenar los nombres de cada
departamento, su nº de empleados y el salario conjunto de los empleados del mismo.
INFO_DEPTOS ( nombre_depto, num_emps, sal_total)
INSERT INTO Info_deptos ( nombre_depto, num_emps, sal_total )
SELECT nombred, COUNT(*), SUM(salario)
FROM Departamento, Empleado
WHERE númerod=nd
GROUP BY nombred ;
– Es posible hacer SELECT ... FROM Info_deptos ...
– 1 INFO_DEPTOS puede contener información no actualizada
Si se modifica información en EMPLEADO y/o DEPARTAMENTO, los
cambios no se reflejarán en la tabla INFO_DEPTOS
Una vista sí “contiene” siempre los datos más actuales (*se verá*)
Tema 2. Modelo relacional de datos
142
2.4 Manipulación de datos: SQL-92
Eliminación de datos
• Orden DELETE
– Elimina filas completas de una tabla
– Sólo una tabla en cláusula FROM
– Cláusula WHERE para seleccionar las filas que eliminar
Si no hay WHERE, se eliminan todas las filas
La tabla permanece, pero queda vacía
DELETE FROM Empleado ;
todas las filas
DELETE FROM Empleado WHERE apellido=‘Bojórquez’;
0 filas
DELETE FROM Empleado WHERE nss=‘123456789012’ ;
1 fila
DELETE FROM Empleado
WHERE nd IN ( SELECT numerod FROM Departamento
WHERE nombre=‘Investigación’) ;
4 filas
• Propagación de eliminaciones
– Según acciones de mantenimiento de la Integridad Referencial especificadas
con LDD en los CREATE TABLE (esquema de BD)
Tema 2. Modelo relacional de datos
143
2.4 Manipulación de datos: SQL-92
Actualización de datos
• Orden UPDATE
– Modifica valores de columnas en una o más filas de una tabla
– Se modifican filas de una sola tabla a la vez
– Cláusula SET especifica columnas que modificar y nuevos valores
– Cláusula WHERE para seleccionar filas que actualizar
Si no hay WHERE, se aplica la modificación a todas las filas
* Para el proyecto 10, cambiar el lugar a Belén y el nº de depto controlador al 5
UPDATE Proyecto SET lugarp = ‘Belen’, númd = 5
WHERE numerop=10 ;
• Propagación de modificaciones
– Si cambia un valor de clave candidata, este cambio se propaga a
valores de clave ajena de filas de otras tablas, si así se especificó en
las acciones de mantenimiento de la Integridad Referencial en la definición de la
tabla con CREATE TABLE
Tema 2. Modelo relacional de datos
144
2.4 Manipulación de datos: SQL-92
Actualización (y 2)
• Modificación de varias filas a la vez con UPDATE
* Conceder a todo empleado del departamento de Investigación un aumento salarial del 10%
UPDATE Empleado SET salario = salario*1.1
WHERE nd IN (SELECT númerod
FROM Departamento
WHERE nombred=‘Investigación’) ;
• NULL o DEFAULT como nuevo valor de una columna
UPDATE Empleado SET salario = DEFAULT;
UPDATE Empleado SET nssjefe = NULL
WHERE ... ;
Tema 2. Modelo relacional de datos
145
2.4 Manipulación de datos: SQL-92
LDD: Definición de datos
• Esquema de Base de Datos Relacional
- Agrupa tablas y otros elementos, de una misma aplicación
- 1as versiones de SQL: todas las tablas dentro de un esquema único y
global a todas las aplicaciones que accedían a la BD
• Orden CREATE SCHEMA: definición/creación de esquemas
CREATE SCHEMA <nombre de esquema>
AUTHORIZATION <identificador de autorización>
<nombre de esquema> identifica el esquema
<identificador de autorización> usuario/cuenta propietaria del esquema
CREATE SCHEMA Compañía AUTHORIZATION JSILVA ;
– A continuación puede especificarse las definiciones de los elementos
contenidos en dicho esquema
• Elementos del esquema:
Tablas, Vistas, Dominios, Autorizaciones, Restricciones, etc.
Tema 2. Modelo relacional de datos
146
2.4 Manipulación de datos: SQL-92
Catálogo de base de datos relacional
• Conjunto nombrado de esquemas de BD en un entorno
SQL
Contiene un esquema especial, INFORMATION_SCHEMA, que
almacena datos sobre la definición de todos los elementos
de todos los esquemas existentes en el catálogo
El Diccionario de Datos (Data Dictionary) de ORACLE se corresponde
con el INFORMATION_SCHEMA del estándar SQL-92
- Es posible compartir elementos (dominios, etc.) entre
diferentes esquemas del mismo catálogo
- Sólo pueden definirse restricciones de integridad
referencial entre tablas que existan en esquemas
dentro del mismo catálogo
• Concepto incorporado en la versión SQL-92 del estándar
147
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Orden CREATE TABLE
– Define (crea) una tabla: nombre, columnas y restricciones
– Nombre único dentro del esquema
– Para cada Columna...
nombre,
tipo de datos (dominio)
restricciones de columna
– Restricciones de tabla...
de clave candidata,
de integridad de entidad,
de integridad referencial, o
restricciones de otro tipo
Tema 2. Modelo relacional de datos
CREATE TABLE Empleado (
nombre ...
apellido ...
nss ...
nif ...
fechan ...
direccion ...
sexo ...
salario ...
nssjefe ...
nd …
);
148
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Indicación del esquema al que pertenece una tabla
– Esquema Explícito
CREATE TABLE Compañia.Empleado ...
– Esquema Implícito en el contexto
CREATE TABLE Empleado ...
• Ordenamiento de columnas y filas
– Columnas ordenadas tal como aparecen en CREATE TABLE
– Las filas no están ordenadas
• Las tablas creadas con CREATE TABLE son tablas BASE
– El SGBD las almacena físicamente en algún fichero de la BD
Tema 2. Modelo relacional de datos
149
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Especificación del tipo de datos de una columna
1. Especificar directamente el tipo de datos tras nombre de la columna
CREATE TABLE Empleado (
nombre VARCHAR(15) ...
... );
2. Definir un dominio y usar su nombre como tipo de datos
– Facilita cambio del tipo de datos usado por muchas columnas
– Esquema más comprensible
CREATE DOMAIN Nombres VARCHAR(15);
...
CREATE TABLE Empleado (
nombre NOMBRES ...
... );
Tema 2. Modelo relacional de datos
150
2.4 Manipulación de datos: SQL-92
LDD: tipos de datos
• Numéricos
– Enteros y Reales
· INTEGER (también INT), SMALLINT,
· FLOAT, REAL, DOUBLE PRECISION
– Con formato
· DECIMAL(p,e) ( también DEC(p,e) ó NUMERIC(p,e) )
p: precisión, e: escala. El valor por omisión de la escala es e = 0
• Cadena de caracteres
– Longitud fija
– Longitud variable
CHAR(n)
VARCHAR(n)
( n: nº caracteres )
( n: máximo nº caracteres )
• Cadena de Bits
– Longitud fija
– Longitud variable
BIT(n) (n: nº bits)
BIT VARYING(n) n:máx nº bits. Por omisión n=1
Tema 2. Modelo relacional de datos
151
2.4 Manipulación de datos: SQL-92
LDD: tipos de datos
• Temporales
· DATE (10 posiciones) = YEAR, MONTH, DAY
(yyyy-mm-dd)
· TIME (8 posiciones) = HOUR, MINUTE, SECOND
(hh:mm:ss)
– Sólo permitidas fechas y horas válidas
· TIMESTAMP (marca de tiempo)
– DATE, TIME, fracciones de segundo y desplazamiento respecto al
huso horario estándar (WITH TIME ZONE)
· INTERVAL
– Período de tiempo, para incrementar/decrementar el valor actual
de una fecha, hora o marca de tiempo
– Se califica con YEAR/MONTH ó DAY/TIME para indicar su naturaleza
Tema 2. Modelo relacional de datos
152
2.4 Manipulación de datos: SQL-92
LDD: definición de dominios de datos
CREATE DOMAIN <nombre dominio> <tipo de datos>
[ DEFAULT <valor defecto> ]
[ <lista de definición de restricciones de dominio> ] ;
- <tipo de datos>: uno de los proporcionados por el SGBD (built-in)
- <valor defecto>: (opcional)
- Especifica el valor por omisión para columnas definidas de este dominio
- Será asignado a cada columna con dicho dominio, si no tiene ya su propia
cláusula DEFAULT
- <lista de definición de restricciones de dominio>: (opcional)
- Restric. Integridad que se aplican a toda columna definida sobre el dominio
- Cada RI puede tener un nombre: cláusula CONSTRAINT <nombre_RI>
* Ejemplo: enumeración de posibles valores componentes del dominio
CREATE DOMAIN Color VARCHAR(8) DEFAULT ‘sinColor’
CONSTRAINT color_valido
CHECK (VALUE IN ( ‘rojo’, ‘amarillo’, ‘azul’, ‘verde’, ‘sinColor’ ) ) ;
Tema 2. Modelo relacional de datos
153
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Especificación de restricciones de columna
–Cláusula NULL o NOT NULL
Opción de nulo: indica si una columna puede contener o no NULL
CREATE TABLE Empleado (...
nombre VARCHAR(15) NOT NULL, ... );
Por omisión, se asume NULL
La restricción NOT NULL es obligatoria para columnas
componentes de una clave primaria
–Cláusula DEFAULT <valor>
Valor por omisión (o por defecto)
CREATE TABLE Empleado ( ...
salario DECIMAL(5,2) DEFAULT 1000 NULL,... );
Si una columna no tiene DEFAULT, su valor por defecto es...
– El de su dominio, si su tipo es un dominio que incluye DEFAULT
– NULL en cualquier otro caso, siempre que la columna permita NULL
Tema 2. Modelo relacional de datos
154
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Especificación de restricciones de tabla
–Cláusula PRIMARY KEY (<lista_columnas>)
Columnas que componen la clave primaria
–Cláusula UNIQUE (<lista_columnas>)
Columnas que forman una clave alternativa
–Cláusula FOREIGN KEY (<lista_columnas>)
REFERENCES <tabla>(<lista_columnas>)
Columnas clave externa (Integridad Referencial)
SQL-92 permite que una clave externa se refiera a una clave
primaria o una clave alternativa
–Cláusula CHECK (<expresión>)
Condición sobre los valores de las columnas que debe cumplir
toda fila de la tabla
Tema 2. Modelo relacional de datos
155
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
CREATE TABLE Empleado (
nombre VARCHAR(15) NOT NULL,
apellido VARCHAR(15) NOT NULL,
nss
CHAR(12)
NOT NULL,
nif
CHAR(9)
NOT NULL,
fechan
DATE
NULL,
direccion VARCHAR(30) ,
sexo
CHAR(1)
,
salario
DECIMAL(5,2) DEFAULT 1000 NULL,
nssjefe
CHAR(12)
,
nd
NUMERIC(2)
NOT NULL,
PRIMARY KEY ( nss ),
UNIQUE ( nif ),
CHECK ( nssjefe <> nss ),
CHECK ( sexo IN (‘H’, ‘M’) ),
FOREIGN KEY (nssjefe) REFERENCES Empleado(nss),
FOREIGN KEY (nd) REFERENCES Departamento(numerod)
);
Tema 2. Modelo relacional de datos
156
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Especificación de restricciones de tabla (cont.)
- Dar nombre a una restricción es opcional, pero muy conveniente
CONSTRAINT <nombre_RI> <restricción>
- El nombre de restricción debe ser único dentro del mismo esquema
- Identifica una restricción, por si después debe ser eliminada o
sustituida por otra
CREATE TABLE Empleado (
...,
CONSTRAINT pk_empleado PRIMARY KEY ( nss ),
CONSTRAINT nif_unico
UNIQUE ( nif ),
CONSTRAINT jefe_ok
CHECK ( nssjefe <> nss ),
... );
Tema 2. Modelo relacional de datos
157
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Especificación de restricciones de tabla (cont.)
- Si la restricción afecta sólo a una columna, puede especificarse en
la definición de dicha columna (en la misma línea)
- Por ejemplo, si una clave externa no es compuesta, no se necesita la
cláusula FOREIGN KEY
CREATE TABLE Empleado (
nombre VARCHAR(15) NOT NULL,
nss
CHAR(12) PRIMARY KEY,
nif
CHAR(9) NOT NULL UNIQUE,
nssjefe
CHAR(12) NULL REFERENCES Empleado(nss),
nd
NUMERIC(2) NOT NULL REFERENCES Departamento(numerod),
...,
CONSTRAINT jefe_ok CHECK ( nssjefe <> nss ),
... );
Tema 2. Modelo relacional de datos
158
2.4 Manipulación de datos: SQL-92
LDD: definición de tablas
• Acciones de mantenimiento de la integridad referencial
Cláusulas ON DELETE <acción>
y ON UPDATE <acción>
<acción> ∈ { NO ACTION, CASCADE, SET NULL, SET DEFAULT }
);
CREATE TABLE Empleado (
...,
CONSTRAINT jefe_emp FOREIGN KEY (nssjefe)
REFERENCES Empleado(nss)
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT dep_emp FOREIGN KEY (nd)
REFERENCES Departamento(numerod)
ON DELETE NO ACTION
ON UPDATE CASCADE
Tema 2. Modelo relacional de datos
159
2.4 Manipulación de datos: SQL-92
LDD: definición de vistas
• Una vista es una tabla derivada de otras tablas
• Son tablas virtuales, pues no necesariamente existen en
forma física
• Sentencia de definición o creación de una vista
CREATE VIEW <nombre_vista> [ (<lista_nombres_columnas>) ]
AS <consulta_de_definición>
• La consulta de definición…
– determina el contenido de la vista
– contiene las tablas base: tablas o vistas de las que se deriva la
vista (también llamadas tablas de definición)
CREATE VIEW Familiar_de_Empleado (empleado, familiar, parentesco)
AS SELECT nombre, nombre_familiar, parentesco
FROM Empleado, Familiar
WHERE nss = nsse;
Tema 2. Modelo relacional de datos
160
2.4 Manipulación de datos: SQL-92
LDD: definición de vistas
• Por defecto, la vista ‘hereda’ los nombres de las columnas...
- seleccionadas desde las tablas base
- siempre que ninguna columna sea el resultado de una operación
aritmética o función de agregados
CREATE VIEW Empleado_en_Proyecto
nombres que
AS SELECT nombre, apellido, nombrep, horas
hereda la vista
FROM Empleado, Proyecto, Trabaja_en
WHERE nss = nsse AND nump = numerop ;
• Definición de nuevos nombres para columnas de la vista
CREATE VIEW Info_Depto (nombre_depto, num_de_emps, sal_total)
AS SELECT nombred, COUNT(*), SUM(salario)
FROM Departamento, Empleado
WHERE numerod = nd
GROUP BY nombred ;
161
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
LDD: definición de vistas
• Un estado de la vista EMPLEADO_EN_PROYECTO
Empleado_en_Proyecto
Tema 2. Modelo relacional de datos
nombre
apellido
nombrep
horas
José
Silva
ProductoX
32.5
Ramón
Nieto
ProductoZ
40.0
José
Silva
ProductoY
07.5
Josefa
Barceló
ProductoX
20.0
Federico
Vizcarra
ProductoY
10.0
Federico
Vizcarra
ProductoZ
10.0
Josefa
Barceló
ProductoY
20.0
...
...
...
...
162
2.4 Manipulación de datos: SQL-92
LDD: definición de vistas
• Las vistas pueden utilizarse como mecanismo de...
- Simplificación de consultas
- Seguridad (*se verá en el tema de seguridad*)
- Adaptación de la información a las necesidades de cada
usuario o grupo de usuarios
• Característica fundamental de las vistas
Actualización Permanente
- El responsable de esta característica es el SGBD
La vista no se crea cuando se define, sino cuando se consulta
Una vista no “contiene información”, sino que “deja ver
información” almacenada en sus tablas base
163
Tema 2. Modelo relacional de datos
2.4 Manipulación de datos: SQL-92
LDD: definición de vistas
• El SGBD traduce cualquier sentencia SQL sobre la vista a una
expresión equivalente sobre sus tablas base: reemplaza el
nombre de la vista por su consulta de definición y ejecuta
CREATE VIEW Veterano AS
SELECT nombre, nif, nss, fechan, nd FROM Empleado WHERE fechan<’01/01/1970’;
Sentencia de usuario
Traducción
SELECT * FROM VETERANO
WHERE nombre LIKE ‘G%’;
SELECT nombre, nif, nss, fechan, nd FROM EMPLEADO
WHERE fechan < ‘01/01/1970’ AND nombre LIKE ‘G%’;
INSERT INTO VETERANO
INSERT INTO EMPLEADO (nombre, nif, nss, fechan, nd)
VALUES (‘Eva’, ‘12345678E’,
VALUES (‘Eva’ ‘12345678E’, ‘123456789012’, ‘14/11/1947’, 4);
‘123456789012’, ‘14/11/1947’, 4);
UPDATE VETERANO SET nd=1
WHERE nd=2;
UPDATE EMPLEADO SET nd=1
WHERE fechan < ‘01/01/1970’ AND nd=2;
DELETE FROM VETERANO
WHERE nif = ‘12345678E’;
DELETE FROM EMPLEADO
WHERE fechan < ‘01/01/1970’ AND nif = ‘12345678E’;
Tema 2. Modelo relacional de datos
164
2.4 Manipulación de datos: SQL-92
LDD: consulta a través de vistas
• Las vistas no tienen ninguna limitación en operaciones de
consulta
• El usuario no distingue si el elemento al que accede es una
tabla base o una vista
* Nombres de los empleados y de sus hijos/as
SELECT empleado, familiar
FROM Familiar_de_empleado WHERE parentesco LIKE ‘Hij_’ ;
* Datos del departamento ‘Investigación’
SELECT * FROM Info_Depto WHERE nombre_depto=‘Investigación’ ;
* Nombres y apellidos de los empleados que trabajan en el proyecto 'ProductoX'
SELECT nombre, apellido, nombrep
FROM Empleado_en_Proyecto
WHERE nombrep=‘ProductoX’ ;
Tema 2. Modelo relacional de datos
165
2.4 Manipulación de datos: SQL-92
LDD: modificación a través de vistas
• La actualización de datos a través de vistas tiene
algunas limitaciones
- Por un lado, actualizar a través de una vista definida sobre
varias tablas base suele dar problemas, pues puede haber
ambigüedad
UPDATE Empleado_en_Proyecto SET nombrep = ‘ProductoZ’
WHERE apellido=‘Silva’ AND nombre=‘José’
AND nombrep=‘ProductoX’;
Esta modificación puede traducirse a dos actualizaciones distintas
de las tablas base de la vista (EMPLEADO, PROYECTO y TRABAJA_EN),
como se muestra en la siguiente diapositiva…
Tema 2. Modelo relacional de datos
166
2.4 Manipulación de datos: SQL-92
LDD: modificación a través de vistas
UPDATE Trabaja_en SET nump = (SELECT numerop FROM Proyecto
WHERE nombrep = ‘ProductoZ’)
WHERE nsse = (SELECT nss FROM Empleado
WHERE apellido = ‘Silva’ AND nombre = ‘José’)
AND númp = (SELECT numerop FROM Proyecto
WHERE nombrep = ‘ProductoX’) ;
☺ Modifica los vínculos en TRABAJA_EN: cada fila que relacionaba las
filas de ‘José Silva’ en EMPLEADO y de ‘ProductoX’ en PROYECTO, pasa
a relacionar tal empleado con la fila ‘ProductoZ’ de PROYECTO
UPDATE Proyecto SET nombrep = ‘ProductoZ’
WHERE nombrep = ‘ProductoX’ ;
Produce igual efecto que
pero modifica nombrep en PROYECTO:
al calcular la vista, mostrará ‘ProductoZ’ para todos los que antes
aparecían con ‘ProductoX’
Tema 2. Modelo relacional de datos
167
2.4 Manipulación de datos: SQL-92
LDD: modificación a través de vistas
- Por otro lado, algunas actualizaciones a través de vistas
carecen de sentido
UPDATE Info_depto
SET sal_total = 100000
WHERE nombred=‘Investigación’ ;
sal_total se define como la suma de salarios individuales de los empleados y
muchas actualizaciones de las tablas base satisfarían esta actualización
Así que no se garantiza que “toda vista sea actualizable”
Tema 2. Modelo relacional de datos
168
2.4 Manipulación de datos: SQL-92
LDD: modificación a través de vistas
• Una vista sería actualizable si...
- Implicara una única actualización posible de las tablas
base, o bien
- Hubiera varias actualizaciones posibles, pero
existiera un procedimiento específico de actualización de
tablas base, tal que...
· El usuario pudiera elegir el procedimiento,
especificándolo en la definición de la vista, o bien
· El SGBD pudiera elegir el procedimiento, según la
actualización más probable
Tema 2. Modelo relacional de datos
169
2.4 Manipulación de datos: SQL-92
LDD: modificación a través de vistas
• En general...
- Una vista con una sola tabla base
SÍ es actualizable si sus columnas contienen la clave
primaria u otra clave candidata de la tabla base
– Pues se establece una correspondencia entre cada fila de la vista y
una única fila de la tabla base
- Una vista definida sobre varias tablas mediante
reuniones
NO es actualizable
- Una vista definida mediante agrupación y funciones
agregadas
NO es actualizable
Tema 2. Modelo relacional de datos
170
2.4 Manipulación de datos: SQL-92
LDD: modificación a través de vistas
• Opción de verificación de vistas
CREATE VIEW Emp_Precario AS SELECT nombre, apellido, nss, nif, salario, nd
FROM Empleado WHERE salario < 900 ;
*¿Qué pasaría al ejecutar estas sentencias?
INSERT INTO Emp_Precario VALUES (‘Dimas’, ‘Pi', ‘111222333444’, ‘12121212D’, 1025, 1);
UPDATE Emp_Precario SET salario = 950 WHERE nif=‘12345678E’;
• Cláusula WITH CHECK OPTION
- En la definición de toda vista actualizable que se vaya a utilizar
para la modificación de datos
- Indica al SGBD que debe comprobar cada INSERT y UPDATE sobre la
vista, y rechazarlo si su realización implicara que la fila nueva o
modificada no cumpliera la condición de definición
CREATE VIEW Emp_Precario AS SELECT nombre, apellido, nss, salario, nd
FROM Empleado WHERE salario < 900
WITH CHECK OPTION ;
Tema 2. Modelo relacional de datos
171
2.4 Manipulación de datos: SQL-92
LDD: implementación de vistas
1. Estrategia de actualización de consultas de definición
- Cada consulta sobre la vista se traduce a una consulta sobre las
tablas base
- La vista se rellena de filas a partir de la ejecución de la consulta
- Poco eficiente cuando la <consulta_de_definición> es compleja, con
tiempo de ejecución apreciable, y se aplican muchas consultas
sobre la vista en poco tiempo
2. Estrategia de materialización de vistas
- 1ª consulta sobre la vista
creación de tabla temporal física
- Se conserva la tabla para posteriores consultas sobre la vista
- Necesaria estrategia para actualización incremental de la tabla temporal
tras cualquier modificación sobre las tablas base
actualización permanente
- Si no se hace referencia a la vista tras un tiempo, el sistema la
eliminará (y la recalculará en una consulta futura)
Tema 2. Modelo relacional de datos
172
2.4 Manipulación de datos: SQL-92
LDD: Modificación de la estructura (alteración)
de los elementos del esquema de base de
datos
• Alteración de tablas:
ALTER TABLE <nombre_tabla> ... ;
– Adición y Eliminación de Columnas
– Modificación de la Definición de Columnas
– Adición y Eliminación de Restricciones de Tabla
• Alteración de dominios:
ALTER DOMAIN <nombre_dominio> ... ;
– Eliminación y Adición de valor por defecto
– Eliminación y Adición de Restricciones de Dominio
Tema 2. Modelo relacional de datos
173
2.4 Manipulación de datos: SQL-92
LDD: alteración de tablas
• Adición de una columna a una tabla ya existente
ALTER TABLE <nombre_tabla> ADD <definición_columna> ;
– No está permitido NOT NULL en la definición de una nueva columna
(si es necesaria esta restricción, podrá establecerse después)
* Añadir una columna a EMPLEADO para contener el puesto de trabajo
ALTER TABLE Empleado ADD puesto VARCHAR(12);
Todas las filas de EMPLEADO tendrán puesto a NULL
– Para introducir un valor para la columna, en cada fila existente:
Especificar la cláusula DEFAULT al añadir la columna:
ALTER TABLE Empleado
ADD puesto VARCHAR(12) DEFAULT ‘aprendiz’;
Utilizar después una orden UPDATE
Tema 2. Modelo relacional de datos
174
2.4 Manipulación de datos: SQL-92
LDD: alteración de tablas
• Eliminación de una columna de una tabla
ALTER TABLE <nombre_tabla> DROP <nombre_columna> <opción>;
<opción> puede ser...
CASCADE: elimina la columna y toda restricción o vista que le hace referencia
RESTRICT: sólo elimina la columna si ninguna vista ni restricción le referencia
* Eliminación de la columna dirección de la tabla EMPLEADO
ALTER TABLE Empleado DROP direccion CASCADE;
ALTER TABLE Departamento DROP numerod <opción>;
– Si <opción> = RESTRICT: no elimina la columna ‘numerod’, pues existe una columna
‘EMPLEADO.nd’ que le hace referencia
– Si <opción> = CASCADE: elimina la columna y la restricción de integridad referencial que vincula
‘EMPLEADO.nd’ con DEPARTAMENTO. La columna ‘EMPLEADO.nd’ no es eliminada, pero
deja de ser clave ajena
Tema 2. Modelo relacional de datos
175
2.4 Manipulación de datos: SQL-92
LDD: alteración de tablas
• Modificación de la definición de una columna
ALTER TABLE <nombre_tabla> ALTER <nombre_columna> <acción> ;
<acción> indica la modificación que se desea realizar...
– Eliminación de la cláusula DEFAULT existente
ALTER TABLE Departamento ALTER nssdire DROP DEFAULT;
– Definición de un nuevo valor por omisión
ALTER TABLE Departamento ALTER nssdire SET DEFAULT ‘123456789012’;
Tema 2. Modelo relacional de datos
176
2.4 Manipulación de datos: SQL-92
LDD: alteración de tablas
• Modificación de una restricción de tabla
– La restricción que se desea modificar debe tener un nombre
– Eliminación de una restricción de tabla
ALTER TABLE <nombre_tabla> DROP CONSTRAINT <nombre_RI> <opción>;
ALTER TABLE Empleado DROP CONSTRAINT jefe_emp CASCADE;
– Adición de una restricción de tabla
ALTER TABLE <nombre_tabla>
ADD CONSTRAINT <nombre_RI> <definición_RI>;
ALTER TABLE Empleado
ADD CONSTRAINT salario_ok CHECK (salario > 0);
ALTER TABLE Empleado
ADD CONSTRAINT puesto_ok CHECK (puesto IS NOT NULL);
Tema 2. Modelo relacional de datos
177
2.4 Manipulación de datos: SQL-92
LDD: alteración de dominios
• Orden ALTER DOMAIN <nombre_dominio> <acción>;
<acción> indica la modificación que se desea realizar...
– Eliminación y Reemplazo del valor por omisión
ALTER DOMAIN <nombre_dominio> DROP DEFAULT;
ALTER DOMAIN <nombre_dominio> SET DEFAULT <valor>;
– Eliminación y Definición de nuevas restricciones de dominio
ALTER DOMAIN <nombre_dominio>
DROP CONSTRAINT <nombre_RI_dominio>;
ALTER DOMAIN <nombre_dominio>
ADD [ CONSTRAINT <nombre_RI_dominio> ] <restricción>;
Tema 2. Modelo relacional de datos
178
2.4 Manipulación de datos: SQL-92
LDD: eliminación de elementos del esquema
• Eliminación de una vista. Orden DROP VIEW
– Destruye una tabla derivada, junto con su definición en el
INFORMATION_SCHEMA del catálogo
DROP VIEW <nombre_vista> ;
• Eliminación de un dominio. Orden DROP DOMAIN
– Destruye un dominio de datos, junto con su definición en el
INFORMATION_SCHEMA del catálogo
DROP DOMAIN <nombre_dominio> <opción> ;
<opción> puede ser...
RESTRICT: destruye el dominio si no hay ninguna columna definida sobre él
CASCADE: se elimina el dominio y toda columna definida sobre él pasa a
tener el tipo de datos sobre el que se había definido el dominio
(este aspecto es ampliado en el tema “Integridad en sistemas de bases de
datos relacionales”)
Tema 2. Modelo relacional de datos
179
2.4 Manipulación de datos: SQL-92
LDD: eliminación de elementos del esquema
• Eliminación de una tabla. Orden DROP TABLE
– Destruye una tabla base, junto con su definición en el
INFORMATION_SCHEMA del catálogo
DROP TABLE <nombre_tabla> <opción>;
<opción> puede ser...
RESTRICT: Destruye la tabla sólo si no se le hace referencia desde ninguna
otra tabla (clave ajena), ni es tabla base de una vista
CASCADE: Elimina la tabla junto con restricciones y vistas que la referencian
• Eliminación de un esquema. Orden DROP SCHEMA
– Destruye un esquema de BD, junto con su definición en el
INFORMATION_SCHEMA del catálogo
DROP SCHEMA <nombre_esquema> <opción>;
<opción> puede ser...
RESTRICT: Destruye el esquema sólo si no contiene ningún elemento
CASCADE: Elimina el esquema y las tablas, dominios y demás elementos
contenidos en el esquema
Tema 2. Modelo relacional de datos
180
2.5. Integridad en Sistemas de Bases de Datos
Relacionales
Tipos de restricciones
2.5.1 Reglas de integridad: consideraciones generales y
componentes
2.5.2 Reglas de integridad en SQL-92
Reglas de integridad de dominio
Reglas de integridad de tabla
Reglas de integridad generales y Disparadores
2.5.3 Comprobación de restricciones
Tema 2. Modelo relacional de datos
181
2.5.1 Reglas de integridad
• Integridad: consistencia o corrección de datos en la base de datos
• Las reglas de integridad (RI) no son específicas para cada usuario
Consideraciones generales
1. Nos interesan las reglas de integridad específicas de una
BD (reglas del negocio), además de RI Entidad, RI Referencial...
2. Veremos las RI definidas sobre tablas base
- Por estar restringidas a contener datos correctos (reflejar la realidad)
La regla “los títulos de las películas son únicos” se aplica a la tabla base
PELICULA, y también a cualquier vista definida sobre ésta
- ¿Podemos definir RI sobre una vista (tabla derivada)?
• Sería deseable
• La vista heredaría toda RI de sus tablas base y podría añadir
nuevas (ejemplo: clave primaria o alternativa nueva para la vista)
Sólo consideraremos RI sobre tablas base (por simplicidad)
Tema 2. Modelo relacional de datos
182
2.5.1 Reglas de integridad
Consideraciones generales (y 2)
3. Nos interesa soporte de RI declarativo
No nos centraremos en...
- Procedimientos o funciones almacenados,
- Disparadores (triggers)
4. Una BD en un estado de integridad es correcta:
• No viola ninguna RI conocida por el SGBD, es decir,
• Satisface AND lógico de todas las RI definidas en su esquema
5. La integridad es importante en...
• DISEÑO (estructuras de datos y reglas de integridad adecuadas)
• EJECUCIÓN (corrección de la información)
6. RI son mantenidas en el INFORMATION_SCHEMA del catálogo
Subsistema de Integridad del SGBD:
• controla operaciones de usuario (INSERT,UPDATE,DELETE...)
• para asegurar que NO violan las reglas de integridad
183
Tema 2. Modelo relacional de datos
2.5.1 Reglas de integridad
Componentes de una RI
Nombre
actor_cache_ok
- Regla almacenada en INFORMATION_SCHEMA del catálogo con ese nombre
- Aparecerá en diagnósticos, producidos por el sistema como respuesta a
intentos de violación de la regla (mensajes de error al usuario)
Restricción NOT EXISTS ( SELECT * FROM ACTOR WHERE cache ≤ 0 )
- Expresión booleana 1 Restricción de Integridad ⊆ Regla de Integridad
- La regla ...
se satisface ⇔ la restricción es TRUE
es violada
⇔ la restricción es FALSE
Respuesta a un intento de violación de la regla
- Indica al SGBD qué hacer si se intenta una operación que viola la RI
- Por defecto RECHAZAR, que implica...
· Deshacer los posibles daños causados por la operación
· Mostrar información de diagnóstico (mensaje)
- Podría ser un procedimiento de complejidad arbitraria: tratarErr(...)
Tema 2. Modelo relacional de datos
184
2.5.1 Reglas de integridad
Creación, destrucción y tipos
• Creación de una regla de integridad... (en cualquier momento)
SGBD comprueba: ¿el estado actual de la BD satisface RI?
- No
RI rechazada
- Sí
RI aceptada
- Es almacenada en el INFORMATION_SCHEMA del catálogo
- La regla es activada (entra en vigor)
* Para la RI del ejemplo, actor_cache_ok , el SGBD controlará todo
INSERT INTO ACTOR… y UPDATE ACTOR SET cache =…
• Destrucción de reglas de integridad
- el sistema elimina su definición del INFORMATION_SCHEMA
• Las RIs pueden restringir los valores legales de...
- Dominio
- Tabla, Columna
- Base de datos
Tema 2. Modelo relacional de datos
185
2.5.2 Reglas de integridad en SQL-92
Categorías de reglas de integridad
1. Reglas de integridad de Dominio
– Asociadas a un dominio de datos específico
– Es una expresión de complejidad arbitraria que define un dominio
2. Reglas de integridad de Tabla
– RIs de complejidad arbitraria incluidas en la definición de una tabla
– Pueden ser restricciones de Columna
restricciones de Clave Candidata
restricciones de Clave Externa
restricciones de Comprobación
Una tabla vacía cumple cualquier RI de tabla,
aunque esa RI sea “esta tabla no puede estar vacía”
3. Reglas de integridad Generales
– RIs de complejidad arbitraria no incluidas en la definición de ninguna tabla
– Son otro elemento más de la BD, al mismo nivel que una tabla o vista
Tema 2. Modelo relacional de datos
186
2.5.2 Reglas de integridad en SQL-92
Otras consideraciones
• Es útil ver la base de datos sujeta a una “RI gigante”...
resultado del AND de todas las RI...
- generales
- de tabla
- de dominio aplicadas a cada columna de las tablas
Significado formal de la base de datos
• Una regla de integridad es independiente de cualquier
aplicación específica que acceda a la base de datos
- No contiene parámetros ni variables host
(referencias a variables de los programas de aplicación)
Tema 2. Modelo relacional de datos
187
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Dominio
• Definición del conjunto de valores componentes de un
dominio:
- Enumeración de valores posibles: (‘marron’,‘gris’, ‘azul’, ‘verde’, ‘negro’)
edad ≥ 0 AND edad ≤ 120
- Expresión de definición:
• RI como parte de la sentencia de definición del dominio
CREATE DOMAIN <nombre dominio> [ AS ] <tipo de datos>
[ DEFAULT <valor defecto> ]
[ [ CONSTRAINT <nombre restricción> ] CHECK (<condición>) ]+ ;
- <valor defecto> suele contener un literal (perteneciente al dominio) o NULL
• Aplicada a cada columna (de cualquier tabla) definida sobre el
dominio
CREATE DOMAIN Color_ojos AS VARCHAR(10)
DEFAULT ‘marron’
CONSTRAINT color_valido CHECK ( VALUE IN (‘marron’,‘gris’,‘azul’,‘verde’,‘negro’) );
Tema 2. Modelo relacional de datos
188
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Dominio (2)
• NOT NULL no es una restricción de dominio válida
CREATE DOMAIN Estado_civil AS CHAR(1) NOT NULL
Incorrecto
CONSTRAINT estado_civil_ok CHECK ( VALUE IN (‘S’, ‘C’, ‘V’, ‘D’) ) ;
CREATE DOMAIN Estado_civil AS CHAR(1)
CHECK (VALUE IS NOT NULL)
☺ Correcto
CONSTRAINT estado_civil_ok CHECK ( VALUE IN (‘S’, ‘C’, ‘V’, ‘D’) ) ;
• Alteración de un dominio
ALTER DOMAIN <nombre dominio> <acción>... ;
– Permite añadir y eliminar restricciones de integridad de dominio y
valor por defecto
– Explicado en el tema anterior
Tema 2. Modelo relacional de datos
189
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Dominio (y 3)
• Eliminación de un dominio
DROP DOMAIN <nombre dominio> { RESTRICT | CASCADE } ;
Opción RESTRICT
- La eliminación falla si el dominio es referenciado en cualquier definición de
columna en una tabla, de vista o restricción de integridad
- En otro caso, éxito: el descriptor del dominio es eliminado del
INFORMATION_SCHEMA del catálogo
Opción CASCADE
- El dominio es eliminado del INFORMATION_SCHEMA, junto con toda vista y RI
cuya definición hace referencia al dominio
- Las RI de dominio asociadas no son eliminadas, sino que cada
columna definida sobre el dominio...
· Es definida directamente sobre el tipo de datos subyacente al dominio
· Si no tiene DEFAULT explícito, toma el del dominio (si éste lo tenía)
· Hereda toda restricción de integridad asociada al dominio,
- convertida en una restricción de tabla,
- sustituyendo VALUE por el nombre de la columna
Tema 2. Modelo relacional de datos
190
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla
• Restricción asociada a una tabla específica
- No existe si la tabla no existe y
- Eliminar la tabla implica eliminar la RI
• RI especificada dentro de CREATE TABLE
L puede hacer
referencia a
otras tablas,
además de a la
que la incluye
CREATE TABLE <nombre tabla> ( <lista de elemento de tabla> ) ;
donde elemento puede ser:
- Definición de columna, que puede incluir RIs de columna
- Definición de... (precedida o no de CONSTRAINT <nombre restricción>)
· Restricción de clave candidata
· Restricción de clave externa
· Restricción de comprobación (CHECK)
• RI añadida/eliminada con ALTER TABLE <nombre tabla>...
• Toda RI de tabla es comprobada inmediatamente:
• Una operación de modificación sobre la tabla incluye el chequeo de
todas sus RI (como paso final de la operación)+(una posible) acción
Tema 2. Modelo relacional de datos
191
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (2)
1. Definición de Columna - RI de Columna
• Especificación del tipo de datos o dominio y otras RI de columna
• No necesita sentencia de creación explícita: es parte de la definición
de columna, dentro de la sentencia de creación de la tabla
CREATE TABLE Actor
( nombre
VARCHAR(30)
NOT NULL,
cache
INT(9)
DEFAULT 2000
NOT NULL,
ojos
Color_ojos
NOT NULL,
agencia
CHAR(4), ...) ;
• Si se especifica un dominio para una columna, la comprobación es
derivada hacia la comprobación de la restricción de dominio
• Una RI de columna se destruye al eliminar la columna de la tabla
Tema 2. Modelo relacional de datos
192
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (3)
2. Definición de Restricción de Clave Candidata
• Clave Primaria PRIMARY KEY (<lista columnas>) 1 incluye RI Entidad
• Clave Alternativa UNIQUE (<lista columnas>)
3. Definición de Restricción de Clave Externa
FOREIGN KEY (<lista columnas>) REFERENCES <tabla> (<lista columnas>)
[ ON DELETE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ]
[ ON UPDATE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ]
Posibles Acciones de Mantenimiento
de la Integridad Referencial
(explicadas en el tema anterior)
Tema 2. Modelo relacional de datos
193
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (4)
• Recordemos sobre las claves externas que…
• Cualquier (combinación de) columna(s) puede ser clave externa
• SQL-92 permite que una clave externa (FK) se refiera a una clave
candidata (CK): 1 clave primaria o clave alternativa
• Una clave externa y la clave candidata a la que referencia…
– Deben contener el mismo nº de componentes (columnas) y
– Las columnas “correspondientes” deben estar definidas sobre el
mismo dominio o tipo de datos
• Referencia desde una FK de la tabla T2 a una CK de la tabla T1...
» Asegurar que cada T2.FK contiene un valor existente en T1.CK
es el problema de la integridad referencial
• Pueden existir ciclos referenciales y auto-referencias
• SQL-92 permite (¡por supuesto!) que una FK pueda contener NULL
– salvo si se especifica NOT NULL para dicha FK en el CREATE TABLE
Tema 2. Modelo relacional de datos
194
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (y 5)
4. Definición de Restricción de Comprobación (CHECK)
• Regla que se refiere únicamente a la tabla que la contiene
• Puede especificar restricciones adicionales para una columna
*El caché de un actor siempre está entre 300 y 1200€
CREATE TABLE ACTOR (
...,
CONSTRAINT actor_cache_ok
CHECK ( cache ≥ 300 AND cache ≤ 1200 ),
... );
• Puede definir restricciones que involucran varias columnas
*Toda película se estrena después de finalizar su rodaje
CREATE TABLE PELICULA (
...,
CONSTRAINT pelicula_fechas_ok
CHECK ( fecha_fin_rodaje < fecha_estreno ),
... );
Tema 2. Modelo relacional de datos
195
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad Generales (Asertos)
• Predicado que expresa una condición que la BD debe
satisfacer siempre
• Puede involucrar cualquier número de columnas de
cualquier cantidad de tablas
• Es un elemento de BD, independiente de tablas y
vistas existentes
• Especifica restricciones de integridad que pueden no
ser...
de clave (primaria o alternativa)
de integridad referencial (clave externa)
• Tiene un nombre y consta de una condición (CHECK)
Tema 2. Modelo relacional de datos
196
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad Generales (2)
• Satisfacción y violación de una RI general
– Si alguna fila de la BD hace falsa la condición, el aserto es violado
– Un estado de la BD satisface un aserto si ninguna (combinación
de) fila(s) de dicho estado viola la condición que incluye
• Creación de una RI general
CREATE ASSERTION <nombre restricción>
CHECK ( <condición> ) ;
nombre obligatorio
• Eliminación de una RI general
DROP ASSERTION <nomRestricción> ;
1 Sin opción RESTRICT o CASCADE
– Elimina el aserto del INFORMATION_SCHEMA del catálogo
Tema 2. Modelo relacional de datos
197
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad Generales (3)
• Normalmente, la <condición> se expresa en negativo:
todo X satisface Y ≡ ningún X satisface NO( Y )
*Todo actor representado por la agencia 1 debe cobrar 300€ o más
CREATE ASSERTION RI1_age1_cache
CHECK (NOT EXISTS (SELECT * FROM Actor WHERE agencia=1 AND cache<300)) ;
*La paga mínima de los actores que actúan en una película es de 15.000€
CREATE ASSERTION RI2_paga_minima
CHECK 15000 ≤ (SELECT MIN(paga) FROM Actua_en) ;
*Toda agencia representa a un máximo de 40 actores
CREATE ASSERTION RI3_num_actores_age
CHECK (NOT EXISTS (SELECT * FROM Actor
GROUP BY codAge
HAVING COUNT(*) > 40)) ;
Tema 2. Modelo relacional de datos
198
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad Generales (4)
*Todo actor debe haber participado al menos en una película
CREATE ASSERTION RI4_actor_en_pelicula
CHECK (NOT EXISTS (SELECT * FROM Actor
WHERE codA NOT IN (SELECT actor FROM Actua_en)));
*Todo actor no protagonista de una película cobra menos que cualquier protagonista
CREATE ASSERTION RI5_paga_actores
CHECK (NOT EXISTS (SELECT * FROM Actua_en ACT WHERE papel<>‘protagonista’ AND
paga >= ANY (SELECT paga FROM Actua_en PROTA
WHERE ACT.film=PROTA.film
AND PROTA.papel=‘protagonista’));
*Debe de existir al menos una distribuidora de películas
CREATE ASSERTION RI6_existe_distribuidora
CHECK ( 0 < SELECT COUNT (*) FROM Distribuidora ) ;
1 este aserto...
- debe crearse una vez que ya exista alguna fila en DISTRIBUIDORA
- una operación DELETE puede violarlo, pero nunca lo hará un INSERT
Tema 2. Modelo relacional de datos
199
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad Generales (5)
• Algunas RI generales pueden ser expresadas como RI de
tabla
*El código de los guiones es único (≡ si hay 2 guiones con igual código, son el mismo)
CREATE ASSERTION RI7_guion_codigo_unico
CHECK ( NOT EXISTS (
SELECT * FROM Guion G1
WHERE G1.codG IN (SELECT codG FROM Guion G2
WHERE G1.titulo<>G2.titulo OR G1.resumen<>G2.resumen
OR G1.nomAutorPpal<>G2.nomAutorPpal OR G1.fechaFin<>G2.fechaFin
OR G1.fechaEntrega<>G2.fechaEntrega) ) );
1 este aserto...
- Equivale a especificar UNIQUE( codG ) en el CREATE TABLE Guion (…)
Tema 2. Modelo relacional de datos
200
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad Generales (y 6)
• Y viceversa: algunas RI de tabla pueden ser expresadas
como RI generales
- Excepto la parte de una RI de clave externa que indica la acción de
mantenimiento de la integridad referencial (ON DELETE… ON UPDATE…)
*Los actores y películas anotados en la tabla ACTUA_EN deben existir
CREATE ASERTION RI8_actua_en_ok
CHECK (NOT EXISTS (SELECT * FROM Actua_en
WHERE actor NOT IN (SELECT codA FROM Actor)
OR film NOT IN (SELECT codP FROM Pelicula)));
1 este aserto...
- Equivale a especificar...
FOREIGN KEY (actor) REFERENCES Actor(codA)...
y FOREIGN KEY (film) REFERENCES Pelicula(codP)...
... dentro del CREATE TABLE Actor (...)
Tema 2. Modelo relacional de datos
201
2.5.2 Reglas de integridad en SQL-92
Disparadores - versión SQL:1999
• En muchos casos conviene especificar una acción que
ejecutar tras la violación de una restricción:
-
Abortar la transacción que provoca la violación, o
Informar de ello al usuario (mensaje), o
Ejecutar cierto procedimiento, o
Realizar otras actualizaciones en la base de datos...
Esto se consigue mediante los disparadores o triggers
• Un disparador se ejecuta de forma automática como
efecto secundario de cierta modificación de la BD
• Los SGBDR usan ampliamente los disparadores, pero no
formaron parte del estándar hasta la versión SQL:1999
¨ cada SGBDR los implementó con su propia sintaxis
L Los disparadores SQL:1999 son similares a los de Oracle
Tema 2. Modelo relacional de datos
202
2.5.2 Reglas de integridad en SQL-92
Disparadores - versión SQL:1999 (2)
• Para diseñar un disparador, se debe especificar :
- Las condiciones en las que se debe ejecutar:
Evento que causa la comprobación del disparador
Condición que se debe cumplir para ejecutarlo
- La Acción que se realizará cuando se ejecute
• Es el modelo de disparadores evento-condición-acción
• La BD almacena los disparadores, por lo que...
- son persistentes y
- están accesibles para todas las operaciones de BD
• El SGBD ejecuta automáticamente un disparador cada
vez que ocurre el evento especificado y se cumple la
condición correspondiente
• La ejecución del disparador se considera parte de la ejecución
de la operación que provoca su activación
203
Tema 2. Modelo relacional de datos
2.5.2 Reglas de integridad en SQL-92
Disparadores - versión SQL:1999 (3)
• Definición de un disparador
CREATE TRIGGER <nombre_disparador>
{ BEFORE | AFTER } { INSERT | UPDATE [OF <lista columnas>] | DELETE }
ON <nombre_tabla>
[ REFERENCING OLD [ ROW | TABLE ] [ AS ] <nombre>
[ NEW [ ROW | TABLE ] [ AS ] <nombre> ] ]
[ FOR EACH ROW | FOR EACH STATEMENT ]
[ WHEN <condición> ]
Evento
Parametrización
Granularidad
Condición
BEGIN ATOMIC
...
END;
Tema 2. Modelo relacional de datos
Acción
204
2.5.2 Reglas de integridad en SQL-92
Disparadores - versión SQL:1999 (4)
* Antes de que un usuario elimine una o varias filas de la tabla PELICULA, el sistema debe
anotar dicha acción en una tabla DIARIO_BORRADOS, indicando el usuario y el momento
concreto en el que se realiza dicha operación.
CREATE TRIGGER anotacion_borrado_pelicula
BEFORE DELETE ON PELICULA
FOR EACH STATEMENT
INSERT INTO Diario_Borrados
VALUES( ‘PELICULA’, CURRENT_USER, CURRENT_TIMESTAMP);
• Si la acción del trigger sólo consiste en una sentencia SQL, no es necesario
utilizar las palabras reservadas BEGIN ATOMIC ni END
L Este trigger está escrito en SQL:1999, y no en SQL de Oracle…
Tema 2. Modelo relacional de datos
205
2.5.2 Reglas de integridad en SQL-92
Disparadores - versión SQL:1999 (5)
* Si un actor no protagonista de una película percibe una paga no inferior que la de un
protagonista, asignarle el mínimo cobrado por un protagonista menos 1000€.
CREATE TRIGGER PagaNoProta
En Oracle este trigger tendría el
AFTER UPDATE OF paga ON ACTUA_EN
problema de la tabla mutante
REFERENCING NEW ROW AS nueva
Se verá en las prácticas de PL/SQL
FOR EACH ROW
WHEN nueva.papel <> ‘protagonista’ AND
nueva.paga ≥ (SELECT MAX ( paga ) FROM ACTUA_EN
WHERE film = nueva.film AND papel = ‘protagonista’ )
BEGIN ATOMIC
UPDATE ACTUA_EN
SET paga = (SELECT MIN( paga ) - 1000
FROM ACTUA_EN
WHERE film = nueva.film AND papel = ‘protagonista’ )
WHERE actor = nueva.actor AND film = nueva.film
END;
Tema 2. Modelo relacional de datos
206
2.5.2 Reglas de integridad en SQL-92
Disparadores - versión SQL:1999 (y 6)
• Los disparadores combinan los enfoques declarativo y
procedimental
- El evento y la condición del disparador son declarativos
- Su acción opera por procedimientos
• Comparación ASSERTION vs. TRIGGER
- ASSERTION prohibe realizar una actualización que viola el aserto
(es decir, que hace FALSE la condición)
- TRIGGER puede permitir la actualización que cumple la condición
(es decir, que viola una RI), pero ejecuta una acción (que puede
reparar la violación, dejando consistente la BD)
Las condiciones especificadas en una y otro son inversas
Tema 2. Modelo relacional de datos
207
2.5.2 Reglas de integridad en SQL-92
Características adicionales (pseudo-RIs)
• SQL rechaza todo intento de INSERT o UPDATE que viole una
especificación de tipo de datos
Ejemplo: introducción de valor CHAR en columna definida como INTEGER
- Una especificación de tipo de datos puede verse como una “forma
primitiva” de restricción de integridad de dominio
- Una violación de una RI de dominio o de tipo de datos se detecta en
tiempo de ejecución
• SQL rechaza todo intento de INSERT o UPDATE sobre una
vista, si viola la condición de definición de la vista
- Siempre que se haya especificado la “opción de verificación” en la
definición de la vista (WITH CHECK OPTION)
Tema 2. Modelo relacional de datos
208
2.5.3 Comprobación de restricciones
• En general, el SGBD comprueba una RI de inmediato,
como último paso de la ejecución de una sentencia SQL
– Si la RI es violada por la sentencia, ésta es cancelada y no tiene efecto
sobre la base de datos
• A veces es necesario que ciertas restricciones no sean
comprobadas hasta pasado un tiempo, pues si se
hiciera de inmediato siempre fallarían
Ciclo referencial
EMP
DEP
CREATE TABLE EMP
( cod_emp ...
depto ... ,
FOREIGN KEY ( depto )
REFERENCES DEP ( cod_dep ) ... ,
... ) ;
Inicialmente, EMP y DEP están vacías
CREATE TABLE DEP
( cod_dep ... ,
jefe ... ,
FOREIGN KEY ( jefe )
REFERENCES EMP ( cod_emp )... ,
... ) ;
- Con chequeo inmediato de las RI de clave externa (RI referencial),
todo INSERT de una fila en EMP o en DEP fallaría, pues nunca
encontraría la fila destino (referenciada) en la otra tabla…
Tema 2. Modelo relacional de datos
209
2.5.3 Comprobación de restricciones
Modos de comprobación
• En un momento dado, dentro de cierta transacción SQL, toda
restricción de integridad debe estar en modo...
- INMEDIATE: será comprobada inmediatamente, o
- DEFERRED: será chequeada al final de la transacción (diferida)
• Para algunas restricciones de integridad, la comprobación
diferida no tiene sentido:
• Restricciones de dominio y tipo de datos
• Restricción de columna NOT NULL y
• Restricciones de clave candidata (UNIQUE, PRIMARY KEY)
Tema 2. Modelo relacional de datos
210
2.5.3 Comprobación de restricciones
Modos de comprobación (2)
• Una definición de RI puede incluir estas dos cláusulas…
[ INITIALLY {IMMEDIATE | DEFERRED} ]
[ [ NOT ] DEFERRABLE ]
- Modo inicial de la RI: INITIALLY DEFERRED o INITIALLY IMMEDIATE
– Especifica el modo en el que está la RI tras de ser definida (creada) y al
comienzo de cada transacción SQL
- Opción de cambio de modo: DEFERRABLE o NOT DEFERRABLE
– Indica si la RI puede pasar a modo DEFERRED
- Valores asumidos por omisión:
Si no se indica ningún modo inicial, se asume INITIALLY IMMEDIATE
Si se especifica INITIALLY IMMEDIATE (o se asume)...
- Si no se indica DEFERRABLE ni NOT DEFERRABLE, asume NOT DEFERRABLE
Si se especifica INITIALLY DEFERRED, no puede indicarse NOT DEFERRABLE
- Puede ponerse DEFERRABLE, aunque se supone
Tema 2. Modelo relacional de datos
211
2.5.3 Comprobación de restricciones
Modos de comprobación (y 3)
• Sentencia SET CONSTRAINTS
SET CONSTRAINTS {<lista restricciones> | ALL} { DEFERRED | IMMEDIATE}
- Establece el modo para varias RIs para la transacción actual
- Toda RI mencionada debe ser DEFERRABLE
De hecho ALL ≡ todas las RIs diferibles
- DEFERRED: toda RI mencionada pasa a modo diferido
- IMMEDIATE: cada RI pasa a modo inmediato y es comprobada
- si falla la comprobación de alguna RI, falla SET CONSTRAINTS y
ninguna RI cambia de modo
• Ejecutar COMMIT implica realizar SET CONSTRAINTS ALL IMMEDIATE
- Si la comprobación de alguna RI falla
COMMIT falla
la transacción completa falla (rollback)
Tema 2. Modelo relacional de datos
212
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (5)
• Claves externas: acciones referenciales (recordatorio)
– Mantenimiento de integridad referencial ante intentos de violación
– Ejecución de operaciones adicionales que dejan la BD consistente
ON DELETE...
– Indica la regla de borrado para filas de T1 respecto de T2.FK
Qué ocurre si se intenta eliminar una fila r1 de T1 y existe alguna fila r2 en T2 que le hace
referencia (e.d. contiene un valor r2.FK = r1.CK)
– Acciones referenciales posibles:
a. NO ACTION (opción por omisión) Rechazar la operación de eliminación sobre T1
b. CASCADE Eliminar junto con r1 toda fila r2 de T2 que se refiera a r1 (propagación)
c. SET DEFAULT
Asignar su valor por defecto a cada componente de la FK en toda fila r2, y eliminar r1
» Debe existir una fila en T1 con cada componente de CK a su valor por defecto
d. SET NULL
Asignar NULL a cada componente de la FK en todas las filas r2, y eliminar r1
» Cada componente de la FK debe tener nulos permitidos
Tema 2. Modelo relacional de datos
213
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (6)
ON UPDATE...
– Indica la regla de actualización para T1.CK respecto de T2.FK
Qué ocurre si se intenta modificar la clave candidata dentro de una fila r1 de T1 y existe
alguna fila r2 en T2 que le hace referencia (contiene valor r2.FK = r1.CK)
– Acciones referenciales posibles:
a. NO ACTION (opción por omisión) Rechazar la actualización sobre T1.CK
b. CASCADE Propagar la actualización de CK a toda fila r2 de T2 que se refiera a r1
c. SET DEFAULT
Asignar su valor por defecto a los componentes de FK que corresponden a
componentes modificados de T1.CK, en todas las filas r2, y actualizar r1
» Debe existir una fila en T1 con cada componente de CK a su valor por defecto
d. SET NULL
Asignar NULL a los componentes de la FK correspondientes a componentes modificados
en T1.CK, en todas las filas r2, y actualizar r1
» Tales componentes de la FK debe tener nulos permitidos
Tema 2. Modelo relacional de datos
214
2.5.2 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (7)
• Comportamiento ante una operación de manipulación de
datos, en función de la acción referencial especificada
Sea T2.FK una clave externa hacia la clave candidata T1.CK ...
La definición de FK no incluye ON DELETE ni ON UPDATE...
INSERT en T2 o UPDATE de T2.FK
si el valor de T2.FK no existe en T1.CK
Rechazar (NO ACTION)
DELETE en T1 o UPDATE de T1.CK
si alguna fila de T2 le hace referencia
Rechazar (NO ACTION)
La definición de FK incluye ON DELETE o bien ON UPDATE...
INSERT en T2 o UPDATE de T2.FK
si el valor de T2.FK no existe en T1.CK
DELETE en T1 o UPDATE de T1.CK
si alguna fila de T2 le hace referencia
especificada en las cláusulas
Tema 2. Modelo relacional de datos
Rechazar (NO ACTION)
ejecución de la acción referencial
215
Descargar