Documentos de Académico
Documentos de Profesional
Documentos de Cultura
15/09/15
Integridad referencial
La integridad referencial es una propiedad deseable en las bases de datos. Gracias a la integridad
referencial se garantiza que una entidad (fila o registro) siempre se relacione con otras entidades
vlidas, es decir, que existen en la base de datos. Implica que en todo momento dichos datos sean
correctos, sin repeticiones innecesarias, ni datos perdidos ni relaciones mal resueltas.
Todas las bases de datos relacionales gozan de esta propiedad gracias a que el software gestor
de base de datos vela por su cumplimiento.
Cmo funciona
Supongamos una base de datos con las entidades PERSONA y FACTURA. Toda factura
corresponde a una y solamente una persona. Implica que en todo momento dichos datos sean
correctos, sin repeticiones innecesarias, datos perdidos y relaciones mal resueltas.
Supongamos que una persona se identifica por su atributo CURP (Clave nica de Registro de
Poblacional). Tambin tendr otros atributos como el nombre y la direccin. La entidad FACTURA
debe tener un atributo CURP_cliente que identifique a quin pertenece la factura.
Por sentido comn es evidente que todo valor de CURP_cliente debe corresponder con algn
valor existente del atributo CURP de la entidad PERSONA. Esta es la idea intuitiva de la integridad
referencial.
La integridad referencial en juego
Cuando se crea una nueva instancia de FACTURA, la integridad referencial exige que el atributo
CURP_cliente coincida con el atributo CURP de alguna instancia de la entidad PERSONA. En
caso contrario, no se permite la operacin.
Cuando se intenta eliminar una instancia de PERSONA, la integridad referencial exige que no
exista ninguna factura asociada, es decir, se comprueba que no existe ninguna instancia de
FACTURA cuyo atributo CURP_cliente coincida con el atributo CURP de la instancia a borrar. En
caso contrario, no se permite la operacin.
Existen tres tipos de integridad referencial:
Integridad referencial dbil: si en una tupla de R todos los valores de los atributos de K
tienen un valor que no es el nulo, entonces debe existir una tupla en S que tome esos
mismos valores en los atributos de J;
Integridad referencial parcial: si en una tupla de R algn atributo de K toma el valor nulo,
entonces debe existir una tupla en S que tome en los atributos de J los mismos valores que
los atributos de K con valor no nulo; e
Integridad referencial completa: en una tupla de R todos los atributos de K deben tener el
valor nulo o bien todos tienen un valor que no es el nulo y entonces debe existir una tupla
en S que tome en los atributos de J los mismos valores que toman los de K.
Con SQL las restricciones se definen ya sea al crear las tablas (CREATE TABLE) o al efectuar
alguna modificacin a la estructura de las tablas (ALTER TABLE). Se pueden tener restricciones
por columna o por tabla. Por ejemplo:
Para no permitir valores nulos (vacos) en una columna usamos
NOT NULL. Una columna no puede contener un valor nulo
Para garantizar que los valores de una columna que no forma parte de la clave primaria,
tenga valores que no se repitan (no haya duplicados), podemos usar
UNIQUE. Una columna o combinacin de columnas cuyos valores deben ser nicos
para todas las filas de la tabla
Valentn Belisario Domnguez Vera
15/09/15
Permite la entrada de valores nulos salvo que se establezca a la vez una restriccin
NOT NULL.
Basta con que una de las celdas tome para el valor nulo para que se considere que se
cumple la restriccin de unicidad.
Las composite unique key slo se pueden crear a nivel de tabla.
Si deseo que una columna o un conjunto de ellas (dos o ms columnas) identifiquen de
manera nica a cada fila (registro), usamos
PRIMARY KEY. Identifica unvocamente cada fila de la tabla
PRIMARY KEY implica Not Null y Unique
Igual que para UNIQUE, existen primary key y composite primary key (formadas por
ms de una columna). stas segundas se definen a nivel de tabla.
Si queremos garantizar que los valores a introducir en una columna tengan un formato en
particular o que estn dentro de un rango de valores permitido, podemos usar
CHECK. Especifica una condicin que debe ser cierta
Si queremos que la informacin de una tabla (tabla hija) haga referencia (est ligada o
verificada) hacia otra tabla de orden superior (tabla padre), usamos
FOREIGN KEY. Establece y obliga a que se cumpla una restriccin de integridad entre
una columna (en una tabla hija) y otra columna de la tabla referenciada (tabla padre)
El valor de la clave ajena debe coincidir con un valor existente en la tabla referenciada
(parent table) o ser nulo.
Las claves ajenas son puramente lgicas (estn basadas en valores de datos) y por
tanto no son punteros fsicos.
Las composite foreign key estn formadas por ms de una columna y deben ser
definidas a nivel de tabla.
Por columna, se refieren a una nica columna y se definen dentro de la especificacin de la propia
columna. Puede ser de cualquiera de los tipos de restricciones de integridad indicados en el
apartado anterior.
Sintaxis a nivel de columna:
[CONSTRAINT <nombre>] <tipo de restriccin>
Por tabla, se refieren a una o a varias columnas y se definen de forma separada a las definiciones
de las columnas. Pueden ser de cualquier tipo de restriccin salvo NOT NULL.
Sintaxis a nivel de tabla:
[CONSTRAINT <nombre>] <tipo de restriccin> (<columna>[,])
En ambos casos:
<nombre> Nombre de la restriccin.
<tipo de restriccin> Uno de los 5 tipos de restricciones de integridad permitidas.
<columna> Nombre de columna
Ejemplos
CREATE TABLE Empleados (
nombre VARCHAR2(20) NOT NULL,
Fecha_alta DATE CONSTRAINT fecha_obli NOT NULL, )
CREATE TABLE Empleados (
apellidos VARCHAR2(40) NOT NULL,
Valentn Belisario Domnguez Vera
15/09/15
nombre VARCHAR2(20),
email VARCHAR2(25) UNIQUE,
CONSTRAINT apel_nom_unico UNIQUE apellidos, nombre)
CREATE TABLE Deptos ( num NUMBER(4),
nombre VARCHAR2(30) NOT NULL,
CONSTRAINT dep_pk PRIMARY KEY (num) )
CREATE TABLE Empleados ( dep NUMBER(4)
CONSTRAINT emp_dep_fk FOREIGN KEY (dep) REFERENCES Deptos (num) )
ACTIVIDAD1. Observe detenidamente el siguiente modelo y conteste las preguntas que vienen
ms adelante. Luego, en su cuaderno, haga una representacin de posible informacin que podra
contener este modelo. Tome en cuenta las restricciones. (impositor es un depositante o ahorrador).
create table cliente (nombre-cliente char(20), calle-cliente char(30),
ciudad-cliente char(30), constraint client_pk primary key (nombrecliente))
create table sucursal (nombre-sucursal char(30), ciudad-sucursal
char(30), activo integer, constraint sucursal_pk primary key (nombresucursal), constraint sucursal_activo_check check (activo >= 100000))
create table cuenta (numero-cuenta integer, nombre-sucursal char(30),
nombre-cli char(20), saldo integer, constraint cuenta_pk primary key
(numero-cuenta), constraint cta_nombre_cli_fk foreign key (nombre-cli)
references cliente(nombre-cliente), constraint cta_nom_sucursal_fk
foreign key (nombre-sucursal) references sucursal(nombre-sucursal),
constraint cuenta_saldo_check check (saldo >= 500))
create table impositor (nombre-cliente char(20), numero-cuenta integer,
constraint impositor_pk primary key (nombre-cliente, numero-cuenta),
constraint impositor_nom_cli_fk foreign key (nombre-cliente) references
cliente(nombre_cliente), constraint impositor_num_cta_fk foreign key
(numero-cuenta) references cuenta(numero-cuenta))
Cules atributos son llave primaria en cada tabla?
Tabla
Llave primaria
Tabla
Llave primaria
Tabla
Llave primaria
Tabla
Llave primaria
Tabla
Llave primaria
Cules atributos son las llaves forneas y qu tablas se estn asociando? (indique primero a la
tabla padre y luego a la tabla hija)
Llave fornea:
Tabla padre
Tabla hija
Llave fornea:
Tabla padre
Tabla hija
Llave fornea:
Tabla padre
Tabla hija
Llave fornea:
Tabla padre
Tabla hija
15/09/15
Escriba las restricciones (constraints) de verificacin de condicin del modelo anterior y una
descripcin de su propsito
Restriccin:
Propsito:
Restriccin:
Propsito:
ACTIVIDAD2: Utilice el modelo anterior para que lo introduzca en PostgreSQL. Se le advierte que
el postgreSQL no admite que los nombres de las columnas tengan guin medio, as que
sustityalos por guin bajo en todo el modelo. Otra advertencia es que los nombre tanto de tablas
como de columnas deben estar en minsculas, de otra forma, cuando haga las sentencias de SQL
le marcar error ya sea en tablas o en columnas, donde tenga letras maysculas. Si introduce el
cdigo, no olvide terminar las sentencias con punto y coma.
Introduzca los siguientes valores en la base de datos
Cuando se viola una restriccin de integridad referencial, el procedimiento normal es rechazar la
accin que provoc la violacin. Sin embargo, la clusula foreign key puede especificar que, si una
accin de borrado (DELETE) o de actualizacin (UPDATE) de la relacin a la que hace referencia
viola la restriccin, en lugar de rechazar la accin, hay que adoptar medidas para modicar la tupla
de la relacin que hace la referencia con objeto de restaurar la restriccin. Considrese la
siguiente denicin
create table cuenta ( foreign key (nombre_sucursal) references sucursal
(nombre_sucursal) on delete cascade, on update cascade, )
Debido a la clusula on delete cascade asociada con la declaracin de la clave externa (fornea),
si un borrado de una tupla de sucursal da lugar a que se viole la restriccin de integridad
referencial, el sistema no rechaza el borrado. En su lugar, el borrado se realiza en cascada en la
relacin cuenta, borrando la tupla que hace referencia a la sucursal que se borr. De modo
parecido, no se rechaza la actualizacin de un campo al que haga referencia la restriccin si viola
esta; en vez de eso, el campo nombre-sucursal de las tuplas que realizan la referencia de cuenta
se actualizan tambin al nuevo valor. SQL tambin permite que la clusula foreign key especique
una accin diferente a cascade si se viola la restriccin: el campo que hace la referencia (en este
caso, nombre-sucursal) se puede establecer en nulo o darle un valor predeterminado para el
dominio (usando set default).
Breve recordatorio de consultas
La estructura bsica de una expresin SQL consiste en tres clusulas: select, from y where.
La clusula select corresponde a la operacin proyeccin del lgebra relacional. Se usa
para listar los atributos deseados del resultado de una consulta.
La clusula from corresponde a la operacin producto cartesiano del lgebra relacional.
Lista las relaciones que deben ser analizadas en la evaluacin de la expresin.
La clusula where corresponde al predicado seleccin del lgebra relacional. Es un
predicado que engloba a los atributos de las relaciones que aparecen en la clusula from.
SQL forma el producto cartesiano de las relaciones incluidas en la clusula from, lleva a cabo la
seleccin del lgebra relacional usando el predicado de la clusula where y entonces proyecta el
resultado sobre los atributos de la clusula select. En la prctica, SQL puede convertir la expresin
en una forma equivalente que puede ser procesada ms ecientemente.
15/09/15
15/09/15
PRESTATARIO
numero_prestamo
nombre_sucursal
P-170
P-230
P-260
Centro
Moralzarzal
Navacerrada
importe
3000
4000
1700
nombre_cliente
numero_prestamo
Santos
Gmez
Lpez
P-170
P-230
P-155
15/09/15
Renombramos la relacin (y los atributos) resultado de una reunin utilizando la clusula as, como
se ilustra a continuacin:
select * from prestamo inner join prestatario
on prestamo.numero_prestamo = prestatario.numero_prestamo
as ps (numero_prestamo, sucursal, importe, cliente,
numero_prestamo_cliente)
15/09/15
nombre-sucursal
importe
nombre-cliente
numero_prestamo
P-170
Centro
3000
Santos
P-170
P-230
Moralzarzal
4000
Gmez
P-230
null
null
null
Lpez
P-155
La reunin completa presenta los resultados de la tabla izquierda y tabla derecha aunque no
tengan correspondencia en la otra tabla. La tabla combinada contendr, entonces, todos los
registros de ambas tablas y presentar valores nulos para registros sin pareja. Por ejemplo:
select * from prestamo full outer join prestatario
on prestamo.numero_prestamo = prestatario.numero_prestamo
Produce el siguiente resultado:
numero_prestamo
nombre-sucursal
importe
nombre-cliente
numero_prestamo
P-170
Centro
3000
Santos
P-170
P-230
Moralzarzal
4000
Gmez
P-230
null
null
null
Lpez
P-155
P-260
Navacerrada
1700
null
null
15/09/15
EMPLEADOS
apellido
Ramrez
Gmez
Flores
Ayala
Prez
Salas
id_depto
51
53
53
54
54
56
DEPARTAMENTOS
nom_depto
id_depto
Ventas
51
Ingeniera
53
Produccin
54
Finanzas
55
El primer tipo de reunin es la reunin interna y los otros tres son tipos de reuniones externas.
Las tres condiciones de reunin son: la reunin natural y la condicin on, ya vistas anteriormente,
y la condicin using, que se ver ms adelante.
El uso de una condicin de reunin es
obligatorio en las reuniones externas
opcional en las reuniones internas (ya que si se omite, el resultado ser el producto
cartesiano de las dos relaciones).
La palabra clave natural aparece sintcticamente antes del tipo de reunin, como se mostr
anteriormente, mientras que las condiciones on y using aparecen al final de la expresin de
reunin.
Valentn Belisario Domnguez Vera
15/09/15
Las palabras clave inner y outer son opcionales, ya que el resto del tipo de reunin permite
deducir si la reunin es una reunin interna o externa.
El significado de la condicin de reunin natural, en trminos de las tuplas de las relaciones que
encajan, es inmediato. La ordenacin de los atributos, dentro del resultado de la reunin natural es
el siguiente: los atributos de reunin (es decir, los atributos comunes a las dos relaciones)
aparecen en primer lugar, en el orden en el que aparezcan en la relacin del lado izquierdo. A
continuacin estn los dems atributos que no son de reunin de la relacin del lado izquierdo y, al
final, todos los atributos que no son de reunin de la relacin del lado derecho de la relacin.
La siguiente expresin es un ejemplo de la combinacin de la condicin de reunin natural con el
tipo de reunin externa por la derecha.
select * from prestamo natural right outer join prestatario
Los atributos del resultado se definen por el tipo de reunin, que es una reunin natural; as,
nmero-prstamo aparece slo una vez. Las primeras dos tuplas del resultado provienen de la
reunin natural de prstamo y prestatario. La tupla de la relacin del lado derecho (Lpez, P-155)
no encaja en la reunin interna con ninguna tupla de la relacin del lado izquierdo (prstamo). As,
la tupla (P-155, null, null, Lpez) aparece en el resultado de la reunin.
La condicin de reunin using (A1, A2, , An) es similar a la condicin de reunin natural, salvo
en que los atributos de reunin en este caso son A1, A2,,An, en lugar de todos los atributos
comunes de ambas relaciones y aparecen slo una vez en el resultado de la unin.
El tipo de reunin externa completa (full outer join) es una combinacin de los tipos de reunin
externa por la derecha y por la izquierda. Despus de calcular el resultado de la reunin interna,
las tuplas de la relacin del lado izquierdo que no encajen con ninguna tupla de la relacin del lado
derecho se completan con valores nulos y se aaden al resultado. De forma anloga, las tuplas de
la relacin del lado derecho que no encajen con ninguna tupla de la relacin del lado izquierdo, se
completan con valores nulos y se aaden al resultado.
El resultado de la siguiente expresin aparece en la figura
Select * from prestamo natural full outer join prestatario
using (numero_prestamo)
Otro ejemplo del uso de la operacin reunin externa es la consulta: Listar todos los clientes que
poseen una cuenta pero no tienen un prstamo en el banco. Esta consulta se puede formular
como sigue:
select i-NC from (impositor left outer join prestatario on
impositor.nombre_cliente = prestatario.nombre_cliente) as
db1 (i-NC, nmero_cuenta, p-NC, numero_prestamo) where p-NC is null
SQL proporciona adems otros dos tipos de reunin, llamados cross join (reunin cruzada) y
union join (reunin de unin). El primero es equivalente a una reunin interna sin condicin de
10
15/09/15
reunin; el segundo es equivalente a una reunin externa completa con condicin falsa, es decir,
donde la reunin interna es vaca.
Operaciones sobre conjuntos
La operacin unin
En SQL podemos hacer otras operaciones del lgebra relacional como son la unin, la
interseccin y la diferencia de conjuntos, slo que en SQL reciben el nombre de union, intersect y
except, respectivamente. Al igual que en lgebra relacional, las relaciones (tablas) participantes
deben ser compatibles, esto es, que deben tener el mismo conjunto de atributos y estos deben ser
del mismo dominio.
Los dos conjuntos utilizados sern: el conjuntos de todos los clientes que tienen una cuenta en el
banco, que puede obtenerse con:
select nombre-cliente from impositor
y el conjunto de todos los clientes que tienen un prstamo en el banco, que puede obtenerse con:
select nombre-cliente from prestatario
Para encontrar todos los clientes que poseen un prstamo, una cuenta o las dos cosas en el
banco, se escribir:
(select nombre-cliente from impositor) union (select nombre-cliente
from prestatario)
A diferencia de la clusula select, la operacin union (unin) elimina duplicados automticamente.
Para conservar los duplicados, se utilizar union all en lugar de union:
(select nombre-cliente from impositor) union all (select nombrecliente from prestatario)
El nmero de tuplas duplicadas en el resultado es igual al nmero total de duplicados que
aparecen en las consultas operandos de la unin. As, si Santos tuviese tres cuentas y dos
prstamos en el banco, entonces en el resultado apareceran cinco tuplas con el nombre de
Santos.
La operacin interseccin
Para encontrar todos los clientes que tienen tanto un prstamo como una cuenta en el banco, se
escribir:
(select distinct nombre-cliente from impositor) intersect (select
distinct nombre-cliente from prestatario)
La operacion intersect (interseccin) elimina duplicados automticamente.
Para conservar los duplicados se utilizar intersect all en lugar de intersect:
(select nombre-cliente from impositor) intersect all (select nombrecliente from prestatario)
El nmero de tuplas duplicadas en el resultado es igual al mnimo nmero de duplicados que
aparecen en las consultas operandos de la interseccin.
As, si Santos tuviese tres cuentas y dos prstamos en el banco, entonces en el resultado de la
interseccin apareceran dos tuplas con el nombre de Santos.
La operacin except (diferencia de conjuntos)
Para encontrar todos los clientes que tienen cuenta pero no tienen ningn prstamo en el banco
se escribir:
(select distinct nombre-cliente from impositor) except (select
distinct nombre-cliente from prestatario)
11
15/09/15
Nombre
Claudia
Miguel
Roberto
Apellido
Rincn
Prez
Espinosa
Edad
24
25
24
Carrera
Bioqumica
Contadura
Ingeniera
Curso
Tenis
Futbol
Karate
Costo_curso
3000
2500
2000
ALUMNOS2
ID_Alumno
150
200
350
Nombre
Leticia
Miguel
Emma
Apellido
Miranda
Prez
Garca
Edad
23
25
25
Carrera
Psicologa
Contadura
Ingeniera
Curso
Natacin
Futbol
Karate
Costo_curso
2800
2500
2000
Subconsultas anidadas
Una subconsulta es una expresin select-from-where que se anida dentro de otra consulta. Un
uso comn de subconsultas es llevar a cabo
comprobaciones sobre pertenencia a conjuntos,
comparacin de conjuntos y
cardinalidad de conjuntos.
Pertenencia a conjuntos
SQL utiliza el clculo relacional para las operaciones que permiten comprobar la pertenencia de
una tupla a una relacin. La conectiva in comprueba la pertenencia a un conjunto, donde el
conjunto es la coleccin de valores resultado de una clusula select. La conectiva not in
comprueba la no pertenencia a un conjunto.
Por ejemplo la consulta Encontrar todos los clientes que tienen tanto un prstamo como una
cuenta en el banco. Anteriormente escribimos esta consulta como la interseccin de dos
conjuntos: el conjunto de los impositores del banco y el conjunto de los prestatarios del banco. Sin
embargo, existe un enfoque alternativo consistente en encontrar todos los tenedores de cuentas
en el banco que son miembros del conjunto de prestatarios.
12
15/09/15
Claramente, esta formulacin genera el mismo resultado que la anterior, pero obliga a formular la
consulta usando la conectiva in de SQL. Acontinuacin, se van a obtener todos los tenedores de
cuentas formulando as la siguiente subconsulta:
(select nombre-cliente from impositor)
Acontinuacin es necesario encontrar aquellos clientes que son prestatarios del banco y que
aparecen en la lista de tenedores de cuenta, obtenida como resultado de la subconsulta anterior.
Esto se consigue anidando la subconsulta en un select ms externo. La consulta resultante es la
siguiente:
select distinct nombre-cliente from prestatario
where nombre-cliente in (select nombre-cliente from impositor)
Este ejemplo muestra que es posible escribir la misma consulta de diversas formas en SQL.
En el ejemplo anterior se comprobaba la pertenencia a un conjunto en una relacin de un solo
atributo. Tambin es posible comprobar la pertenencia a un conjunto en una relacin cualquiera.
As, se puede formular la consulta Listar los clientes que tienen tanto una
cuenta como un prstamo en la sucursal Navacerrada de un modo distinto al visto anteriormente:
select distinct nombre_cliente from prestatario, prestamo
where prestatario.numero_prestamo = prestamo.numero_prestamo and
nombre_sucursal = Navacerrada and (nombre_sucursal, nombre_cliente)
in (select nombre_sucursal, nombre_cliente from impositor,
cuenta where impositor.numero_cuenta = cuenta.numero_
cuenta)
A continuacin, se ilustra el uso del not in. Por ejemplo, para encontrar todos los clientes que
tienen un prstamo en el banco, pero no tienen una cuenta en el banco, se puede escribir
select distinct nombre_cliente from prestatario
where nombre_cliente not in (select nombre_cliente from impositor)
Los operadores in y not in tambin se pueden usar sobre conjuntos enumerados. La consulta
siguiente selecciona los nombres de los clientes que tienen un prstamo en el banco y cuyos
nombres no son ni Santos ni Gmez.
select distinct nombre_cliente from prestatario
where nombre_cliente not in (Santos, Gmez)
Comparacin de conjuntos
Considrese la consulta Obtener los nombres de todas las sucursales que poseen un activo
mayor que al menos una sucursal situada en Barcelona. Una manera de formular esta consulta
es del modo siguiente:
select distinct T.nombre-sucursal from sucursal as T, sucursal as S
where T.activo > S.activo and S.ciudad-sucursal = Barcelona
SQL ofrece un estilo alternativo de formular la consulta anterior. La expresin mayor que al
menos una se representa en SQL por > some. Esta instruccin permite reescribir la consulta en
una forma ms parecida al lenguaje natural.
select nombre-sucursal from sucursal
where activo > some (select activo from sucursal
where ciudad-sucursal = Barcelona)
La subconsulta (select activo from sucursal where ciudad-sucursal = Barcelona) genera el
conjunto de todos los valores de activo para todas las sucursales sitas en Barcelona.
Valentn Belisario Domnguez Vera
13
15/09/15
14
15/09/15
ACTIVIDAD6: Suponga el siguiente modelo de datos. Elabore las respectivas tablas resultado de
cada operacin.
ALUMNOS1
ID_Alumno
100
200
300
Nombre
Claudia
Miguel
Roberto
Apellido
Rincn
Prez
Espinosa
Edad
24
25
24
Carrera
Bioqumica
Contadura
Ingeniera
Curso
Tenis
Futbol
Karate
Costo_curso
3000
2500
2000
ALUMNOS2
ID_Alumno
150
200
350
Nombre
Leticia
Miguel
Emma
Apellido
Miranda
Prez
Garca
Edad
23
25
25
Carrera
Psicologa
Contadura
Ingeniera
Curso
Natacin
Futbol
Karate
Costo_curso
2800
2500
2000
a)
b)
c)
15