Vous êtes sur la page 1sur 116

2.

4 Manipulacin de datos
2.4.3. El lenguaje relacional SQL-92
Structured Query Language (lenguaje estructurado de consulta)
Primer lenguaje de BD de alto nivel. Aos 70.
Diseado e implementado en el IBMs Research Laboratory (San Jos
- California), para el SGBD Relacional experimental System R

Definicin de un lenguaje estndar 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 Orientacin a Objetos, disparadores, )
SQL:2003 (incluye XML y otros conceptos recientes)

Primeras implementaciones:
ORACLE (finales 70) y poco despus INGRES
1

2.4 Manipulacin de datos: SQL-92


Lenguaje de bases de datos completo (no slo de
consulta)
Definicin y Manipulacin de Datos (LDD + LMD)
Definicin y destruccin de Vistas (LDV)
Creacin y destruccin de ndices (aunque en SQL-92 ya no existen)
Incorporacin de SQL dentro de cdigo escrito con un Lenguaje de
Programacin de propsito general (Pascal, C, etc.)

Los proveedores de SGBDR comerciales (Oracle)


implementan variaciones de SQL
Algunas incluyen caractersticas que no estn estandarizadas
(triggers /reglas activas incluidos en la versin SQL:1999)

Niveles de compatibilidad con el estndar de SQL


Entry SQL
Intermediate SQL
Full SQL
2

2.4 Manipulacin de datos: SQL-92


Lo que vamos a estudiar...
Consultas o Seleccin de datos
Modificacin de datos
Vistas
Definicin y Alteracin de datos
Esquemas, Dominios, Tablas

Restricciones de Integridad Generales


(Asertos)
Seguridad y Control de Acceso

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(4)

SQL-92 vs. Modelo Relacional Formal


No utiliza los trminos formales relacin, atributo, tupla,
sino tabla, columna, fila
Permite que las tablas tengan 2 o ms filas idnticas 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 opcin DISTINCT en una SELECT (*se ver*)
Las columnas de una tabla estn ordenadas, y es posible
indicar un orden de visualizacin de las filas
Una clave ajena puede referenciar a una clave
candidata
4

2.4 Manipulacin de datos: SQL-92


Esquema de base de datos COMPAA
EMPLEADO
NOMBRE
APELLIDO

NSS NIF FECHAN DIRECCION SEXO SALARIO

NSSJEFE ND

DEPARTAMENTO
NOMBRED NUMEROD NSSDIRE FECHAINICDIRE
OFICINA_DEPTO
NUMEROD OFICINA
PROYECTO
NOMBREP NUMEROP LUGARP
TRABAJA_EN
NSSE NUMP

NUMEROD

HORAS

FAMILIAR
NSSE NOMBRE_FAMILIAR SEXO FECHAN PARENTESCO
5

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

Orden SELECT:
Instruccin bsica de
obtencin de
informacin

SELECT <lista columnas>


FROM <lista tablas>
WHERE <condicin>

donde:
<lista columnas>
<lista tablas>
<condicin>

columnas cuyos valores va a obtener la consulta


tablas necesarias para realizar la consulta
expresin booleana para identificar filas que obtendr la consulta
(expresin de reunin y/o de seleccin)

Fecha de nacimiento y direccin 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 <condicin> y
proyecta el resultado sobre las columnas de <lista columnas>
6

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(2)

La orden SELECT ... FROM ... WHERE...

No es igual a la operacin restriccin del lgebra


Relacional
SELECT de SQL tiene muchas ms opciones y matices
En caso de una nica tabla T en <lista tablas>
SELECT <lista columnas>
FROM T
WHERE <condicin>
es equivalente a...

<lista columnas>(<condicin> ( T ))

* Nombre, apellido y direccin de los empleados del departamento de Investigacin

SELECT nombre, apellido, direccion


FROM Empleado, Departamento reunin o join de tablas
WHERE nombred=Investigacin condicin de seleccin
AND numerod=nd;
condicin de reunin entre tablas
7

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(3)

Cualquier n de condiciones seleccin/reunin en


SELECT
* Para cada proyecto ubicado en Santiago, obtener el n del proyecto, n del departamento que lo
controla y el apellido, direccin 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 Administracin y de Investigacin

SELECT salario
FROM Empleado, Departamento
WHERE (nombred = Administracin OR nombred = Investigacin)
AND numerod=nd;
8

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(5):

uso de *

Obtencin de los valores de todas las columnas de las


filas seleccionadas
No es necesario listar todos los nombres tras clusula
SELECT

Uso del smbolo * (todas las columnas)


SELECT *
FROM Empleado
WHERE nd=5;
SELECT *
FROM Departamento
WHERE nombred=Investigacin;
SELECT *
FROM Empleado, Departamento
WHERE nombred=Investigacin AND nd=nmerod;
9

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(6):

omisin de WHERE

Seleccin incondicional
Equivale a una condicin TRUE para todas las filas
seleccin de todas las filas de...
una tabla (si la clusula FROM slo contiene una tabla), o
el producto cartesiano entre varias tablas (si FROM incluye ms 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;

10

2.4 Manipulacin de datos: SQL-92


Consultas bsicas
caracteres
Operador LIKE

(7):

cadenas de

Comparacin de cadenas de caracteres


Caracteres reservados: % y _ (comodines)
*Nombres y apellidos de los empleados cuya direccin est en Higueras, estado de Mxico

SELECT nombre, apellido


FROM Empleado
WHERE direccion LIKE %Higueras, MX% ;

Operador ||
Concatenacin de cadenas de caracteres
* Nombres completos en una sola columna de empleados con direccin en Higueras (Mxico)

SELECT nombre || || apellido


FROM Empleado
WHERE direccion LIKE %Higueras, MX% ;
11

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(8):

aritmtica y tiempo

Operaciones aritmticas
Aplicacin de operadores aritmticos ( + - * / ) sobre valores numricos
* 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 ;
el valor real de los salarios en la tabla EMPLEADO no cambia

Operaciones con fechas, horas, marcas de tiempo e


intervalos
Especificacin 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
12

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(9):

calificacin

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...
AMBIGEDAD --------------Solucin: CALIFICACIN
El esquema COMPAA incluye las siguientes tablas:

DEPARTAMENTO (nombred, numerod, nssdire, fechainicdire)


OFICINA_DEPTO (numerod, oficina)
* Cdigo, nombre y lugares de los departamentos de Marketing y de Investigacin

SELECT Departamento.numerod, nombred, oficina


FROM Departamento, Oficina_depto
WHERE Departamento.nombred IN (Marketing, Investigacin)
AND Departamento.numerod = Oficina_depto.numerod;
13

2.4 Manipulacin de datos: SQL-92


Consultas bsicas

(10):

seudnimos

Puede utilizarse seudnimos para acortar nombres


de tabla dentro de las consultas con calificacin:
SELECT nombred, D.numerod, oficina
FROM Departamento AS D, Oficina_depto L
AS es opcional
WHERE D.nombred IN (Marketing, Investigacin)
AND D.numerod = L.numerod;

Consulta que se refiere dos veces a la misma tabla


AMBIGEDAD ------------------- Solucin: SEUDNIMOS
* 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;
14

2.4 Manipulacin de datos: SQL-92


Consultas bsicas (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

Seudnimos de columnas (y/o tablas) en clusula


FROM

SELECT nom, num, oficina


FROM Departamento D(nom, num, dire, inidire), Oficina_depto
WHERE nom IN (Marketing, Investigacin) AND num = numerod;
15

2.4 Manipulacin de datos: SQL-92


Consultas bsicas (y 12): orden de
presentacin
SQL permite presentar las filas resultado de una
consulta de forma ordenada: Clusula ORDER BY
Ordenacin segn valores de una o varias columnas
Ascendente ASC (por defecto) o Descendente DESC
Suele ser una operacin muy costosa

las filas no se ordenan en disco: se ven ordenadas, pero no lo estn


*Nombre y apellido de los empleados, y proyectos en los que trabajan, en orden descendente por
departamentos y, dentro de cada departamento, en orden alfabtico 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;
16

2.4 Manipulacin de datos: SQL-92


Tablas como conjuntos
SQL no elimina filas repetidas del resultado de una
consulta, porque...

Eliminacin de duplicados costosa (ordenar+recorrer+eliminar)


El usuario puede desear ver las filas repetidas en el resultado
Si se aplica una funcin agregada a filas, rara vez deben
eliminarse las duplicadas

Operador DISTINCT:

Para eliminar duplicados del resultado de una consulta SQL


Resultado = Relacin del Modelo Relacional Formal (conjunto de filas)

* Salarios de todos los empleados

SELECT salario FROM Empleado;


* Salarios distintos de empleados, sin importar cuntos perciban cada cantidad

SELECT DISTINCT salario


FROM Empleado;
17

2.4 Manipulacin 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

18

2.4 Manipulacin de datos: SQL-92


Tablas como conjuntos (3): conjuntos
explcitos

Un conjunto explcito de valores es una lista de


valores encerrada entre parntesis
Puede aparecer en la clusula 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 algn elemento e de V cumple que v = e
* nss de los empleados que trabajan en algn proyecto que no sea el 4 ni el 6

SELECT DISTINCT nsse FROM Trabaja_en


WHERE nump NOT IN (4, 6);
19

2.4 Manipulacin de datos: SQL-92


Tablas como conjuntos (4): conjuntos
explcitos
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 algn 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);
20

2.4 Manipulacin de datos: SQL-92


Consultas anidadas
Es una consulta SELECT completa, dentro de
clusula WHERE de otra consulta (consulta exterior)
Obtiene valores de la BD que se usan en la condicin de
otra consulta, para obtener otros datos
* Nmeros 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=nmerod
AND nssdire=nss AND apellido=Silva ) ;

Es posible tener varios niveles de consultas


anidadas
21

2.4 Manipulacin 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 direccin de los empleados que trabajan en algn proyecto.

SELECT nombre, direccin FROM Empleado


WHERE nss IN ( SELECT nsse FROM TRABAJA_EN );
* Nmeros de seguridad social de aquellos empleados que trabajan en algn proyecto en el que trabaje
el empleado Jos B. Silva, de forma que ambos tengan la misma combinacin (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 (nmp, horas) IN ( SELECT nmp, horas
FROM Trabaja_en
WHERE nsse=123456789);
22

2.4 Manipulacin 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?
23

2.4 Manipulacin de datos: SQL-92


Consultas anidadas (4): columnas
ambiguas
Coincidencia de nombres de columnas en las consultas
exterior y anidada Ambigedad

* 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 ); cmo evitar esta ambigedad?

Regla: Una columna no calificada se refiere a la tabla


declarada en la consulta anidada ms 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 );
24

2.4 Manipulacin de datos: SQL-92


Consultas anidadas

(5):

correlacin

Una consulta exterior y otra anidada estn


correlacionadas si una condicin 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 evala una vez para cada fila


(o combinacin de filas) de la consulta exterior
Evala 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 reunin (join)
SELECT E.nombre, E.apellido
FROM Empleado, Familiar D
WHERE nss=nsse AND D.sexo=F;
25

2.4 Manipulacin de datos: SQL-92


Consultas anidadas

(6):

EXISTS

Operador EXISTS (S): comprobacin de tablas vacas


Devuelve TRUE si la tabla S contiene al menos una fila
Devuelve FALSE si S es una tabla vaca (sin filas)

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);

26

2.4 Manipulacin de datos: SQL-92


Consultas anidadas

(y 7):

UNIQUE

Operador UNIQUE (S): Comprobacin de filas duplicadas


Devuelve TRUE si NO hay filas repetidas en S

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 );
27

2.4 Manipulacin de datos: SQL-92


Nulos
Null
Ausencia o desconocimiento de informacin
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;
28

2.4 Manipulacin de datos: SQL-92


Funciones agregadas
Funcin COUNT( )

Cuenta el nmero de filas o de valores especificados en una


consulta

Funciones SUM( ), MAX( ), MIN( ), AVG( )

Suma, mximo, mnimo y media aritmtica (promedio)


Aplicadas a un multiconjunto (saco, bag) de valores numricos

Pueden aparecer en clusula SELECT


* Suma de los salarios y salario mximo, mnimo y medio de los empleados

SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)


FROM EMPLEADO;
* Suma de los salarios y salario mximo, mnimo y medio de empleados del depto. de Investigacin

SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario)


FROM Empleado, Departamento
WHERE nd=nmerod AND nombred=Investigacin;

Tambin pueden aparecer en clusula HAVING

(*se ver*)
29

FUNCIONES de
AGREGADAS
2.4 Manipulacin
datos: SQL-92
Funciones agregadas

DISTINCT
Uso de *

(2):

uso de * y de

* Nmero total de empleados de la compaa

SELECT COUNT(*) FROM Empleado ( cuenta filas)


* Contar el nmero de empleados de la compaa que tienen un jefe

SELECT COUNT(nssjefe) FROM Empleado;


( cuenta filas con nssjefe no NULL)
* Nmero de empleados en el departamento de Investigacin

SELECT COUNT(*) FROM Empleado, Departamento


WHERE nd=nmerod AND nombred=Investigacin;

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 !!


30

2.4 Manipulacin de datos: SQL-92


Funciones agregadas

(y 3)

y correlacin

Es posible que una consulta anidada y


correlacionada con otra exterior, incluya una funcin
agregada
* Nombres de los empleados con 2 o ms familiares

SELECT apellido, nombre FROM Empleado


WHERE 2 ( SELECT COUNT(*)
FROM Familiar
WHERE nss=nsse );

31

2.4 Manipulacin de datos: SQL-92


Agrupacin
Clusula GROUP BY
Para formar subgrupos de filas dentro de una tabla
Los grupos se forman segn el valor de las columnas de

agrupacin
Las filas de cada grupo tendrn el mismo valor en las
columnas de agrupacin

Aplicacin de funciones agregadas a grupos de


filas
* Para cada departamento, obtener su nmero, cuntos empleados tiene dicho departamento y el
salario medio de los empleados del mismo

SELECT nd, COUNT(*), AVG(salario)


FROM
LasEmpleado
columnas de agrupacin deben aparecer en la clusula SELECT,
GROUP
BYde
ndcualquier
; una funcin
columnaagregada,
de agrupacin
antes
para que su valor (nico para cada
grupo) aparezca junto al resultado de aplicar la funcin al grupo
32

2.4 Manipulacin de datos: SQL-92


Agrupacin

(2)

Clusula HAVING
Siempre junto a GROUP BY
Condicin que deben cumplir los grupos de filas
asociados a cada valor de las columnas de agrupacin
Un grupo que no cumple la condicin, no es seleccionado
para el resultado
* Para cada proyecto en el que trabajen ms de dos empleados, obtener el nmero 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 ;
33

2.4 Manipulacin de datos: SQL-92


Agrupacin

(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 slo en el caso de
departamentos en los que trabajen ms de 5 empleados

(* Consulta incorrecta por qu? *)

(* Consulta correcta *)

SELECT nombred, COUNT(*)


FROM Departamento, Empleado
WHERE nmerod=nd
AND salario>1800
GROUP BY nombred
HAVING COUNT(*) > 5 ;

SELECT nombred, COUNT(*)


FROM Departamento, Empleado
WHERE nmerod=nd
AND salario>1800
AND nd IN (SELECT nd
FROM Empleado
GROUP BY nd
HAVING COUNT(*) > 5)
GROUP BY nombred ;

(* pista: orden de ejecucin *)

34

2.4 Manipulacin de datos: SQL-92


Tablas reunidas
Reunin especificada en la clusula FROM de una consulta
Hasta ahora la hemos especificado en clusulas FROM y
WHERE
* Nombres y direccin de empleados del departamento de Investigacin

SELECT nombre, apellido, direccion


FROM Empleado, Departamento
WHERE nombred=Investigacion
AND nd=numerod;

reunin de tablas
condicin de reunin

Consultas ms comprensibles: separa condiciones de


reunin y de seleccin
* Nombres y direccin de empleados del departamento de Investigacin

SELECT nombre, apellido, direccion


FROM (Empleado JOIN Departamento ON nd=numerod)
WHERE nombred=Investigacion;

tabla reunida

35

2.4 Manipulacin de datos: SQL-92


Tablas reunidas (2): anidamiento
Es posible anidar varias especificaciones de reunin
de tablas
* Para cada proyecto ubicado en Santiago, obtener el n de proyecto, el n del departamento que lo
controla y el apellido, direccin y fecha de nacimiento del gerente de ese departamento

SELECT nmerop, nmd, apellido, direccin, fechan


FROM ( ( Proyecto JOIN Departamento ON nmd=nmerod )
JOIN Empleado ON nssdire=nss )
WHERE lugarp=Santiago;

36

2.4 Manipulacin de datos: SQL-92


Reunin Interna de tablas (inner join)
Es el tipo de reunin por defecto
SELECT ...
FROM ( R1 JOIN R2 ON <condicin_reunin> )
WHERE ...
Si existe una fila t1 en R1 y otra fila t2 en R2, tales que
cumplen la condicin de reunin, 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

Tambin puede especificarse como


R1 INNER JOIN R2 ON <condicin_reunin>
37

2.4 Manipulacin de datos: SQL-92


Reunin Natural de tablas (natural join)
Sin condicin de reunin explcita
SELECT ...
FROM ( R1 NATURAL JOIN R2 )
WHERE ...
Equi-reunin implcita para cada par de columnas
con igual nombre en una y otra tabla
Slo 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 clusula FROM
SELECT nombre, apellido, direccion
FROM ( Empleado NATURAL JOIN (Departamento AS DEP(nombred, nd, dire, fech)) )
WHERE nombred=Investigacion;
38

2.4 Manipulacin de datos: SQL-92


Reunin Externa de tablas (outer join)
til si en una reunin se necesita obtener las filas
con valor NULL en las columnas de reunin, o
sin correspondencia en la otra tabla
Tipos de reunin externa:
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN

Reunin externa izquierda


Reunin externa derecha
Reunin 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 tambin los empleados sin supervisor (con NULL en nssjefe)


39

2.4 Manipulacin de datos: SQL-92


Evaluacin de consultas
En una consulta SQL hay un mximo de 6 clusulas
Slo son obligatorias SELECT y FROM
Orden de especificacin de las clusulas:
SELECT <lista columnas>

columnas o funciones que se van a

obtener

FROM <lista tablas>

tablas necesarias (incluso las reunidas)

WHERE <condicin para filas>

condiciones para seleccin de filas

GROUP BY <lista columnas agrupacin> especificacin del agrupamiento de fila s


HAVING <condicin para grupos>
fila s

condicin para seleccin de grupos de

ORDER BY <lista columnas ordenacin> orden de presentacin del resultado


40

2.4 Manipulacin de datos: SQL-92


Evaluacin de consultas

(2)

Orden de evaluacin de las clusulas:


1) FROM (es decir, la reunin o join de tablas, si se especifica ms 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 reunin en clusula WHERE, o
b) tablas reunidas en la clusula FROM, o
c) consultas anidadas y el operador de comparacin IN ...

Flexibilidad
41

2.4 Manipulacin de datos: SQL-92


Evaluacin de consultas

(y 3)

Ventajas e inconvenientes de esta flexibilidad:

el usuario elige la tcnica o enfoque ms cmodo


Confusin del usuario: qu tcnica uso?
Algunas tcnicas son ms eficientes que otras
el usuario debe determinar cul

En condiciones ideales...
Usuario: se preocupa slo de especificar la consulta
correctamente
SGBD: se ocupa de ejecutar la consulta de manera eficiente

Pero en la prctica no suele ser as...


conviene saber qu tipos de consulta son ms y menos
costosos
Recomendacin (optimizacin de consultas):

Consultas con mnimo anidamiento correlacionado


y mnimo ordenamiento implcito
42

2.4 Manipulacin de datos: SQL-92


Insercin de datos
Orden INSERT
Aade 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, 'Martnez', '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, 'Martnez', '653298653123', 987654321, 4, 37000,
'987654321321', 'Olmo 98, Cedros, MX', '30-DIC-52', M ) ;
43

2.4 Manipulacin de datos: SQL-92


Insercin

(2)

Insercin de varias filas en una sola orden INSERT


Filas separadas por comas
Cada fila se encierra entre parntesis

Especificacin explcita de algunas columnas (y no


todas)
Omisin de columnas cuyo valor se desconoce
Cada columna no especificada tomar el...
valor por omisin: valor tomado de su clusula DEFAULT, o
NULL: si la columna permite nulos y no se defini clusula
DEFAULT para la misma
* Insercin de un empleado del que slo se conoce su nombre, apellidos, nss y nif

INSERT INTO Empleado (nombre, apellido, nss, nif)


VALUES ( 'Rubn', 'Ripoll', '553298653111, 11222333R ) ;
44

2.4 Manipulacin de datos: SQL-92


Insercin

(3):

Restricciones de Integridad

Si SGBD con implementacin total de SQL-92


- El SGBD maneja e impone toda RI definida en esquema de BD
(LDD)

Si SGBD con implementacin 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 ) ;
Insercin rechazada: no se incluye valor para nss, que debe ser NOT NULL

- Programador debe asegurar la no violacin de las RI no


manejadas por el SGBD
Supongamos 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
Insercin rechazada
Si el SGBD NO soporta la Integridad Referencial
Insercin permitida el programador debe asegurar que esto no pase!
45

2.4 Manipulacin de datos: SQL-92


Insercin (y 4): filas resultado de una
consulta
Carga de una tabla con informacin sinptica de la BD
Sea una tabla INFO_DEPTOS vaca. 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 nmerod=nd
GROUP BY nombred ;
Es posible hacer SELECT ... FROM Info_deptos ...
INFO_DEPTOS puede contener informacin no actualizada
Si se modifica informacin en EMPLEADO y/o DEPARTAMENTO, los
cambios no se reflejarn en la tabla INFO_DEPTOS
Una vista s contiene siempre los datos ms actuales (*se
ver*)
46

2.4 Manipulacin de datos: SQL-92


Eliminacin de datos
Orden DELETE
Elimina filas completas de una tabla
Slo una tabla en clusula FROM
Clusula WHERE para seleccionar las filas que
Si no hay WHERE, se eliminan todas las filas
La tabla permanece, pero queda vaca
DELETE FROM Empleado ;
DELETE FROM Empleado WHERE apellido=Bojrquez;
DELETE FROM Empleado WHERE nss=123456789012 ;
DELETE FROM Empleado
WHERE nd IN ( SELECT numerod FROM Departamento
WHERE nombre=Investigacin) ;

eliminar

todas las filas


0 fila s
1 fila

4 filas

Propagacin de eliminaciones
Segn acciones de mantenimiento de la Integridad Referencial especificadas
con LDD en los CREATE TABLE (esquema de BD)
47

2.4 Manipulacin de datos: SQL-92


Actualizacin de datos
Orden UPDATE
Modifica valores de columnas en una o ms filas de una tabla
Se modifican filas de una sola tabla a la vez
Clusula SET especifica columnas que modificar y nuevos
valores
Clusula WHERE para seleccionar filas que actualizar
Si no hay WHERE, se aplica la modificacin a todas las filas
* Para el proyecto 10, cambiar el lugar a Beln y el n de depto controlador al 5

UPDATE Proyecto SET lugarp = Belen, nmd = 5


WHERE numerop=10 ;

Propagacin 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
definicin de la tabla con CREATE TABLE
48

2.4 Manipulacin de datos: SQL-92


Actualizacin

(y 2)

Modificacin de varias filas a la vez con UPDATE


* Conceder a todo empleado del departamento de Investigacin un aumento salarial del 10%

UPDATE Empleado SET salario = salario*1.1


WHERE nd IN (SELECT nmerod
FROM Departamento
WHERE nombred=Investigacin) ;

NULL o DEFAULT como nuevo valor de una columna


UPDATE Empleado SET salario = DEFAULT;
UPDATE Empleado SET nssjefe = NULL
WHERE ... ;

49

2.4 Manipulacin de datos: SQL-92


LDD: Definicin de datos
Esquema de Base de Datos Relacional
- Agrupa tablas y otros elementos, de una misma aplicacin
- 1as versiones de SQL: todas las tablas dentro de un esquema
nico y global a todas las aplicaciones que accedan a la BD

Orden CREATE SCHEMA: definicin/creacin de esquemas


CREATE SCHEMA <nombre de esquema>
AUTHORIZATION <identificador de autorizacin>
<nombre de esquema> identifica el esquema
<identificador de autorizacin> usuario/cuenta propietaria del esquema

CREATE SCHEMA Compaa AUTHORIZATION JSILVA ;


A continuacin puede especificarse las definiciones de los
elementos contenidos en dicho esquema

Elementos del esquema:

Tablas, Vistas, Dominios, Autorizaciones, Restricciones,


etc.
50

2.4 Manipulacin de datos: SQL-92


Catlogo 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 definicin de todos los elementos
de todos los esquemas existentes en el catlogo
El Diccionario de Datos (Data Dictionary) de ORACLE se corresponde
con el INFORMATION_SCHEMA del estndar SQL-92

- Es posible compartir elementos (dominios, etc.)


entre diferentes esquemas del mismo catlogo
- Slo pueden definirse restricciones de integridad
referencial entre tablas que existan en esquemas
dentro del mismo catlogo
Concepto incorporado en la versin SQL-92 del estndar
51

2.4 Manipulacin de datos: SQL-92


LDD: definicin 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

CREATE TABLE Empleado (


nombre ...
apellido ...
nss ...
nif ...
fechan ...
direccion ...
sexo ...
salario ...
nssjefe ...
nd
);
52

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Indicacin del esquema al que pertenece una
tabla
Esquema Explcito
CREATE TABLE Compaia.Empleado ...
Esquema Implcito en el contexto
CREATE TABLE Empleado ...

Ordenamiento de columnas y filas


Columnas ordenadas tal como aparecen en CREATE TABLE
Las filas no estn ordenadas
Las tablas creadas con CREATE TABLE son tablas BASE
El SGBD las almacena fsicamente en algn fichero de la BD
53

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Especificacin 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 ms comprensible
CREATE DOMAIN Nombres VARCHAR(15);
...
CREATE TABLE Empleado (
nombre NOMBRES ...
... );

54

2.4 Manipulacin de datos: SQL-92


LDD: tipos de datos
Numricos
Enteros y Reales
INTEGER (tambin INT), SMALLINT,
FLOAT, REAL, DOUBLE PRECISION
Con formato
DECIMAL(p,e) ( tambin DEC(p,e) NUMERIC(p,e) )
p: precisin, e: escala. El valor por omisin de la escala es e = 0

Cadena de caracteres
Longitud fija
CHAR(n) ( n: n caracteres )
Longitud variable VARCHAR(n)
( n: mximo n caracteres )

Cadena de Bits
Longitud fija
BIT(n) (n: n bits)
Longitud variable BIT VARYING(n) n:mx n bits. Por omisin n=1
55

2.4 Manipulacin 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)
Slo permitidas fechas y horas vlidas
TIMESTAMP (marca de tiempo)
DATE, TIME, fracciones de segundo y desplazamiento
respecto al huso horario estndar (WITH TIME ZONE)
INTERVAL
Perodo 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

56

2.4 Manipulacin de datos: SQL-92


LDD: definicin de dominios de datos
CREATE DOMAIN <nombre dominio> <tipo de datos>
[ DEFAULT <valor defecto> ]
[ <lista de definicin de restricciones de dominio> ] ;
- <tipo de datos>: uno de los proporcionados por el SGBD (built-in)
- <valor defecto>: (opcional)
- Especifica el valor por omisin para columnas definidas de este dominio
- Ser asignado a cada columna con dicho dominio, si no tiene ya su propia
clusula DEFAULT

- <lista de definicin de restricciones de dominio>: (opcional)


- Restric. Integridad que se aplican a toda columna definida sobre el
dominio
- Cada RI puede tener un nombre: clusula CONSTRAINT <nombre_RI>
* Ejemplo: enumeracin de posibles valores componentes del dominio

CREATE DOMAIN Color VARCHAR(8) DEFAULT sinColor


CONSTRAINT color_valido
CHECK (VALUE IN ( rojo, amarillo, azul, verde, sinColor ) ) ;
57

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Especificacin de restricciones de columna
Clusula NULL o NOT NULL

Opcin de nulo: indica si una columna puede contener o no


NULL
CREATE TABLE Empleado (...
nombre VARCHAR(15) NOT NULL, ... );
Por omisin, se asume NULL
La restriccin NOT NULL es obligatoria para columnas
componentes de una clave primaria

Clusula DEFAULT <valor>

Valor por omisin (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
58

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Especificacin de restricciones de tabla
Clusula PRIMARY KEY (<lista_columnas>)
Columnas que componen la clave primaria

Clusula UNIQUE (<lista_columnas>)


Columnas que forman una clave alternativa

Clusula FOREIGN KEY (<lista_columnas>)


REFERENCES <tabla>(<lista_columnas>)
Colu mnas clave externa (Integridad Referencial)
SQL-92 permite que una clave externa se refiera a una
clave primaria o una clave alternativa

Clusula CHECK (<expresin>)


Condicin sobre los valores de las columnas que debe
cumplir toda fila de la tabla
59

2.4 Manipulacin de datos: SQL-92


LDD: definicin 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)
);

60

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Especificacin de restricciones de tabla

(cont.)

- Dar nombre a una restriccin es opcional, pero muy conveniente


CONSTRAINT <nombre_RI> <restriccin>
- El nombre de restriccin debe ser nico dentro del mismo esquema
- Identifica una restriccin, por si despus 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 ),
... );

61

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Especificacin de restricciones de tabla (cont.)

- Si la restriccin afecta slo a una columna, puede


especificarse en la definicin de dicha columna (en la
misma lnea)
- Por ejemplo, si una clave externa no es compuesta, no se
necesita la clusula 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 ),
... );
62

2.4 Manipulacin de datos: SQL-92


LDD: definicin de tablas
Acciones de mantenimiento de la integridad
referencial
Clusulas ON DELETE <accin>
y ON UPDATE <accin>
<accin> { 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
);
63

2.4 Manipulacin de datos: SQL-92


LDD: definicin de vistas
Una vista es una tabla derivada de otras tablas
Son tablas virtuales, pues no necesariamente existen en
forma fsica
Sentencia de definicin o creacin de una vista
CREATE VIEW <nombre_vista> [ (<lista_nombres_columnas>) ]
AS <consulta_de_definicin>

La consulta de definicin
determina el contenido de la vista
contiene las tablas base: tablas o vistas de las que se
deriva la vista (tambin llamadas tablas de definicin)
CREATE VIEW Familiar_de_Empleado (empleado, familiar, parentesco)
AS SELECT nombre, nombre_familiar, parentesco
FROM Empleado, Familiar
WHERE nss = nsse;
64

2.4 Manipulacin de datos: SQL-92


LDD: definicin 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 operacin
aritmtica o funcin de agregados
CREATE VIEW Empleado_en_Proyecto
AS SELECT nombre, apellido, nombrep, horas
nombres que
FROM Empleado, Proyecto, Trabaja_en
hereda la vista
WHERE nss = nsse AND nump = numerop ;

Definicin 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 ;
65

2.4 Manipulacin de datos: SQL-92


LDD: definicin de vistas
Un estado de la vista EMPLEADO_EN_PROYECTO
Empleado_en_Proyecto

nombre

apellido

nombrep

horas

Jos

Silva

Producto
X

32.5

Ramn

Nieto

Producto
Z

40.0

Jos

Silva

Producto
Y

07.5

Josefa

Barcel

Producto
X

20.0

Federico

Vizcarra Producto
Y

10.0

Federico

Vizcarra Producto
Z

10.0

Josefa

Barcel

20.0

Producto

66

2.4 Manipulacin de datos: SQL-92


LDD: definicin de vistas
Las vistas pueden utilizarse como mecanismo
de...
- Simplificacin de consultas
- Seguridad (*se ver en el tema de seguridad*)
- Adaptacin de la informacin a las necesidades de
cada usuario o grupo de usuarios
Caracterstica fundamental de las vistas
Actualizacin Permanente
- El responsable de esta caracterstica es el SGBD

La vista no se crea cuando se define, sino cuando se consulta


Una vista no contiene informacin, sino que deja ver
informacin almacenada en sus tablas base
67

2.4 Manipulacin de datos: SQL-92


LDD: definicin de vistas
El SGBD traduce cualquier sentencia SQL sobre la vista a una
expresin equivalente sobre sus tablas base: reemplaza el
nombre de la vista por su consulta de definicin y ejecuta
CREATE VIEW Veterano AS
SELECT nombre, nif, nss, fechan, nd FROM Empleado WHERE fechan<01/01/1970;

Sentencia de usuario

Traduccin

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;
68

2.4 Manipulacin de datos: SQL-92


LDD: consulta a travs de vistas
Las vistas no tienen ninguna limitacin 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 Investigacin

SELECT * FROM Info_Depto WHERE nombre_depto=Investigacin ;


* Nombres y apellidos de los empleados que trabajan en el proyecto 'ProductoX'

SELECT nombre, apellido, nombrep


FROM Empleado_en_Proyecto
WHERE nombrep=ProductoX ;
69

2.4 Manipulacin de datos: SQL-92


LDD: modificacin a travs de vistas
La actualizacin de datos a travs de vistas tiene
algunas limitaciones
- Por un lado, actualizar a travs de una vista
definida sobre varias tablas base suele dar
problemas, pues puede haber ambigedad
UPDATE Empleado_en_Proyecto SET nombrep = ProductoZ
WHERE apellido=Silva AND nombre=Jos
AND nombrep=ProductoX;
Esta modificacin 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

70

2.4 Manipulacin de datos: SQL-92


LDD: modificacin a travs 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 nmp = (SELECT numerop FROM Proyecto
WHERE nombrep = ProductoX) ;

Modifica los vnculos 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
aparecan con ProductoX
71

2.4 Manipulacin de datos: SQL-92


LDD: modificacin a travs de vistas
- Por otro lado, algunas actualizaciones a travs de
vistas carecen de sentido
UPDATE Info_depto
SET sal_total = 100000
WHERE nombred=Investigacin ;
sal_total se define como la suma de salarios individuales de los empleados y
muchas actualizaciones de las tablas base satisfaran esta
actualizacin

As que no se garantiza que toda vista sea actualizable


72

2.4 Manipulacin de datos: SQL-92


LDD: modificacin a travs de vistas
Una vista sera actualizable si...
- Implicara una nica actualizacin posible de las
tablas base, o bien
- Hubiera varias actualizaciones posibles, pero
existiera un procedimiento especfico de
actualizacin de tablas base, tal que...
El usuario pudiera elegir el procedimiento,
especificndolo en la definicin de la vista, o bien
El SGBD pudiera elegir el procedimiento, segn la
actualizacin ms probable

73

2.4 Manipulacin de datos: SQL-92


LDD: modificacin a travs 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 agrupacin y


funciones agregadas
NO es actualizable

74

2.4 Manipulacin de datos: SQL-92


LDD: modificacin a travs de vistas
Opcin de verificacin de vistas
CREATE VIEW Emp_Precario AS SELECT nombre, apellido, nss, nif, salario, nd
FROM Empleado WHERE salario < 900 ;
*Qu pasara al ejecutar estas sentencias?
INSERT INTO Emp_Precario VALUES (Dimas, Pi', 111222333444, 12121212D, 1025, 1);
UPDATE Emp_Precario SET salario = 950 WHERE nif=12345678E;

Clusula WITH CHECK OPTION


- En la definicin de toda vista actualizable que se vaya a
utilizar para la modificacin de datos
- Indica al SGBD que debe comprobar cada INSERT y UPDATE
sobre la vista, y rechazarlo si su realizacin implicara que la
fila nueva o modificada no cumpliera la condicin de definicin
CREATE VIEW Emp_Precario AS SELECT nombre, apellido, nss, salario, nd
FROM Empleado WHERE salario < 900
WITH CHECK OPTION ;
75

2.4 Manipulacin de datos: SQL-92


LDD: implementacin de vistas
1. Estrategia de actualizacin de consultas de definicin
- Cada consulta sobre la vista se traduce a una consulta sobre las
tablas base
- La vista se rellena de filas a partir de la ejecucin de la consulta
- Poco eficiente cuando la <consulta_de_definicin> es compleja, con
tiempo de ejecucin apreciable, y se aplican muchas consultas
sobre la vista en poco tiempo

2. Estrategia de materializacin de vistas


- 1 consulta sobre la vista creacin de tabla temporal fsica
- Se conserva la tabla para posteriores consultas sobre la vista
- Necesaria estrategia para actualizacin incremental de la tabla temporal
tras cualquier modificacin sobre las tablas base
actualizacin permanente

- Si no se hace referencia a la vista tras un tiempo, el sistema la


eliminar (y la recalcular en una consulta futura)

76

2.4 Manipulacin de datos: SQL-92


LDD: Modificacin de la estructura
(alteracin) de los elementos del
esquema de base de datos
Alteracin de tablas:
ALTER TABLE <nombre_tabla> ... ;
Adicin y Eliminacin de Columnas
Modificacin de la Definicin de Columnas
Adicin y Eliminacin de Restricciones de Tabla

Alteracin de dominios:
ALTER DOMAIN <nombre_dominio> ... ;
Eliminacin y Adicin de valor por defecto
Eliminacin y Adicin de Restricciones de Dominio

77

2.4 Manipulacin de datos: SQL-92


LDD: alteracin de tablas
Adicin de una columna a una tabla ya existente
ALTER TABLE <nombre_tabla> ADD <definicin_columna> ;
No est permitido NOT NULL en la definicin de una nueva
columna
(si es necesaria esta restriccin, podr establecerse despus)
* Aadir una columna a EMPLEADO para contener el puesto de trabajo

ALTER TABLE Empleado ADD puesto VARCHAR(12);


Todas las filas de EMPLEADO tendrn puesto a NULL

Para introducir un valor para la columna, en cada fila


existente:
Especificar la clusula DEFAULT al aadir la columna:

ALTER TABLE Empleado


ADD puesto VARCHAR(12) DEFAULT aprendiz;
Utilizar despus una orden UPDATE
78

2.4 Manipulacin de datos: SQL-92


LDD: alteracin de tablas
Eliminacin de una columna de una tabla
ALTER TABLE <nombre_tabla> DROP <nombre_columna> <opcin>;
<opcin> puede ser...
CASCADE: elimina la columna y toda restriccin o vista que le hace
referencia

RESTRICT: slo elimina la columna si ninguna vista ni restriccin le


referencia
* Eliminacin de la columna direccin de la tabla EMPLEADO

ALTER TABLE Empleado DROP direccion CASCADE;


ALTER TABLE Departamento DROP numerod <opcin>;
Si <opcin> = RESTRICT: no elimina la columna numerod, pues existe una columna EMPLEADO.nd
que le hace referencia
Si <opcin> = CASCADE: elimina la columna y la restriccin de integridad referencial que vincula
EMPLEADO.nd con DEPARTAMENTO. La columna EMPLEADO.nd no es eliminada, pero deja de
ser clave ajena
79

2.4 Manipulacin de datos: SQL-92


LDD: alteracin de tablas
Modificacin de la definicin de una columna
ALTER TABLE <nombre_tabla> ALTER <nombre_columna> <accin> ;
<accin> indica la modificacin que se desea realizar...
Eliminacin de la clusula DEFAULT existente
ALTER TABLE Departamento ALTER nssdire DROP DEFAULT;
Definicin de un nuevo valor por omisin
ALTER TABLE Departamento ALTER nssdire SET DEFAULT 123456789012;

80

2.4 Manipulacin de datos: SQL-92


LDD: alteracin de tablas
Modificacin de una restriccin de tabla
La restriccin que se desea modificar debe tener un nombre
Eliminacin de una restriccin de tabla
ALTER TABLE <nombre_tabla> DROP CONSTRAINT <nombre_RI> <opcin>;
ALTER TABLE Empleado DROP CONSTRAINT jefe_emp CASCADE;
Adicin de una restriccin de tabla
ALTER TABLE <nombre_tabla>
ADD CONSTRAINT <nombre_RI> <definicin_RI>;
ALTER TABLE Empleado
ADD CONSTRAINT salario_ok CHECK (salario > 0);
ALTER TABLE Empleado
ADD CONSTRAINT puesto_ok CHECK (puesto IS NOT NULL);
81

2.4 Manipulacin de datos: SQL-92


LDD: alteracin de dominios
Orden ALTER DOMAIN <nombre_dominio> <accin>;
<accin> indica la modificacin que se desea realizar...
Eliminacin y Reemplazo del valor por omisin
ALTER DOMAIN <nombre_dominio> DROP DEFAULT;
ALTER DOMAIN <nombre_dominio> SET DEFAULT <valor>;
Eliminacin y Definicin de nuevas restricciones de
dominio
ALTER DOMAIN <nombre_dominio>
DROP CONSTRAINT <nombre_RI_dominio>;
ALTER DOMAIN <nombre_dominio>
ADD [ CONSTRAINT <nombre_RI_dominio> ] <restriccin>;
82

2.4 Manipulacin de datos: SQL-92


LDD: eliminacin de elementos del
esquema
Eliminacin de una vista. Orden DROP VIEW
Destruye una tabla derivada, junto con su definicin en el
INFORMATION_SCHEMA del catlogo
DROP VIEW <nombre_vista> ;

Eliminacin de un dominio. Orden DROP DOMAIN


Destruye un dominio de datos, junto con su definicin en el
INFORMATION_SCHEMA del catlogo
DROP DOMAIN <nombre_dominio> <opcin> ;
<opcin> 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 haba definido el dominio
(este aspecto es ampliado en el tema Integridad en sistemas de bases
de datos relacionales)
83

2.4 Manipulacin de datos: SQL-92


LDD: eliminacin de elementos del
esquema
Eliminacin de una tabla. Orden DROP TABLE
Destruye una tabla base, junto con su definicin en el
INFORMATION_SCHEMA del catlogo
DROP TABLE <nombre_tabla> <opcin>;
<opcin> puede ser...
RESTRICT: Destruye la tabla slo 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

Eliminacin de un esquema. Orden DROP SCHEMA


Destruye un esquema de BD, junto con su definicin en el
INFORMATION_SCHEMA del catlogo
DROP SCHEMA <nombre_esquema> <opcin>;
<opcin> puede ser...
RESTRICT: Destruye el esquema slo si no contiene ningn elemento
CASCADE: Elimina el esquema y las tablas, dominios y dems elementos
contenidos en el esquema
84

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 Comprobacin de restricciones

85

2.5.1 Reglas de integridad


Integridad: consistencia o correccin de datos en la base de
datos
Las reglas de integridad (RI) no son especficas para cada
Consideraciones
generales
usuario

1. Nos interesan las reglas de integridad especficas de


una BD (reglas del negocio), adems 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 ttulos de las pelculas son nicos se aplica a la tabla base
PELICULA, y tambin a cualquier vista definida sobre sta
- Podemos definir RI sobre una vista (tabla derivada)?
Sera deseable
La vista heredara toda RI de sus tablas base y podra aadir
nuevas (ejemplo: clave primaria o alternativa nueva para la vista)
Slo consideraremos RI sobre tablas base (por simplicidad)

86

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 lgico de todas las RI definidas en su esquema

5. La integridad es importante en...


DISEO (estructuras de datos y reglas de integridad adecuadas)
EJECUCIN (correccin de la informacin)

6. RI son mantenidas en el INFORMATION_SCHEMA del


catlogo
Subsistema de Integridad del SGBD:
controla operaciones de usuario (INSERT,UPDATE,DELETE...)
para asegurar que NO violan las reglas de integridad
87

2.5.1 Reglas de integridad


Componentes de una RI
Nombre
actor_cache_ok
- Regla almacenada en INFORMATION_SCHEMA del catlogo con ese nombre
- Aparecer en diagnsticos, producidos por el sistema como respuesta
a intentos de violacin de la regla (mensajes de error al usuario)
Restriccin
NOT EXISTS ( SELECT * FROM ACTOR WHERE cache 0 )
- Expresin booleana Restriccin de Integridad Regla de Integridad
- La regla ... se satisface
la restriccin es TRUE
es violada

la restriccin es FALSE

Respuesta a un intento de violacin de la regla


- Indica al SGBD qu hacer si se intenta una operacin que viola la RI
- Por defecto RECHAZAR, que implica...
Deshacer los posibles daos causados por la operacin
Mostrar informacin de diagnstico (mensaje)

- Podra ser un procedimiento de complejidad arbitraria: tratarErr(...)

88

2.5.1 Reglas de integridad


Creacin, destruccin y tipos
Creacin 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 catlogo
- 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 =

Destruccin de reglas de integridad


- el sistema elimina su definicin del INFORMATION_SCHEMA

Las RIs pueden restringir los valores legales de...


- Dominio
- Tabla, Columna
- Base de datos
89

2.5.2 Reglas de integridad en SQL92


Categoras de reglas de integridad
1. Reglas de integridad de Dominio
Asociadas a un dominio de datos especfico
Es una expresin de complejidad arbitraria que define un dominio

2. Reglas de integridad de Tabla


RIs de complejidad arbitraria incluidas en la definicin de una tabla
Pueden ser restricciones de Columna

restricciones de Clave Candidata


restricciones de Clave Externa
restricciones de Comprobacin
Una tabla vaca cumple cualquier RI de tabla,
aunque esa RI sea esta tabla no puede estar vaca

3. Reglas de integridad Generales


RIs de complejidad arbitraria no incluidas en la definicin de ninguna
tabla
Son otro elemento ms de la BD, al mismo nivel que una tabla o vista
90

2.5.2 Reglas de integridad en SQL92


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 aplicacin especfica que acceda a la base
de datos
- No contiene parmetros ni variables host
(referencias a variables de los programas de aplicacin)
91

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Dominio
Definicin del conjunto de valores componentes
de un dominio:
- Enumeracin de valores posibles: (marron,gris, azul, verde, negro)
- Expresin de definicin:
edad 0 AND edad 120

RI como parte de la sentencia de definicin del


dominio
CREATE DOMAIN <nombre dominio> [ AS ] <tipo de datos>
[ DEFAULT <valor defecto> ]
[ [ CONSTRAINT <nombre restriccin> ] CHECK (<condicin>) ]+ ;
- <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) );
92

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Dominio (2)
NOT NULL no es una restriccin de dominio vlida
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) ) ;

Alteracin de un dominio
ALTER DOMAIN <nombre dominio> <accin>... ;
Permite aadir y eliminar restricciones de integridad de
dominio y valor por defecto
Explicado en el tema anterior

93

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Dominio (y 3)
Eliminacin de un dominio
DROP DOMAIN <nombre dominio> { RESTRICT | CASCADE } ;
Opcin RESTRICT
- La eliminacin falla si el dominio es referenciado en cualquier
definicin de columna en una tabla, de vista o restriccin de integridad
- En otro caso, xito: el descriptor del dominio es eliminado del
INFORMATION_SCHEMA del catlogo

Opcin CASCADE
- El dominio es eliminado del INFORMATION_SCHEMA, junto con toda vista y RI
cuya definicin 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 explcito, toma el del dominio (si ste lo tena)
Hereda toda restriccin de integridad asociada al dominio,
- convertida en una restriccin de tabla,
- sustituyendo VALUE por el nombre de la columna
94

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Tabla
Restriccin asociada a una tabla especfica puede
hacer
referencia a
otras tablas,
RI especificada dentro de CREATE TABLE
adems de a
CREATE TABLE <nombre tabla> ( <lista de elemento de tabla> ) ;
la que la
donde elemento puede ser:
incluye
- Definicin de columna, que puede incluir RIs de columna
- Definicin de... (precedida o no de CONSTRAINT <nombre restriccin>)
Restriccin de clave candidata
Restriccin de clave externa
Restriccin de comprobacin (CHECK)

- No existe si la tabla no existe y


- Eliminar la tabla implica eliminar la RI

RI aadida/eliminada con ALTER TABLE <nombre tabla>...


Toda RI de tabla es comprobada inmediatamente:
Una operacin de modificacin sobre la tabla incluye el chequeo
de todas sus RI (como paso final de la operacin)+(una posible)
accin
95

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Tabla (2)
1. Definicin de Columna - RI de Columna
Especificacin del tipo de datos o dominio y otras RI de
columna
No necesita sentencia de creacin explcita: es parte de la
definicin de columna, dentro de la sentencia de creacin
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 comprobacin
es derivada hacia la comprobacin de la restriccin de dominio
Una RI de columna se destruye al eliminar la columna de la tabla
96

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Tabla (3)
2. Definicin de Restriccin de Clave Candidata
Clave Primaria PRIMARY KEY (<lista columnas>) incluye RI
Entidad
Clave Alternativa
UNIQUE (<lista columnas>)

3. Definicin de Restriccin 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)
97

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Tabla (4)
Recordemos sobre las claves externas que
Cualquier (combinacin de) columna(s) puede ser clave
externa
SQL-92 permite que una clave externa (FK) se refiera a una
clave candidata (CK): 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
98

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad de Tabla (y 5)
4. Definicin de Restriccin de Comprobacin (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 pelcula se estrena despus de finalizar su rodaje
CREATE TABLE PELICULA (
...,
CONSTRAINT pelicula_fechas_ok
CHECK ( fecha_fin_rodaje < fecha_estreno ),
... );
99

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad Generales (Asertos)
Predicado que expresa una condicin que la BD debe
satisfacer siempre
Puede involucrar cualquier nmero 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 condicin (CHECK)
100

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad Generales (2)
Satisfaccin y violacin de una RI general
Si alguna fila de la BD hace falsa la condicin, el aserto es
violado
Un estado de la BD satisface un aserto si ninguna
(combinacin de) fila(s) de dicho estado viola la condicin
que incluye

Creacin de una RI general


CREATE ASSERTION <nombre restriccin>
CHECK ( <condicin> ) ;

nombre obligatorio

Eliminacin de una RI general


DROP ASSERTION <nomRestriccin> ;

Sin opcin RESTRICT o CASCADE

Elimina el aserto del INFORMATION_SCHEMA del catlogo


101

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad Generales (3)
Normalmente, la <condicin> se expresa en negativo:
todo X satisface Y ningn X satisface NO( Y )
*Todo actor representado por la agencia 1 debe cobrar 300 o ms
CREATE ASSERTION RI1_age1_cache
CHECK (NOT EXISTS (SELECT * FROM Actor WHERE agencia=1 AND cache<300)) ;

*La paga mnima de los actores que actan en una pelcula es de 15.000
CREATE ASSERTION RI2_paga_minima
CHECK 15000 (SELECT MIN(paga) FROM Actua_en) ;

*Toda agencia representa a un mximo de 40 actores


CREATE ASSERTION RI3_num_actores_age
CHECK (NOT EXISTS (SELECT * FROM Actor
GROUP BY codAge
HAVING COUNT(*) > 40)) ;
102

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad Generales (4)
*Todo actor debe haber participado al menos en una pelcula
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 pelcula 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 pelculas


CREATE ASSERTION RI6_existe_distribuidora
CHECK ( 0 < SELECT COUNT (*) FROM Distribuidora ) ;

este aserto...
- debe crearse una vez que ya exista alguna fila en DISTRIBUIDORA
- una operacin DELETE puede violarlo, pero nunca lo har un
INSERT
103

2.5.2 Reglas de integridad en SQL92


Reglas de Integridad Generales (5)
Algunas RI generales pueden ser expresadas como
RI de tabla
*El cdigo de los guiones es nico ( si hay 2 guiones con igual cdigo, 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) ) );

este aserto...
- Equivale a especificar UNIQUE( codG ) en el CREATE TABLE Guion ()

104

2.5.2 Reglas de integridad en SQL92


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 accin
de mantenimiento de la integridad referencial (ON DELETE ON
UPDATE)
*Los actores y pelculas 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)));

este aserto...
- Equivale a especificar...

FOREIGN KEY (actor) REFERENCES Actor(codA)...


y FOREIGN KEY (film) REFERENCES Pelicula(codP)...
... dentro del CREATE TABLE Actor (...)
105

2.5.2 Reglas de integridad en SQL92


Disparadores - versin SQL:1999
En muchos casos conviene especificar una accin que
ejecutar tras la violacin de una restriccin:
-

Abortar la transaccin que provoca la violacin, 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 automtica


como efecto secundario de cierta modificacin de
la BD
Los SGBDR usan ampliamente los disparadores, pero no
formaron parte del estndar hasta la versin SQL:1999
cada SGBDR los implement con su propia sintaxis

Los disparadores SQL:1999 son similares a los de Oracle


106

2.5.2 Reglas de integridad en SQL92


Disparadores - versin SQL:1999 (2)
Para disear un disparador, se debe especificar :
- Las condiciones en las que se debe ejecutar:
Evento que causa la comprobacin del disparador
Condicin que se debe cumplir para ejecutarlo
- La Accin que se realizar cuando se ejecute
Es el modelo de disparadores evento-condicin-accin
La BD almacena los disparadores, por lo que...
- son persistentes y
- estn accesibles para todas las operaciones de BD

El SGBD ejecuta automticamente un disparador cada


vez que ocurre el evento especificado y se cumple la
condicin correspondiente
La ejecucin del disparador se considera parte de la
ejecucin de la operacin que provoca su activacin
107

2.5.2 Reglas de integridad en SQL92


Disparadores - versin SQL:1999 (3)
Definicin 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 <condicin> ]

Evento
Parametrizacin

Granularidad
Condicin

BEGIN ATOMIC
...
END;

Accin
108

2.5.2 Reglas de integridad en SQL92


Disparadores - versin SQL:1999 (4)
* Antes de que un usuario elimine una o varias filas de la tabla PELICULA, el sistema debe

anotar dicha accin en una tabla DIARIO_BORRADOS, indicando el usuario y el momento


concreto en el que se realiza dicha operacin.
CREATE TRIGGER anotacion_borrado_pelicula
BEFORE DELETE ON PELICULA
FOR EACH STATEMENT
INSERT INTO Diario_Borrados
VALUES( PELICULA, CURRENT_USER, CURRENT_TIMESTAMP);

Si la accin del trigger slo consiste en una sentencia SQL, no es


necesario utilizar las palabras reservadas BEGIN ATOMIC ni END
Este trigger est escrito en SQL:1999, y no en SQL de Oracle
109

2.5.2 Reglas de integridad en SQL92


Disparadores - versin SQL:1999 (5)
* Si un actor no protagonista de una pelcula percibe una paga no inferior que la de un

protagonista, asignarle el mnimo cobrado por un protagonista menos 1000.


CREATE TRIGGER PagaNoProta
En Oracle este trigger tendra el
AFTER UPDATE OF paga ON ACTUA_EN
problema de la tabla mutante
REFERENCING NEW ROW AS nueva
Se ver en las prcticas 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;
110

2.5.2 Reglas de integridad en SQL92


Disparadores - versin SQL:1999 (y 6)
Los disparadores combinan los enfoques
declarativo y procedimental
- El evento y la condicin del disparador son declarativos
- Su accin opera por procedimientos

Comparacin ASSERTION vs. TRIGGER


- ASSERTION prohibe realizar una actualizacin que viola el aserto
(es decir, que hace FALSE la condicin)

- TRIGGER puede permitir la actualizacin que cumple la condicin


(es decir, que viola una RI), pero ejecuta una accin (que puede
reparar la violacin, dejando consistente la BD)

Las condiciones especificadas en una y otro son inversas


111

2.5.2 Reglas de integridad en SQL92


Caractersticas adicionales (pseudo-RIs)
SQL rechaza todo intento de INSERT o UPDATE que viole
una especificacin de tipo de datos
Ejemplo: introduccin de valor CHAR en columna definida como INTEGER
- Una especificacin de tipo de datos puede verse como una
forma primitiva de restriccin de integridad de dominio
- Una violacin de una RI de dominio o de tipo de datos se
detecta en tiempo de ejecucin

SQL rechaza todo intento de INSERT o UPDATE sobre una


vista, si viola la condicin de definicin de la vista
- Siempre que se haya especificado la opcin de verificacin
en la definicin de la vista (WITH CHECK OPTION)
112

2.5.3 Comprobacin de restricciones


En general, el SGBD comprueba una RI de inmediato,
como ltimo paso de la ejecucin 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 fallaran
Ciclo referencial
EMP
DEP
Inicialmente, EMP y DEP estn vacas
CREATE TABLE EMP
CREATE TABLE DEP
( cod_emp ...
( cod_dep ... ,
depto ... ,
jefe ... ,
FOREIGN KEY ( depto )
FOREIGN KEY ( jefe )
REFERENCES DEP ( cod_dep ) ... ,
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 fallara, pues nunca
encontrara la fila destino (referenciada) en la otra tabla
113

2.5.3 Comprobacin de restricciones


Modos de comprobacin
En un momento dado, dentro de cierta transaccin
SQL, toda restriccin de integridad debe estar en
modo...
- INMEDIATE: ser comprobada inmediatamente, o
- DEFERRED: ser chequeada al final de la transaccin (diferida)

Para algunas restricciones de integridad, la


comprobacin diferida no tiene sentido:
Restricciones de dominio y tipo de datos
Restriccin de columna NOT NULL y
Restricciones de clave candidata (UNIQUE, PRIMARY KEY)

114

2.5.3 Comprobacin de restricciones


Modos de comprobacin

(2)

Una definicin de RI puede incluir estas dos clusulas


[ 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 transaccin SQL

- Opcin de cambio de modo: DEFERRABLE o NOT DEFERRABLE


Indica si la RI puede pasar a modo DEFERRED

- Valores asumidos por omisin:


Si no se indica ningn 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
115

2.5.3 Comprobacin de restricciones


Modos de comprobacin (y 3)
Sentencia SET CONSTRAINTS
SET CONSTRAINTS {<lista restricciones> | ALL} { DEFERRED | IMMEDIATE}
- Establece el modo para varias RIs para la transaccin 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 comprobacin de alguna RI, falla SET CONSTRAINTS y
ninguna RI cambia de modo

Ejecutar COMMIT implica realizar SET CONSTRAINTS ALL IMMEDIATE


- Si la comprobacin de alguna RI falla
COMMIT falla
la transaccin completa falla (rollback)
116

Vous aimerez peut-être aussi