Está en la página 1de 15

Apuntes de Bases de Datos 2

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

Apuntes de Bases de Datos 2

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

Apuntes de Bases de Datos 2

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

Valentn Belisario Domnguez Vera

Apuntes de Bases de Datos 2

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.

Valentn Belisario Domnguez Vera

Apuntes de Bases de Datos 2

15/09/15

Puede generalizarse que una consulta tiene el formato siguiente:


select columnas a visualizar from tabla (real o producto cartesiano)
where condicin o condiciones que deben cumplir algunas columnas
El resultado de una consulta SQL es, por supuesto, una relacin (tabla). Por ejemplo, si deseo
obtener los nombres de todas las sucursales en la tabla cuenta, escribo
select nombre_sucursal from cuenta
El resultado es una relacin consistente en un atributo: nombre-sucursal.
En aquellos casos donde se quiera forzar la NO aparicin de duplicados, se insertar la palabra
clave distinct despus de select. Por lo tanto, se puede reescribir la consulta anterior como
select distinct nombre_sucursal from cuenta
El smbolo asterisco (*) se puede usar para denotar todos los atributos. As, el uso de prstamo.*
indicara que todos los atributos de prstamo seran seleccionados.
Una clusula select de la forma select * indica que se deben seleccionar todos los atributos de
todas las relaciones (tablas) que aparecen en la clusula from.
Select * from prestamo, cuenta
La clusula select tambin puede contener expresiones aritmticas que contengan los operadores,
+, , * y /, operando sobre constantes o atributos de la tuplas. Por ejemplo, la consulta
select nombre_sucursal, numero_prestamo, importe * 100 from prestamo
devolver una relacin (tabla) que es igual que la relacin prstamo, salvo que el atributo importe
est multiplicado por 100.
Considrese la consulta Obtener todos los nmeros de prstamo para prstamos hechos en la
sucursal con nombre Navacerrada, en los que el importe sea superior a 1,200 Pesos. Esta
consulta puede escribirse en SQL como
select numero_prestamo from prestamo where nombre_sucursal =
Navacerrada and importe > 1200
Si se desea obtener el nmero de prstamo de aquellos prstamos por importes entre 90,000 y
100,000 Pesos, se puede usar la comparacin between para escribir
select numero_prestamo from prestamo where importe between 90000 and
100000
Finalmente la clusula from, esta clusula define por s misma un producto cartesiano de las
relaciones (tablas) que aparecen en dicha clusula.
La consulta Para todos los clientes que tienen un prstamo en el banco, obtener los nombres,
nmeros de prstamo e importes. Esta consulta puede escribirse en SQL como
select nombre_cliente, prestatario.numero_prestamo, importe from
prestatario, prestamo where prestatario.numero_prestamo =
prestamo.numero_prestamo
Ntese que SQL usa la notacin nombre-relacin.nombre-atributo, como lo hace el lgebra
relacional, para evitar ambigedad en los casos en que un atributo aparece en el esquema de ms
de una relacin.
ACTIVIDAD3: Tomando como base el modelo de la ACTIVIDAD1, Escriba las sentencias en SQL
para las siguientes solicitudes de informacin.
Valentn Belisario Domnguez Vera

Apuntes de Bases de Datos 2

15/09/15

a) Obtener los clientes que viven en Escobedo.


b) Obtener las sucursales cuyo activo sea superior a $100,000.00.
c) Obtener las cuentas que pertenezcan a la sucursal Soriana Sendero Norte y cuyo saldo est
entre $8,000.00 y $15,000.00 pesos
d) Obtener los nmeros de cuenta de los clientes que viven en Escobedo.
e) Obtener los nmeros de cuenta de las sucursales que tengan un activo inferior a $500,000.00.
f) Obtener los clientes cuyas cuentas tengan un saldo menor a $500.00.
Operaciones de Reunin: Consultas de varias tablas
SQL tambin proporciona varios mecanismos para combinar relaciones mediante operaciones de
reunin, e incluye reuniones naturales y reuniones condicionales, as como varias formas de
reunin externa. Estas operaciones adicionales se usan a menudo como subconsultas dentro de
la clusula from.
En la siguiente figura se muestra el esquema que usaremos para ilustrar las operaciones de
reunin. Un prestatario es una persona que pide un prstamo.
PRESTAMO

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

Primero veremos las reuniones de tipo interno (inner join).


En la reunin interna (inner join), SQL-2003 especifica dos formas diferentes para expresar esta
combinacin.
La primera, conocida como explcita usa la palabra JOIN, mientras que
La segunda es implcita y usa la coma (,) para separar las tablas a combinar en la sentencia
FROM de la declaracin SELECT.
Siempre se genera el producto cartesiano del cual se seleccionan las tuplas que cumplan
lo que indica la condicin (on en la explcita y where en la implcita) .
Es necesario tener especial cuidado cuando se combinan columnas con valores NULL ya
que el valor nulo no se combina con otro valor o con otro nulo, excepto cuando se le
agregan predicados (condiciones) tales como IS NULL o IS NOT NULL. Por ejemplo, la
consulta:
select * from prestamo inner join prestatario
on prestamo.numero_prestamo = prestatario.numero_prestamo
Produce el resultado mostrado a continuacin, e ilustra la forma explcita.

Y es equivalente a esta otra que muestra la forma implcita:


select * from prestamo, prestatario
where prestamo.numero_prestamo = prestatario.numero_prestamo
La expresin inner join calcula la reunin interna (que es la forma general) de las relaciones
prstamo y prestatario, donde la condicin de reunin es prestamo.numero_prestamo =
Valentn Belisario Domnguez Vera

Apuntes de Bases de Datos 2

15/09/15

prestatario.numero_prestamo. El resultado, que es una relacin o tabla, est compuesto


por los atributos de la tabla del lado izquierdo de la condicin, seguidos por los atributos de la
tabla del lado derecho de la condicin.
La reunin interna a veces tambin recibe el nombre de reunin zeta o theta.
La theta join es aquella que en la condicin usa operadores, como <, >, not =, <=, >=. Por
ejemplo:
select * from prestamo inner join prestatario
on prestamo.numero_prestamo < prestatario.numero_prestamo
y de la theta join tenemos tres variantes: de equivalencia, natural, y cruzada.
La de equivalencia (equi-join), es una theta-join especial que usa comparaciones de
igualdad en el predicado JOIN. La consulta del ejemplo anterior es del tipo equi-join.
select * from prestamo inner join prestatario
on prestamo.numero_prestamo = prestatario.numero_prestamo
La natural (Natural join), es una especializacin de la equi-join. En este caso se comparan
todas las columnas que tengan el mismo nombre en ambas tablas. La tabla resultante
contiene slo una columna por cada par de columnas con el mismo nombre. Por ejemplo:
select * from prestamo natural inner join prestatario
Esta expresin calcula la reunin natural de dos relaciones. El nico nombre de atributo comn en
prstamo y prestatario es nmero-prstamo. El resultado de la expresin anterior se muestra en la
figura siguiente:

Este resultado es similar al resultado de la reunin interna (inner join) con la


condicin on mostrada anteriormente. Sin embargo, el atributo nmero-prstamo
aparece slo una vez en el resultado de la reunin natural, mientras que aparece dos
veces en el resultado de la reunin con la condicin on.
El uso de esta sentencia puede producir resultados ambiguos y generar problemas si
la base de datos cambia, porque al aadir, quitar, o renombrar las columnas, la
sentencia puede perder sentido; por esta razn es preferible expresar el predicado
usando las otras expresiones nombradas anteriormente.
La reunin cruzada (Cross join), presenta el producto cartesiano de todos los registros de
las dos tablas. El cdigo SQL para realizar este producto cartesiano enuncia las tablas que
sern combinadas, pero no incluye algn predicado que filtre el resultado. Por ejemplo:
select * from prestamo cross join prestatario
Esta clase de combinacin es usada pocas veces, generalmente se le agregan
condiciones de filtrado con la sentencia WHERE para hallar resultados especficos.

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)

Valentn Belisario Domnguez Vera

Apuntes de Bases de Datos 2

15/09/15

La segunda aparicin de nmero-prstamo se ha renombrado como nmero-prstamo-cliente. El


orden de los atributos en el resultado de una reunin natural es importante a la hora de
renombrarlos.
Procedemos ahora a mostrar el funcionamiento de los tipos de reunin externa.
La reunin externa por la izquierda se calcula del modo siguiente.
Primero se calcula el resultado de la reunin interna, como se vio anteriormente.
A continuacin, para cada tupla r perteneciente a la relacin del lado izquierdo que no encaje con
ninguna tupla s de la relacin del lado derecho, se aade al resultado de la reunin una tupla t
compuesta por los valores de r y una tupla s con valores nulos. Por ejemplo:
select * from prestamo left outer join prestatario
on prestamo.numero_prestamo = prestatario.numero_prestamo

La reunin externa por la derecha es la operacin inversa a la anterior; el resultado de esta


operacin siempre contiene todos los registros de la tabla de la derecha (la segunda tabla que se
menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la
izquierda, para uno de la derecha. Por ejemplo:
select * from prestamo right 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

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

ACTIVIDAD4: I) Tome como referencia el siguiente modelo y, en su cuaderno, elabore las


relaciones resultado de las consultas siguientes.

Valentn Belisario Domnguez Vera

Apuntes de Bases de Datos 2

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

a) select * from empleados INNER JOIN departamentos


ON empleados.depto = departamentos.ID_depto
b) select * from empleados NATURAL JOIN departamentos
c) select * from empleados LEFT OUTER JOIN departamentos
ON empleados.Depto = departamentos.ID_depto
d) select * from empleados RIGHT OUTER JOIN departamentos
ON empleados.Depto = departamentos.ID_Depto
e) select * from empleados FULL OUTER JOIN departamentos
ON empleados.Depto = departamentos.ID_Depto
II) Escriba dos sentencias diferentes con las que obtenga el producto cruz, en una use cross join y
en otra la clusula from y coma (,) sin condicin.
Tipos y condiciones de reunin
Las expresiones de reunin externa se usan normalmente en la clusula from, aunque se pueden
utilizar en cualquier lugar en el que cabra usar cualquier otra relacin.
Cada variante de las operaciones de reunin en SQL est formado por un tipo de reunin y una
condicin de reunin. La condicin de reunin indica las tuplas pertenecientes a las dos relaciones
que encajan y los atributos que se incluyen en el resultado de la reunin. El tipo de reunin define
cmo se tratan las tuplas de cada relacin que no encajan con ninguna tupla de la otra relacin
(basado en la condicin de reunin).
A continuacin se muestran algunos de los tipos y condiciones de reunin.

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

Apuntes de Bases de Datos 2

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

Valentn Belisario Domnguez Vera

10

Apuntes de Bases de Datos 2

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)

Valentn Belisario Domnguez Vera

11

Apuntes de Bases de Datos 2

15/09/15

La operacion except (excepto) elimina duplicados automticamente. As, en la consulta anterior,


una tupla con el nombre de Santos aparecer en el resultado (exactamente una vez), slo si
Santos tiene una cuenta en el banco, pero no tiene ningn prstamo en el mismo.
Para conservar los duplicados, se utilizar except all en lugar de except:
(select nombre-cliente from impositor) except all (select nombrecliente from prestatario)
El nmero de copias duplicadas de una tupla en el resultado es igual al nmero de copias
duplicadas de dicha tupla en la consulta de la izquierda menos el nmero de copias duplicadas de
la misma tupla en la consulta de la derecha, siempre que la diferencia sea positiva. As, si Santos
tuviese tres cuentas y un prstamo en el banco, entonces en el resultado apareceran dos tuplas
con el nombre de Santos. Si, por el contrario, dicho cliente tuviese dos cuentas y tres prstamos
en el banco, no habr ninguna tupla con el nombre de Santos en el resultado.
ACTIVIDAD5. Suponga el siguiente modelo de datos. Elabore las sentencias en SQL para obtener
la unin, la interseccin y la diferencia de conjuntos. Tambin 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

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.

Valentn Belisario Domnguez Vera

12

Apuntes de Bases de Datos 2

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

Apuntes de Bases de Datos 2

15/09/15

La comparacin > some, en la clusula where de la clusula select ms externa, es cierta si el


valor del atributo activo de la tupla es mayor que al menos un miembro del conjunto de todos los
valores de activo de las sucursales de Barcelona. SQL tambin permite realizar las comparaciones
< some, <= some, >= some, = some y <> some. Como ejercicio, se puede vericar que = some
es idntico a in, mientras que <= some no es lo mismo que not in.
Ahora la consulta se modicar ligeramente a n de obtener los nombres de todas las sucursales
que tienen un activo superior al de todas las sucursales de Barcelona. La instruccin > all
corresponde a la expresin superior a todas. Utilizando esta instruccin la consulta se podra
formular del modo siguiente:
select nombre_sucursal from sucursal where activo > all
(select activo from sucursal where ciudad_sucursal = Barcelona)
Al igual que con some, SQL tambin permite utilizar las comparaciones < all, <= all, >= all, = all y
<> all. En SQL, la palabra clave any es sinnimo de some.Como ejercicio se puede vericar que
<= any es lo mismo que not in.
Comprobacin de relaciones vacas
SQL incluye la posibilidad de comprobar si una subconsulta produce ninguna tupla como
resultado. La instruccin exists devuelve un valor verdadero si la subconsulta argumento no es
vaca. Usando la instruccin exists se puede formular la consulta Obtener los clientes que tienen
tanto una cuenta como un prstamo en el banco de otra nueva forma:
select nombre_cliente where exists (select * from impositor
where impositor.nombre_cliente = prestatario.nombre_cliente)
Utilizando la constructora not exists se puede comprobar la inexistencia de tuplas en el resultado
de una subconsulta.
Comprobacin de tuplas duplicadas
SQL incluye la posibilidad de comprobar si una subconsulta produce como resultado tuplas
duplicadas. La clusula unique devuelve el valor cierto si la subconsulta que se le pasa como
argumento no produce tuplas duplicadas. Usando la clusula unique se puede formular la consulta
Obtener todos los clientes que tienen slo una cuenta en la sucursal de nombre Navacerrada del
siguiente modo:
select T.nombre_cliente from impositor as T
where unique (select R.nombre_cliente from cuenta, impositor as R
where T.nombre_cliente = R.nombre_cliente and
R.numero_cuenta = cuenta.numero_cuenta and
cuenta.nombre_sucursal = Navacerrada)
La existencia de tuplas duplicadas en una subconsulta se puede comprobar utilizando la
constructora not unique. Para ilustrar esta constructora considrese la consulta Obtener todos
los clientes que tienen al menos dos cuentas en la sucursal Navacerrada, que se puede formular
del modo siguiente:
select distinct T.nombre_cliente from impositor as T
where not unique (select R.nombre_cliente from cuenta, impositor as R
where T.nombre_cliente = R.nombre_cliente and
R.numero_cuenta = cuenta.numero_cuenta and
cuenta.nombre_sucursal =Navacerrada)
Valentn Belisario Domnguez Vera

14

Apuntes de Bases de Datos 2

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)

select ID_alumno, nombre, apellido from alumnos1


where ID_alumno in (select ID_alumno from alumnos2)

b)

select ID_alumno, nombre, apellido from alumnos1


where ID_alumno not in (select ID_alumno from alumnos2)

c)

select T.ID_alumno from alumnos1 as T where unique


(select alumnos1.ID_alumno from alumnos1 , alumnos2 as T
where alumnos1.ID_alumno = alumnos2.ID_alumno)

ACTIVIDAD7: Elabore un cuadro sinptico de las operaciones unin, interseccin, diferencia de


conjuntos, pertenencia a conjuntos, comparacin de conjuntos, comprobacin de relaciones
vacas y comprobacin de tuplas duplicadas.Especifique:
a) La clusula o constructor para cada operacin
b) Los modificadores ALL y NOT de las operaciones que lo usen
c) El propsito de cada operacin
Fuentes:
http://es.wikipedia.org/wiki/Integridad_de_datos
http://es.wikipedia.org/wiki/Integridad_referencial
Libro: Silberschatz, Korth y Sudarshan; Fundamentos de bases de datos, 4 edicin, 2002, Edit.
McGraw-Hill

Valentn Belisario Domnguez Vera

15

También podría gustarte