Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1
Expresiones Join SQL2
SELECT titulo, año, longitud, tipo, estudio, nombreActor
FROM Películas JOIN Estrellas ON
Titulo = tituloPelicula AND año = añoPelícula ;
OUTERJOIN EN SQL2
Al calcular el join R ⊲⊳ S, si una tupla t de R no se iguala con
una tupla de S, todos los datos de t desaparecen del resultado.
El outerjoin difiere del join ordinario ( o “inner” ) al adicionar al
resultado cualquier tupla de cualquier relación que no iguale
con al menos una tupla de la otra relación. Las tuplas colgantes
se rellenan con NULL en los atributos que no se igualan.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 4/34
2
Expresiones Join SQL2
Queremos obtener aquellos individuos que son estrellas pero
no ejecutivos o los ejecutivos que no son estrellas. Entonces
se debe utilizar “natural full outer join”:
EstrellasPelicula NATURAL FULL OUTER JOIN EjecutivosCine;
El resultado es una relación con seis atributos, con tres tipos
de tuplas: a) Las que representan a la vez estrellas y ejecutivos
con los 6 atributos NOT NULL; b) los individuos que son
estrellas pero no ejecutivos (los atributos de EjecutivosCine
con NULL); y c) las que representan ejecutivos pero no
estrellas (los atributos de EstrellasPelicula con NULL).
3
Expresiones Join SQL2
Queremos unir la relaciones Película y Estrellas, usando la
condición que el titulo y el año coincidan, debemos modificar la
consulta así:
Películas FULL OUTER JOIN Estrellas ON
titulo = tituloPelicula AND año = añoPelicula;
La palabra clave FULL puede ser reemplazada por LEFT o
RIGHT en el anterior tipo de outerjoin:
Restricciones en SQL2
La integridad de los datos en una base de datos es un
aspecto muy importante a tener en cuenta en la
implementación de un diseño. Existen al menos dos formas
de mantenerla:
a. Incorporando las restricciones en los programas de aplicación
(se multiplica el código específico que implementa restricciones
en las aplicaciones).
b. Incorporando declaraciones al SMBD, formando parte del
esquema de la base de datos.
SQL2 provee una variedad de técnicas para implementar
Restricciones de integridad como parte del esquema de la
base de datos.
Veamos los diferentes tipos de restricción previstos en SQL:
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 8/34
4
Restricciones en SQL2
Declaración de Llaves
Es el tipo de restricción más importante en una base de
datos. Se prohibe que dos tuplas de una relación
coincidan en el atributo declarado como llave.
La llave se declara dentro del comando SQL CREATE
TABLE. Hay dos formas similares de declarar una llave:
usando la cláusula PRIMARY KEY o la cláusula UNIQUE.
Hay dos formas de declarar una llave primaria:
1) Se puede declarar un atributo como llave primaria cuando
se define el esquema relacional.
CREATE TABLE Hospital (
numeroH smallint PRIMARY KEY
... );
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 9/34
Restricciones en SQL2
2) Se puede agregar al esquema ya declarado, una nueva
declaración que defina la llave de la relación:
CREATE TABLE Personal (
hospitalNro smallint, codigo smallint, nombre varchar (40), ...
PRIMARY KEY (hospitalNro, codigo)
... );
Para utilizar la cláusula UNIQUE basta con reemplazar la palabra
PRIMARY KEY por UNIQUE. Tiene la misma importancia de una
declaración de llave primaria. Sin embargo, en una tabla puede
haber varias declaraciones UNIQUE pero solo una llave primaria.
Muchas versiones SQL ofrecen la creación de índices que usan la
cláusula UNIQUE para declarar el (o los) atributos (s) que serán
llave al mismo tiempo que crea un índice sobre dicho atributo:
CREATE UNIQUE INDEX indiceAño ON Películas (año);
5
Restricciones en SQL2
Integridad Referencial y Llaves Foráneas
Un segundo tipo de restricción en el esquema de la base de datos
es que los valores de algunos atributos deben ser lógicos.
Estamos hablando de la “integridad referencial”, concepto que
esta estrechamente relacionado con el concepto de Llave
Foránea, que establece que el valor de un atributo puede ser nulo
o su valor exista como valor en la llave primaria de otra tabla.
La llave foráneas permite implementar relaciones uno a muchos.
CREATE TABLE Medico (
hospitalNro smallint, codigo smallint, nombre varchar (40),...
CONSTRAINT fkHosp FOREIGN KEY (hospitalNro)
REFERENCES Hospital (numeroH)
... );
donde fkHosp es el nombre de la restricción.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 11/34
Restricciones en SQL2
Declaración de restricciones de la llave foránea
En SQL podemos declarar uno o varios atributos como llave
foránea, referenciando el (los) atributo(s) de otra relacion (que
puede ser la misma relación). Esta declaración trae las
siguientes implicaciones:
1. Los atributos referenciados en la segunda relación deben ser
declarados como llave primaria de su relacion.
2. Un valor del atributo de la llave foránea en la primera tabla,
también debe aparecer en el correspondiente atributo de la
segunda relación: restricción de integridad referencial .
Hay dos formas de declarar llaves foráneas:
a. Si la llave foránea es una tributo simple, podemos usar:
REFERENCES <tabla> (<atributos>)
6
Restricciones en SQL2
b. Anexar a la lista de atributos (CREATE TABLE) una o más
declaraciones enunciando que un conjunto de atributos son una
llave foránea. Indicamos despues la tabla y sus atributos(que
son llave primaria). La forma es:
FOREING KEY <atributos> REFERENCES <tabla> (<atributos>)
CREATE TABLE Estudio (
nombreEst CHAR ( 30) PRIMARY KEY,
direcciónEst VARCHAR (225),
codProductor INT REFERENCES EjecutivosCine (codProductor)
);
Una forma alternativa será:
CREATE TABLE Estudio (
nombreEst CHAR (30) PRIMARY KEY, direcciónEst VARCHAR (225),
codProductor INT,
FOREIGN KEY codProductor INT
REFERENCES EjecutivosCine (codProductor) );
Restricciones en SQL2
Mantenimiento de la Integridad Referencial
En SQL se dispone de varias formas de implementar la
conservación de las restricciones de integridad referencial.
Rechazar las modificaciones que violan la integridad referencial
Lo cual es la política por defecto en SQL. Las siguientes acciones
serán rechazadas por el sistema (error en tiempo de ejecución):
Intento de insertar una tupla cuyo valor en la llave foránea no es
nulo o no existe como valor de la llave primaria.
Intento de actualizar una tupla cuya valor de llave foránea no
existe como valor en la llave primaria. La tupla original permanece
igual.
Intento de eliminar una tupla en la tabla de la llave primaria cuando
su componente aparece como valor en la llave foránea de la
segunda relación en una o más tuplas. Se rechaza eliminación y
se conservan las demás tuplas.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 14/34
7
Restricciones en SQL2
●Política en cascada
Cuando se borran o actualizan tuplas en la tabla que posee la
llave primaria, se borran o se actualizan las tuplas relacionadas
en la tabla que posee la llave foránea.
Restricciones en SQL2
Veamos la sintaxis:
FOREIGN KEY ( a1, , ... , aj)
REFERENCES R (K1, ... , Kj)
[ON DELETE {SET DEFAULT | SET NULL | CASCADE | NO ACTION}]
[ON UPDATE {SET DEFAULT | SET NULL | CASCADE | NO ACTION}]
En el ejemplo
CREATE TABLE Estudio (
nombreEst CHAR ( 30) PRIMARY KEY,
direcciónEst VARCHAR (225),
codProductor INT REFERENCES EjecutivosCine (codProductor)
ON DELETE SET NULL
ON UPDATE CASCADE );
Las acciones alternativas son SET DEFAULT, SET NULL,
CASCADE y NO ACTION. La acción por defecto es (no hacer
nada) NO ACTION.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 16/34
8
Restricciones en SQL2
Restricciones de los Valores de Atributos
Un tercer grupo de restricciones lo constituyen las
restricciones que limitan los valores que pueden aparecer en
los componentes de algunos atributos. Se pueden expresar
como una restricción al atributo dentro de la definición del
esquema o, como una restricción de dominio del atributo en
cuestión.
Algunas de las formas de implementación de este tipo de
restricciones se pueden expresar mediante:
Restricciones NO NULAS
Se asocia a la opción NOT NULL; especifica que no se puede
ingresar un valor nulo para el atributo. Ejemplo:
codProductor INT NOT NULL,
Restricciones en SQL2
Restricciones CHECK Basadas en Atributos
Se pueden incorporar restricciones más complejas a la
declaración de un atributo mediante la palabra clave CHECK,
seguida de una condición entre paréntesis.
En la práctica es una limitación simple sobre valores, aunque
en teoría la condición puede ser cualquier cosa que le siga al
where en una consulta SQL.
Una restricción CHECK basada en atributo se verifica
siempre que una tupla cualquiera reciba en ella un nuevo
valor (actualización, o inserción).
La restricción CHECK basada en atributo NO se verifica
necesariamente, si una modificación de la BD no cambia el
valor del atributo al cual se asocia la restricción; esta
limitación puede hacer que se viole la restricción.
9
Restricciones en SQL2
Sintaxis:
CHECK (Condición de búsqueda)
Ejemplos:Suponga que se requiere que el codProductor sea de al
menos 6 dígitos en la relación Estudio:
codProductor INT REFERENCES EjecutivosCine (codProductor)
CHECK (codProductor >=100000);
Ejemplo: verificar el sexo en las relación EjecutivosCine que tenga
un carácter y que pueda tomar los siguientes valores `F´ o `M´:
sexo CHAR (1) CHECK (sexo IN ( `F´,`M´) )
Restricciones en SQL2
CREATE TABLE Hospital (
...
camas smallint CHECK
(camas <= (SELECT count (*)/10 FROM Personal) )
... );
CREATE TABLE Paciente (
...
cuota decimal (8,2),
nroFarmacia smallint,
consuSinCargo smallint
...
CHECK ((cuota between 50 and 500) and
(nroFarmacia between 10 and 100) and
(consuSinCargo between 1 and 20) )
... );
10
Restricciones en SQL2
CREATE TABLE Medico (
...
especial char (5) CHECK (
(especial IN (‘clini’, ’pedia’, ’traum’, ’obste’, ’cardi’, ‘otras’ ) )
... );
Restricciones de Dominios
También se puede restringir los valores de un atributo al
declarar un dominio con un restricción similar y declarando que
el dominio es el tipo de dato para el atributo. En SQL2 se usa la
palabra reservada VALUE para referirse a un valor del dominio.
Ejemplo: declarar un domino, dominioSexo con los caracteres
`F´ y `M´ como unión de valores permitidos:
CREATE DOMAIN dominioSexo CHAR (1)
CHECK (VALUE IN (`F´, M´) );
Restricciones en SQL2
Por lo tanto, el definir el atributo sexo en la relación
EjecutivosCine puedo hacerlo así:
sexo dominioSexo,
Ejemplo: Crear un dominio para el atributo codProductor
número de al menos 6 dígitos en la relación Estudio :
CREATE DOMAIN dominioProductor INT
CHECK (VALUE >= 100000);
Y luego al reescribir la declaración de codProductor:
codProductor dominioProductor
REFERENCES EjecutivosCine (codProductor)
Obtenemos la restricción deseada. Ejemplos:
CREATE DOMAIN clave AS integer CHECK (Value > 30)
CHECK (Value is NOT NULL);
CREATE DOMAIN color AS char (10) DEFAULT ´Sin color´
CHECK (Value IN (´Sin color´, ´Azul´, Ámarillo´, ´Rojo´, ´Negro´));
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 22/34
11
Restricciones en SQL2
Restricciones Globales
Corresponden al tipo de declaración de restricciones más complejas;
se refieren a las relaciones entre varios atributos o incluso a
relaciones diversas. Son de dos tipos:
Restricciones CHECK basadas en tuplas, que limitan cualquier
aspecto de las tuplas de una sola relación.
Aserciones, son aquellas que pueden incluir relaciones enteras o
algunas variables de tuplas que abarcan la misma relación.
Restricciones en SQL2
La restricción CHECK basada en tuplas se evalua cada vez que
se realice una inserción o una actualización sobre la tabla R. Si la
condición menciona alguna relación en una subconsulta, y si una
modificación de esta relación vuelve falsa la condición en alguna
tupla de R, la verificación no mostrará ese cambio. Ejemplo:
CREATE TABLE EstrellasPelicula (
nombre CHAR (30) UNIQUE,
dirección VARCHAR (225) ,
sexo CHAR (1),
fechaNacmto DATE,
CHECK (sexo = `F´ OR nombre NOT LIKE `Sra.%´);
12
Restricciones en SQL2
Aserciones
Algunas veces necesitamos restricciones que involucren una
relación como un todo, por ejemplo una restricción sobre la suma u
otra función de agregación de los valores de una columna. También
cuando una restricción involucra más de una relación.
Una aserción constituye parte del esquema. Su forma general es:
CREATE ASSERTION nombreRestricción
CHECK (condición de búsqueda);
Restricciones en SQL2
Ejemplo:
CREATE ASSERTION presidentesRicos CHECK
(NOT EXISTS
(SELECT *
FROM Estudio, EjecutivosCine
WHERE Estudio.codProductor = EjecutivosCine. codProductor
AND ingresoNeto < 10000000) );
De esta forma la restricción se cumple (es verdadera) cuando la
consulta sea vacía.
Ejemplo:
CREATE ASSERTION totalSalarios CHECK
(((SELECT sum (sueldo) FROM Personal) +
(SELECT sum (sueldo) FROM Medico)) < 100000000);
13
Disparadores en SQL2
Los disparadores, llamados reglas Evento-Condición-Acción (o
siglas ECA), difieren de las restricciones previamente discutidas en
tres formas:
1. Los triggers solo son probados cuando ocurren ciertos
eventos, especificado por el programador de la BD. Eventos
permitidos: son inserciones, borrados, actualizaciones y el fin de una
transacción.
2. En lugar de prevenir inmediatamente el evento que activa la
acción, un trigger prueba una condición. Si esta no se satisface,
entonces no ocurre nada en el trigger en respuesta al evento.
3. Si la condición del trigger se cumple, la acción definida con el
triggers es realizada por el DBMS. La acción puede impedir que
ocurra el evento, o podría deshacer el evento (como borrar una tupla
insertada). La acción podrá ser cualquier secuencia de operaciones
sobre la base de datos,
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 27/34
Disparadores en SQL2
Características de los Triggers
1. La acción puede ser ejecutada antes, después o durante el evento
definido en el trigger.
2. La acción puede referirse a valores viejos o nuevos que se
insertaron, borraron o actualizaron en el evento que dispara la
acción del trigger.
3. Los eventos de actualización pueden especificar un atributo
particular o un conjunto de atributos.
4. Una condición puede ser especificada con una cláusula WHEN, y la
acción solo se ejecutará si la regla es activada y se cumple la
condición cuando el evento definido en el trigger ocurre.
5. El programador tiene la opción de especificar que la acción sea
realizada:
a) Una vez en cada tupla modificada
b) Una vez en todas las tuplas que cambian en una operación de BD.
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 28/34
14
Disparadores en SQL2
Para crear un trigger se usa el comando CREATE TRIGGER.
Veamos su sintaxis:
CREATE [OR REPLACE] TRIGGER <nombreTrigger>
BEFORE | AFTER --Tiempo del evento
{ {INSERT | UPDATE} [OF columna(s) ] |DELETE }
ON <nombreTabla> -- Eventos disparadores
FOR EACH ROW --Tipo de Trigger
[WHEN (<condición>) ] -- Restricción al Trigger
(solo para triggers
FOR EACH ROW !)
<Bloque PL/SQL> --Cuerpo del trigger
END; -- Fin del disparador
Disparadores en SQL2
Vamos a aplicar un disparador a la relación
EjecutivosCine (nombre, dirección, codProductor, ingresoNeto)
para que para que opere sobre actualizaciones al atributo
ingresoNeto. El efecto de esta regla es restaurar al valor inicial por
cualquier intento de reducir el ingreso neto de un ejecutivo:
1) CREATE OR REPLACE TRIGGER ingresoNetoTrigger
2) AFTER UPDATE OF ingresoNeto on EjecutivosCine
3) REFERENCING
4) OLD AS oldTuple
5) NEW AS newTuple
6) WHEN (oldTuple.ingresoNeto > newTuple.ingresoNeto)
7) UPDATE EjecutivosCine
8) SET ingresoNeto = Oldtuple.ingresoNeto
9) WHERE codProductor = Newtuple.codProductor
10)FOR EACH ROW;
15
Disparadores en SQL2
A continuación mostraremos otras alternativas:
●A la cláusula AFTER: { BEFORE | INSTEAD OF }
habrá una tupla vieja y otra nueva, los cuales son las tuplas antes
y después de la actualización: OLD AS y NEW AS.
●Si se omite (FOR EACH ROW) entonces el trigger a nivel de
Disparadores en SQL2
Ejemplo. Se desea prevenir que el promedio del ingresoNeto de los
ejecutivos del cine caiga por debajo de los $5.000.000. Esta restricción
podrá ser violada por una inserción, retiro o actualización del atributo
ingresoNeto en la relación EjecutivosCine. Se necesita un trigger para
cada uno de estos eventos. En el ejemplo siguiente se muestra el trigger
para el evento de una actualización:
1) CREATE OR REPLACE TRIGGER promedioIngresoNetoTrigger
2) AFTER UPDATE OF ingresoNeto on EjecutivosCine
3) REFERENCING
4) OLD TABLE AS viejosDa
5) NEW TABLE AS nuevosDa
6) WHEN (5 000 000 <=
7) (SELECT AVG (ingresoNeto)
8) FROM ((EjecutivosCine EXCEPT viejosDa) UNION nuevosDa)))
9) DELETE FROM EjecutivosCine WHERE
(nombre, dirección, codProductor, ingresoNeto) IN viejosDa;
10) INSERT INTO EjecutivosCine (SELECT * FROM nuevosDa);
11) FOR EACH ROW;
10/05/06 Curso: Bases de Datos I – Profesor: Mauricio Fernández - EISC 32/34
16
Disparadores en SQL2
En el ejemplo siguiente se muestra el trigger para el evento
de un borrado:
1) CREATE OR REPLACE TRIGGER TriggerPromIngreNetoRet
2) AFTER UPDATE OF ingresoNeto on EjecutivosCine
3) REFERENCING
4) OLD TABLE AS viejosDa
5) WHEN (5 000 000 <=
7) (SELECT AVG (ingresoNeto)
8) FROM ((EjecutivosCine EXCEPT viejosDa) ))
9) DELETE FROM EjecutivosCine WHERE
10) (nombre, dirección, codProductor, ingresoNeto) IN viejosDa;
11) INSERT INTO EjecutivosCine
12) (SELECT * FROM viejosDa
13) WHERE codProductor=viejosDa.codProductor);
14) FOR EACH ROW;
Disparadores en SQL2
Se recomienda seguir las siguientes reglas para la definición de
triggers de mantenimiento de integridad:
Identifique operaciones y tablas críticas para la restricción de integridad
Por cada una de tales tablas verifique
Si la restricción puede ser verificada a nivel de fila entonces
Si la fila verificada es modificada en el trigger entonces
Use un trigger de fila con before
De lo Contrario Use un trigger de fila con After
De lo Contrario Use un trigger de instrucción con After
17