You are on page 1of 52

Database System Concepts, 5th Ed.

Silberschatz, Korth y Sudarshan


Traducido por Jorge Jimnez Glz.
SQL
2 Bases de Datos
Chapter 3: SQL
Definicin de Datos
Estructura Basica de Consultas
Operaciones de Conjuntos
Funciones de Agregacin
Valores Nulos
Subconsultas Anidadas
Consultas Complejas
Vistas
Modificacin de la Base de Datos
Combinacin de Relationes
3 Bases de Datos
Lenguage de Definicin de Datos
El esquema para cada relacin .
El dominio de valores asociado con cada atributo.
Restricciones de Integridad
El conjunto de indices definidos para cada relacin.
La informacin de Seguridad y autorizaciones para cada
relation.
La estructura de almacenamiento fsico en disco de cada
relacin.
Permite la especificacin de un conjunto de relaciones y de la
informacin acerca de cada relacin, incluyendo:
4 Bases de Datos
Tipos de Dominios en SQL
char(n). Cadena de caracteres de longitud fija n.
varchar(n). Cadena de caracteres de longitud variable que tiene como
mximo n caracteres.
int. Entero (un subconjunto finito de los enteros que es dependiente de la
mquina ).
smallint. Entero corto (un subconjunto finito del dominio de los enteros
que es dependiente de la mquina ).
numeric(p,d). Nmero de punto fijo, con precisin de p digits, con d dgitos
a la derecha del punto decimal.
real, double precision. Nmeros de punto flotante, precisin simple y
doble, con precisin dependiente de la mquina.
float(n). Nmeros de punto flotante, con precisin de al menos n dgitos.



5 Bases de Datos
El comando Create Table
Una relacin SQL es definida usando el comando create table :
create table r (A
1
D
1
, A
2
D
2
, ..., A
n
D
n
,
(restriccin de integridad
1
),
...,
(restriccin de integridad
k
))
r es el nombre de la relacin
Cada A
i
es un nombre de atributo en el esquema de la
relacin r
D
i
es el tipo de dato de valores en el dominio del atributo A
i

Ejemplo:
create table SUCURSAL
(nombre_sucursal char(15) not null,
ciudad_sucursal char(30),
activos integer)
6 Bases de Datos
Restricciones de Integridad en Create Table
not null
primary key (A
1
, ..., A
n
)
Ejemplo: Declarar nombre_sucursal como la llave primaria para
sucursal y asegurarse que los valores de activos sean no-
negativos.
create table SUCURSAL
(nombre_sucursal char(15),
ciudad_sucursal char(30),
activos integer,
primary key (nombre_sucursal))
La declaracin primary key automaticamente asigna la
restriccin not null en el atributo en SQL-92, en SQL-89 se
necesita declarar.
7 Bases de Datos
Declaraciones Drop y Alter Table
El comando drop table borra toda la informacin acerca de una
relacin en la base de datos.
El comando alter table es usado para agregar atributos a una
relacin existente :
alter table r add A D
donde A es el nombre de el atributo que va a ser agregado a la
relacin r y D es el dominio de A.
Null es asignado como valor para los nuevos atributos.
El comando alter table puede ser usado para borrar atributos
de la relacin:
alter table r drop A
donde A es el nombre de un atributo de relacin r
El borrado de atributos no es soportado por muchas bases de
datos
8 Bases de Datos
Estructura bsica de las Consultas
SQL esta basado en la teora de conjuntos y operadores relacionales
con ciertas mejoras y modificaciones.
Una consulta tpica en SQL tiene la forma:

select A
1
, A
2
, ..., A
n

from r
1
, r
2
, ..., r
m

where P

A
i
representa un atributo
R
i
representa una relacin
P es un predicado.
Esta consulta es equivalente a la expresin del lgebra relacional:


El resultado de una consulta SQL es una relacin.
)) ( (
2 1 , , ,
2 1
m P A A A
r r r
n
[

o
9 Bases de Datos
La clasula select
La clasula select lista los atributos deseados en el resultado de una
consulta
corresponde al operador de proyeccin de el algebra relacional
Ejemplo: encontrar los nombres de todas sucursales en el relacin
PRESTAMO :
select nombre_sucursal
from PRESTAMO
en el algebra relacional, el consulta puede ser:
[
nombre_sucursal
(PRESTAMO )
NOTA: En SQL los nombres pueden ser escrito con minsculas o
maysculas indistintamente.
10 Bases de Datos
La clasula select (Cont.)
SQL permite duplicados en las relaciones como en los resultados de
una consulta.
Para forzar la eliminacin de duplicados, insertar la palabra clave
distinct despus de select.
Encontrar los nombres de todas las sucursales en la relacin
PRESTAMO , y remover los duplicados
select distinct nombre_sucursal
from PRESTAMO

La palabra clave all especifica que los duplicados no sern removidos.

select all nombre_sucursal
from PRESTAMO
11 Bases de Datos
La clasula select (Cont.)
Un asterisco en la clasula select denota todos los atributos
select *
from PRESTAMO
La clasula select puede contener expresiones aritmeticas ( +, , -, y
/ ), y estas operan sobre constantes o atributos de las tuplas.
La consulta:
select num_prestamo , nombre_sucursal, importe - 100
from PRESTAMO
va a retornar una relacin que es la misma que la relacion PRESTAMO,
excepto que el valor del atributo importe es multiplicado por 100.

12 Bases de Datos
La clasula where
La clasula where especifica las condiciones que las filas (tuplas)
resultantes deben satisfacer
Corresponde a la operacin de seleccin del algebra relacional.
Para encontrar todos los prstamos hechos en la sucursal Portales con
importes mayores a $1200.
select num_prestamo
from PRESTAMO
where nombre_sucursal = Portales and importe > 1500
Varias comparaciones pueden ser combinadas usando los conectores
lgicos and, or, y not.
Las comparaciones pueden ser aplicadas a los resultados de
expresiones aritmeticas.
13 Bases de Datos
La clasula where (Cont.)
SQL incluye el operador comparacin between
Ejemplo: Encontrar los prstamos cuyos importes esten entre $90,000 y
$100,000 (esto es, > $90,000 y s $100,000)

select num_prestamo
from PRESTAMO
where importe between 90000 and 100000


14 Bases de Datos
La clasula from
La clasula from lista las relaciones involucradas en la consulta
Corresponde a la operacin de producto Cartesiano del algebra relacional.

Encontrar el producto Cartesiano PRESTATARIO X PRESTAMO

select -
from PRESTATARIO, PRESTAMO
Encontrar el nombre, nmero de prstamo e importe del prstamo de todos
los clientes que tienen un prstamo en la sucursal Portales.
select nombre_cliente, PRESTATARIO.num_prestamo , importe
from PRESTATARIO, PRESTAMO
where PRESTATARIO.num_prestamo =
PRESTAMO .num_prestamo
and nombre_sucursal = Portales

15 Bases de Datos
La operacin de Renombrado
SQL permite renombrar relaciones y atributos usando la clasula as :
nombre_anterior as nuevo-nombre
Encontrar el nombre, nmero de prstamo e importe del prstamo de
todos los clientes; renombrando la columna num_prestamo como
id_prestamo .
select nombre_cliente, PRESTAMO.num_prestamo as id_prestamo ,
importe
from PRESTATARIO, PRESTAMO
where PRESTATARIO.num_prestamo = PRESTAMO . id_prestamo
16 Bases de Datos
Variables Tupla
Las variables tupla son definidas en la clasula from via el uso de la
clasula as.
Encontrar los nombres de los clientes y su nmero de prstamo para
todos los clientes que tienen un prstamo en alguna sucursal.
select distinct T.nombre_sucursal
from SUCURSAL as T, SUCURSAL as S
where T.activos > S.activos AND S.ciudad_sucursal = Veracruz

Encontrar los nombres de todas las sucursales que tienen activos
mayores a los alguna sucursal localizada en Veracruz.
select nombre_cliente, T.num_prestamo , S.importe
from PRESTATARIO as T, PRESTAMO as S
where T.num_prestamo = S.num_prestamo
17 Bases de Datos
Operaciones con cadenas
SQL incluye un operador de coincidencia para comparaciones con
cadenas de caracteres. El operador like usa patrones que son
descritos usando dos caracteres especiales:
porcentaje (%). El caracter % representa cualquier subcadena.
guin bajo (_). El caracter _ representa cualquier caracter.
Encontrar los nombres de todos los clientes que su calle incluye la
subcadena Central.
select nombre_cliente
from cliente
where calle_cliente like %Central%
Match el nombre Main%
like Main\% escape \
SQL soporta una variedad de operaciones de cadena tales como:
concatenacion (usando ||)
convertir de maysculas a minsculas (y vice versa)
determinar la longitud de una cadena, extraer subcadenas, etc.
18 Bases de Datos
Ordenando la presentacin de las Tuplas
Listar en orden alfabetico los nombres de todos los clientes que
tienen un prstamo en la sucursal Portales
select distinct nombre_cliente
from PRESTATARIO, PRESTAMO
where PRESTATARIO.num_prestamo =
PRESTAMO . num_prestamo
and nombre_sucursal = Portales
order by nombre_cliente
Para cada atributo podemos especificar desc para ordenar
descendentemente o asc para ordenar ascendentemente, el orden
ascendente es el default.
Ejemplo: order by nombre_cliente desc
19 Bases de Datos
Duplicados
En relaciones con duplicados, SQL puede definir cuantas copias de
tuplas aparecern en el resultado .
Algunos operadores del algebra relacional tienen versiones
Multiconjuntos dadas las relaciones multiconjunto r
1
y r
2
:
1. o
u
(r
1
): Si hay c
1
copias de la tupla t
1
en r
1
, y t
1
satisface la
seleccion o
u
,
, entonces hay c
1
copias de t
1
en o
u
(r
1
).
2. H
A
(r ): para cada copia de la tupla t
1
en r
1
, hay una copia de la
tupla H
A
(t
1
) en H
A
(r
1
) donde H
A
(t
1
) denota la proyeccin de la
tupla t
1
.
3. r
1
x r
2
: Si hay c
1
copias de la tupla t
1
en r
1
y c
2
copias de tupla
t
2
en r
2
, hay c
1
x c
2
copias de la tupla t
1
. t
2
en r
1
x r
2
20 Bases de Datos
Duplicados (Cont.)
Ejemplo: Suponga que relaciones multiconjunto r
1
(A, B) y r
2
(C)
son:
r
1
= {(1, a) (2,a)} r
2
= {(2), (3), (3)}
entonces H
B
(r
1
) puede ser {(a), (a)}, mientras H
B
(r
1
) x r
2
puede ser
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
Semntica de duplicados en SQL :
select A
1
,
,
A
2
, ..., A
n

from r
1
, r
2
, ..., r
m

where P
es equivalente a la versin multiconjunto de la expression:

)) ( (
2 1 , , ,
2 1
m P A A A
r r r
n
[

o
21 Bases de Datos
Operaciones sobre Conjuntos
Las operaciones sobre conjuntos union, intersect, y except operan
sobre relaciones y corresponden a las operaciones del algebra
relacional , , .
Cada de estas operaciones automaticamente elimina los duplicados;
para retener todos los duplicados hay que usar las versiones
multiconjuntos correspondientes union all, intersect all y except all.

Suponga que una tupla se repite m veces en r y n veces en s,
entonces, se repite:
m

+ n veces en r union all s
min(m,n) veces en r intersect all s
max(0, m n) veces en r except all s
22 Bases de Datos
Operaciones sobre Conjuntos
Encontrar todos los clientes que tienen un prstamo, una cuenta , o
ambos :
(select nombre_cliente from CUENTAHABIENTE)
except
(select nombre_cliente from PRESTATARIO)

(select nombre_cliente from CUENTAHABIENTE)
intersect
(select nombre_cliente from PRESTATARIO)
Encontrar todos los clientes que tienen una cuenta pero no un prstamo.
(select nombre_cliente from CUENTAHABIENTE)
union
(select nombre_cliente from PRESTATARIO)
Encontrar todos los clientes que tienen un prstamo y una cuenta .
23 Bases de Datos
Funciones de Agregacin
Estas funciones operas sobre el conjunto de valores de una
columna de una relacin, y retornan un valor
avg: promedio
min: mnimo
max: mximo
sum: suma
count: nmero de elementos
24 Bases de Datos
Funciones de Agregacin (Cont.)
Encontrar el saldo promedio de las cuentas pertenecientes a la sucursal
Portales .
Encontrar el nmero de cuentahabientes en el banco .
Encontrar el nmero de tuplas en la relacin cliente.
select avg (saldo)
from CUENTA
where nombre_sucursal = Portales
select count (*)
from CLIENTE
select count (distinct nombre_cliente)
from CUENTAHABIENTE
25 Bases de Datos
Funciones de Agregacin Group By
Encontrar el nmero de cuentahabientes para cada sucursal.
Nota: Los atributos en la clasula select fuera de las funciones de
agregacin pueden aparecer en la lista group by
select nombre_sucursal, count (distinct nombre_cliente)
from CUENTAHABIENTE, CUENTA
where cuentahabiente.num_cuenta = cuenta.num_cuenta
group by nombre_sucursal
26 Bases de Datos
Funciones de Agregacin clasula Having
Encontrar los nombres de todas las sucursales dnde el saldo
promedio de sus cuentas es mayor a $1,200.
Nota: los predicados en la clasula having se aplican despus de la
formacin de grupos mientras que los predicados en la
clasula where se aplican antes de formar los grupos

select nombre_sucursal, avg (saldo)
from CUENTA
group by nombre_sucursal
having avg (saldo) > 1200
27 Bases de Datos
Valores Nulos
Las tuplas pueden tener un valor nulo, denotado por null, para alguno
de sus atributos
null significa un valor desconocido o que el valor no existe.
El predicado is null puede ser usado para checar valores nulos.
Ejemplo: Encontrar todos los nmeros de prstamo en la relacion
PRESTAMO que tienen un valor nulo en su importe.
select num_prestamo
from PRESTAMO
where importe is null
el resultado de cualquier expresin aritmetica conteniendo null es
null
Ejemplo: 5 + null retorna null
Sin embargo, las funciones de agregacin simplemente ignoran los
valores nulos
28 Bases de Datos
Null Values y Three Valued Logic
cualquier comparacin con nulo retorna desconocido
Ejemplo: 5 < nulo o nulo <> nulo o nulo = nulo
La logica Tri-valuada usa el valor desconocido como verdadero:
OR: (desconocido o verdadero ) = verdadero , (desconocido o
falso ) = desconocido
(desconocido o desconocido ) = desconocido
AND: (verdadero y desconocido ) = desconocido , (falso y
desconocido ) = falso ,
(desconocido y desconocido ) = desconocido
NOT: (not desconocido ) = desconocido
P es desconocido es verdadero si el predicado P es
desconocido
El resultado del predicado P de la clasula where es tratado como
falso si P es evaluado como desconocido
29 Bases de Datos
Valores nulos y Funciones de Agregacin
Total de todos los importes de prstamo
select sum (importe )
from PRESTAMO
La sentencia ignora los importes nulos.
El resultado es nulo si todos los importes son nulos.
Todas las operaciones de agregacin, excepto count(*) ignoran
las tuplas con valores nulos sobre los atributos agregados.
30 Bases de Datos
Subconsultas Anidadas
SQL provee un mecanismo para el anidamiento de subconsultas.
Una subconsulta es una expresin select-from-where que es anidada
dentro de otra consulta.
Un uso comn de subconsultas es realizar tests para la pertenencia a
un conjunto, comparaciones entre conjuntos y cardinalidad de
conjuntos.
31 Bases de Datos
Ejemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta y un prstamo
en el banco .
Encontrar todos los clientes que tienen un prstamo en el banco
pero no tienen una cuenta en el banco
select distinct nombre_cliente
from PRESTATARIO
where nombre_cliente not in (select nombre_cliente
from CUENTAHABIENTE )
select distinct nombre_cliente
from PRESTATARIO
where nombre_cliente in (select nombre_cliente
from CUENTAHABIENTE )
32 Bases de Datos
Ejemplo de Subconsulta
Encontrar la sucursal (y su ciudad) que tiene el mayor de los activos .
Encontrar para cada ciudad la sucursal que tiene el activo mayor.
select ciudad_sucursal, nombre_sucursal, activos
from SUCURSAL as S
where activos = ( select max(T.activos)
from SUCURSAL as T
where S.ciudad_sucursal = T.ciudad_sucursal)
select nombre_sucursal, ciudad_sucursal, activos
from SUCURSAL
where activos = ( select max(activos)
from SUCURSAL )
33 Bases de Datos
Ejemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta y un prstamo
en la sucursal Portales
Nota: La consulta anterior puede ser escrita en una forma ms simple y
slo se muestra as para ilustrar las caractersticas de SQL.
select distinct nombre_cliente
from PRESTATARIO, PRESTAMO
where PRESTATARIO.Num_Prstamo = PRESTAMO .Num_Prstamo
and nombre_sucursal = Portales
and (nombre_sucursal, nombre_cliente ) in
(select nombre_sucursal, nombre_cliente
from CUENTAHABIENTE, CUENTA
where cuentahabiente.num_cuenta =
cuenta.num_cuenta )
34 Bases de Datos
Comparacin de Conjuntos
Encontrar todas las sucursales que tienen activos mayores que los de
alguna sucursal localizada en Veracruz.
Encontrar las sucursales que tienen activos mayores que al menos
una sucursal localizada en Veracruz.
select nombre_sucursal
from SUCURSAL
where activos > some
(select activos
from SUCURSAL
where ciudad_sucursal = Veracruz)
select distinct T.nombre_sucursal
from SUCURSAL as T, SUCURSAL as S
where T.activos > S.activos
and S.ciudad_sucursal = Veracruz
35 Bases de Datos
Definicin de la clasula Some
F <comp> some r - t e r tal que (F <comp> t )
Dnde <comp> pueden ser : <, s, >, =, =
0
5
6
(5 < some ) = true
0
5
0
) = false
5
0
5 (5 = some ) = true (puesto que 0 = 5)
(se lee: 5 < alguna tupla en la relacin)
(5 < some
) = true (5 = some
(= some) in
Sin embargo, (= some) not in
36 Bases de Datos
Ejemplo de Subconsulta
Encontrar los nombres de todas las sucursales que tienen activos
mayores que todas las sucursales localizadas en Veracruz.
select nombre_sucursal
from SUCURSAL
where activos > all
(select activos
from SUCURSAL
where ciudad_sucursal = Veracruz)
37 Bases de Datos
Definicin de la clasula all
F <comp> all r t e r (F <comp> t)
0
5
6
(5 < all ) = false
6
10
4
) = true
5
4
6 (5 = all
) = true (puesto que 5 = 4 y 5 = 6)
(5 < all
) = false (5 = all
(= all) not in
Sin embargo, (= all) in
38 Bases de Datos
Test para Relaciones Vacias
SQL incluye la posibilidad de comprobar si una subconsulta no produce
ninguna tupla como resultado.
El constructor exists regresa el valor true si la subconsulta argumento
no es vaca.
exists r r =
not exists r r =
Usando not exists se puede comprobar la inexistencia de tuplas en el
resultado de una subconsulta.
Es posible usar not exists para simular la operacin de contencin de
un conjunto (es decir superconjunto)
Se puede escribir La relacin A contiene a la relacin B como:
not exists (B except A)

39 Bases de Datos
Ejemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta en todas las
sucursales localizadas en Veracruz.
select distinct S.nombre_cliente
from CUENTAHABIENTE as S
where not exists (
(select nombre_sucursal
from SUCURSAL
where ciudad_sucursal = Veracruz)
except
(select R.nombre_sucursal
from CUENTAHABIENTE as T, CUENTA as R
where T.num_cuenta= R.num_cuenta
and S.nombre_cliente = T.nombre_cliente ))
Note que X Y = X _ Y
Nota: No se puede escribir esta consulta usando = all y sus variantes
40 Bases de Datos
Ejemplo de Subconsulta
En este ejemplo la subconsulta
(select nombre_sucursal
from SUCURSAL
where ciudad_sucursal = Veracruz)

Por otro lado la subconsulta:
Obtiene todas las sucursales de Veracruz.
(select R.nombre_sucursal
from CUENTAHABIENTE as T, CUENTA as R
where T.num_cuenta= R.num_cuenta
and S.nombre_cliente = T.nombre_cliente ))
Obtiene todas las sucursales en las cuales el cliente S.nombre_cliente
tiene una cuenta.
41 Bases de Datos
Ejemplo de Subconsulta
Por ltimo el select ms externo:
En consultas que contengan subconsultas se aplica la regla de
visibilidad para las variables tupla. En una subconsulta, slo se pueden
usar variables tupla que estn definidas en la propia subconsulta o en
cualquier consulta que contenga a dicha subconsulta. Si una variable tupla
esta definida tanto localmente (en una subconsulta) como globalmente (en
una consulta que contiene a la subconsulta) se aplica la definicin local.
select distinct S.nombre_cliente
from CUENTAHABIENTE as S
where not exists ( )
toma cada cliente y comprueba si el conjunto de todas las sucursales
en las que dicho cliente tiene cuenta,contiene al conjunto de todas las
sucursales de Veracruz
42 Bases de Datos
Test para Ausencia de tuplas Duplicadas
El constructor unique prueba si una subconsulta tiene tuplas
duplicadas en su resultado.
Encontrar todos los clientes que tienen una cuenta en la sucursal
Portales.
select T.nombre_cliente
from CUENTAHABIENTE as T
where unique (
select R.nombre_cliente
from CUENTA, CUENTAHABIENTE as R
where T.nombre_cliente = R.nombre_cliente and
R.num_cuenta= CUENTA.num_cuenta and
CUENTA.nombre_sucursal = Portales )

43 Bases de Datos
Ejemplo de Subconsulta
Encontrar todos los clientes que tienen al menos dos cuentas en la
sucursal Portales .
select distinct T.nombre_cliente
from CUENTAHABIENTE as T
where not unique (
select R.nombre_cliente
from CUENTA, CUENTAHABIENTE as R
where T.nombre_cliente = R.nombre_cliente and
R.num_cuenta= CUENTA.num_cuenta and
CUENTA.nombre_sucursal = Portales )
44 Bases de Datos
Relaciones Derivadas
SQL permite el uso de una expresin de subconsulta en la clasula
from.
Si se usa una expresin de este tipo se debe dar un nombre a la
relacin resultante y se pueden renombrar los atributos usando la
clusula as. Por ejemplo considerese la subconsulta:

(select nombre_sucursal, avg (saldo)
from CUENTA
group by nombre_sucursal )
as PROMEDIO_SUCURSAL ( nombre_sucursal, saldo_promedio )

Esta subconsulta produce una relacin consistente en los nombres de
todas las sucursales y sus correspondientes saldos promedio. Este
resultado recibe el nombre de PROMEDIO_SUCURSAL y contiene los
atributos nombre_sucursal y saldo_promedio.
45 Bases de Datos
Relaciones Derivadas
Obtener el saldo promedio de las cuentas de aquellas sucursales donde
dicho saldo promedio sea mayor a $1200.

select nombre_sucursal, saldo_promedio
from (select nombre_sucursal, avg (saldo)
from CUENTA
group by nombre_sucursal )
as PROMEDIO_SUCURSAL ( nombre_sucursal, saldo_promedio )
where saldo_promedio > 1200

Note que no es necesario el uso de la clasula having, puesto que la
relacin temporal PROMEDIO_SUCURSAL se calcula en la clasula from,
y los atributos de PROMEDIO_SUCURSAL pueden ser usados
directamente en la clasula where.

46 Bases de Datos
Clusula With
La clasula with provee una forma de definir una vista temporal
cuya definicin esta disponible en la consulta en cual la clasula with
ocurre.
Encontrar todas cuentas con el saldo maximo.

with max_saldo (valor ) as
select max (saldo)
from CUENTA
select num_cuenta
from CUENTA, max_saldo
where CUENTA.saldo = max_saldo.valor
47 Bases de Datos
Consultas complejas usando la clusula With
Encontrar todas las sucursales cuyos saldos totales son mayores que
el promedio de los saldos de todas las cuentas en todas sucursales.
with sucursal _total (nombre_sucursal, saldo_total ) as
select nombre_sucursal, sum (saldo)
from CUENTA
group by nombre_sucursal
with sucursal _total_avg (prom_ saldo_total) as
select avg (saldo_total )
from sucursal _total
select nombre_sucursal
from sucursal _total, sucursal _total_avg
where sucursal _total. saldo_total >=
sucursal _total_avg. prom_saldo_total
48 Bases de Datos
Vistas
En algunos casos, no es deseable para todos los usuarios ver el
modelo logico completo (esto es, todas las relaciones almacenadas en
la base de datos.)
Considere una persona que necesita conocer el nmero de prstamo
de un cliente pero no necesita ver el importe del prstamo. Esta
persona debe de ver una relacin descrita, en SQL, por

(select nombre_cliente, num_prestamo
from PRESTATARIO, PRESTAMO
where PRESTATARIO.Num_Prstamo =
PRSTAMO.Num_Prstamo)

Una vista provee un mecanismo para ocultar ciertos Datos de la
vista de ciertos usuarios.
Toda relacin que no es parte del modelo conceptual pero es hecha
visible para un usuario es una relacin virtual o una vista .
49 Bases de Datos
Definicin de Vista
Una vista es definida usando la declaracin create view y tiene
la forma:

create view v as < expresin de la consulta >

donde < expresin de la consulta > es cualquier expresin legal de
SQL. El nombre de la vista es representado por v.
Una vez que la vista es definida, el nombre de la vista puede ser
usado para referirse a la relacin virtual que la vista genera.
La definicin de la vista no es lo mismo que crear una nueva
relacin mediante la evaluacin de una expresin de una consulta
Ms bin, una definicin de una vista causa el
almacenamiento de una expression; la expresin es
substituida en las consultas usando la vista.
50 Bases de Datos
Consultas de Ejemplo
Una vista de las sucursales y todos sus clientes
Encontrar todos los clientes de la sucursal Portales
create view todos_los_clientes as
(select distinct nombre_sucursal, nombre_cliente
from CUENTAHABIENTE, CUENTA
where cuentahabiente.num_cuenta =
CUENTA.num_cuenta )
union
(select distinct nombre_sucursal, nombre_cliente
from PRESTATARIO, PRESTAMO
where PRESTATARIO.Num_Prstamo =
PRSTAMO.Num_Prstamo)
select nombre_cliente
from todos_los_clientes
where nombre_sucursal = Portales
51 Bases de Datos
Vistas definidas usando otras Vistas
Una vista puede ser usada en la expresin que definine otra vista.
Una vista v
1
se dice que depende directamente de una vista v
2
si v
2

es usada en la expresin que define v
1.

Una vista v
1
se dice que depende de la vista v
2
si v
1
depende
directamente de v
2
o hay una trayectoria de dependencias de v
1
a
v
2
.
Una vista v se dice que es recursiva si depende de ella misma.
52 Bases de Datos
Expansin de Vistas
Esta es una forma de definir el significado de vistas definidas en
terminos de otras vistas.
Sea una vista v
1
definida por una expresin e
1
que puede ella misma
contener vistas.
La expansin de una vista es una expresin que repite el siguiente
paso de remplazamiento:
repeat
Encontrar toda vista v
i
en e
1

Remplazar la vista v
i
por la expresin que definie v
i

until no exista una vista en e
1

Tan pronto la vista deje de ser recursive, el ciclo termina.

You might also like