Database System Concepts, 5th Ed.

©Silberschatz, Korth y Sudarshan
Traducido por Jorge Jiménez Glz.
SQL SQL
2 Bases de Datos
Chapter 3: SQL Chapter 3: SQL
Definición de Datos
Estructura Basica de Consultas
Operaciones de Conjuntos
Funciones de Agregación
Valores Nulos
Subconsultas Anidadas
Consultas Complejas
Vistas
Modificación de la Base de Datos
Combinación de Relationes
3 Bases de Datos
Lenguage de Definición de Datos Lenguage de Definición de Datos
El esquema para cada relación .
El dominio de valores asociado con cada atributo.
Restricciones de Integridad
El conjunto de indices definidos para cada relación.
La información de Seguridad y autorizaciones para cada relation.
La estructura de almacenamiento físico en disco de cada relación.
Permite la especificación de un conjunto de relaciones y de la
información acerca de cada relación, incluyendo:
4 Bases de Datos
Tipos de Dominios en SQL 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 máximo n
caracteres.
int. Entero (un subconjunto finito de los enteros que es dependiente de la máquina ).
smallint. Entero corto (un subconjunto finito del dominio de los enteros que es
dependiente de la máquina ).
numeric(p,d). Número de punto fijo, con precisión de p digits, con d dígitos a la
derecha del punto decimal.
real, double precision. Números de punto flotante, precisión simple y doble, con
precisión dependiente de la máquina.
float(n). Números de punto flotante, con precisión de al menos n dígitos.
5 Bases de Datos
El comando Create Table El comando Create Table
Una relación SQL es definida usando el comando create table :
create table r (A
1
D
1
, A
2
D
2
, ..., A
n
D
n
,
(restricción de integridad
1
),
...,
(restricción de integridad
k
))
r es el nombre de la relación
Cada A
i
es un nombre de atributo en el esquema de la relación 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 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_sucursalchar(15),
ciudad_sucursal char(30),
activos integer,
primary key (nombre_sucursal))
La declaración primary key automaticamente asigna la restricción not
null en el atributo en SQL-92, en SQL-89 se necesita declarar.
7 Bases de Datos
Declaraciones Drop y Alter Table Declaraciones Drop y Alter Table
El comando drop table borra toda la información acerca de una relación en
la base de datos.
El comando alter table es usado para agregar atributos a una relación
existente :
alter table r add A D
donde A es el nombre de el atributo que va a ser agregado a la relación 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
relación:
alter table r drop A
donde A es el nombre de un atributo de relación r
El borrado de atributos no es soportado por muchas bases de datos
8 Bases de Datos
Estructura básica de las Consultas Estructura básica de las Consultas
SQL esta basado en la teoría de conjuntos y operadores relacionales con
ciertas mejoras y modificaciones.
Una consulta típica en SQL tiene la forma:
select A
1
, A
2
, ..., A
n
fromr
1
, r
2
, ..., r
m
where P
A
i
representa un atributo
R
i
representa una relación
P es un predicado.
Esta consulta es equivalente a la expresión del álgebra relacional:
El resultado de una consulta SQL es una relación.
)) ( (
2 1 , , ,
2 1
m P A A A
r r r
n
v v v — -
-
W
9 Bases de Datos
La claúsula La claúsula select select
La claúsula select lista los atributos deseados en el resultado de una consulta
corresponde al operador de proyección de el algebra relacional
Ejemplo: encontrar los nombres de todas sucursales en el relación 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 minúsculas o mayúsculas
indistintamente.
10 Bases de Datos
La claúsula La claúsula select select (Cont.) (Cont.)
SQL permite duplicados en las relaciones como en los resultados de una
consulta.
Para forzar la eliminación de duplicados, insertar la palabra clave distinct
después de select.
Encontrar los nombres de todas las sucursales en la relación PRESTAMO , y
remover los duplicados
select distinct nombre_sucursal
from PRESTAMO
La palabra clave all especifica que los duplicados no serán removidos.
select all nombre_sucursal
from PRESTAMO
11 Bases de Datos
La claúsula La claúsula select select (Cont.) (Cont.)
Un asterisco en la claúsula select denota ³todos los atributos´
select *
from PRESTAMO
La claúsula 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 relación que es la misma que la relacion PRESTAMO, excepto
que el valor del atributo importe es multiplicado por 100.
12 Bases de Datos
La claúsula La claúsula where where
La claúsula where especifica las condiciones que las filas (tuplas) resultantes
deben satisfacer
Corresponde a la operación de selección del algebra relacional.
Para encontrar todos los préstamos 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 lógicos
and, or, y not.
Las comparaciones pueden ser aplicadas a los resultados de expresiones
aritmeticas.
13 Bases de Datos
La claúsula La claúsula where where (Cont.) (Cont.)
SQL incluye el operador comparación between
Ejemplo: Encontrar los préstamos cuyos importes esten entre $90,000 y $100,000
(esto es, u $90,000 y e $100,000)
select num_prestamo
from PRESTAMO
where importe between 90000 and 100000
14 Bases de Datos
La La claúsula claúsula from from
La claúsula fromlista las relaciones involucradas en la consulta
Corresponde a la operación de producto Cartesiano del algebra relacional.
Encontrar el producto Cartesiano PRESTATARIO X PRESTAMO
select
from PRESTATARIO, PRESTAMO
Encontrar el nombre, número de préstamo e importe del préstamo de todos los
clientes que tienen un préstamo 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 operación de Renombrado La operación de Renombrado
SQL permite renombrar relaciones y atributos usando la claúsula as :
nombre_anterior as nuevo-nombre
Encontrar el nombre, número de préstamo e importe del préstamo 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 Variables Tupla
Las variables tupla son definidas en la claúsula fromvia el uso de la claúsula
as.
Encontrar los nombres de los clientes y su número de préstamo para todos los
clientes que tienen un préstamo 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 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.
guión 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 mayúsculas a minúsculas (y vice versa)
determinar la longitud de una cadena, extraer subcadenas, etc.
18 Bases de Datos
Ordenando la presentación de las Tuplas Ordenando la presentación de las Tuplas
Listar en orden alfabetico los nombres de todos los clientes que tienen un
préstamo 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 Duplicados
En relaciones con duplicados, SQL puede definir cuantas copias de tuplas
aparecerán en el resultado .
Algunos operadores del algebra relacional tienen versiones Multiconjuntos±
dadas las relaciones multiconjunto r
1
y r
2
:
1. W
U
(r
1
): Si hay c
1
copias de la tupla t
1
en r
1
, y t
1
satisface la seleccion W
U
,
,
entonces hay c
1
copias de t
1
en W
U
(r
1
).
2. 4
A
(r ): para cada copia de la tupla t
1
en r
1
, hay una copia de la tupla 4
A
(t
1
) en 4
A
(r
1
) donde 4
A
(t
1
) denota la proyección 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.) 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 4
B
(r
1
) puede ser {(a), (a)}, mientras 4
B
(r
1
) x r
2
puede ser
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
Semántica de duplicados en SQL :
select A
1
,
,
A
2
, ..., A
n
from r
1
, r
2
, ..., r
m
where P
es equivalente a la versión multiconjunto de la expression:
)) ( (
2 1 , , ,
2 1
m P A A A
r r r
n
v v v — -
-
W
21 Bases de Datos
Operaciones sobre Conjuntos 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 Operaciones sobre Conjuntos
Encontrar todos los clientes que tienen un préstamo, una cuenta , o ambos :
(select nombre_cliente from CUENTAHABIENTE)
except
(select nombre_cliente fromPRESTATARIO)
(select nombre_cliente from CUENTAHABIENTE)
intersect
(select nombre_cliente fromPRESTATARIO)
Encontrar todos los clientes que tienen una cuenta pero no un préstamo.
(select nombre_cliente from CUENTAHABIENTE)
union
(select nombre_cliente fromPRESTATARIO)
Encontrar todos los clientes que tienen un préstamo y una cuenta .
23 Bases de Datos
Funciones de Agregación Funciones de Agregación
Estas funciones operas sobre el conjunto de valores de una columna
de una relación, y retornan un valor
avg: promedio
min: mínimo
max: máximo
sum: suma
count: número de elementos
24 Bases de Datos
Funciones de Agregación (Cont.) Funciones de Agregación (Cont.)
Encontrar el saldo promedio de las cuentas pertenecientes a la sucursal Portales .
Encontrar el número de cuentahabientes en el banco .
Encontrar el número de tuplas en la relación cliente.
select avg (saldo)
fromCUENTA
where nombre_sucursal = µPortales¶
select count (*)
from CLIENTE
select count (distinct nombre_cliente)
from CUENTAHABIENTE
25 Bases de Datos
Funciones Funciones de de Agregación Agregación ± ± Group By Group By
Encontrar el número de cuentahabientes para cada sucursal.
Nota: Los atributos en la claúsula select fuera de las funciones de agregación 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 Agregación claúsula Funciones de Agregación claúsula Having Having
Encontrar los nombres de todas las sucursales dónde el saldo promedio de
sus cuentas es mayor a $1,200.
Nota: los predicados en la claúsula having se aplican después de la
formación de grupos mientras que los predicados en la
claúsula where se aplican antes de formar los grupos
select nombre_sucursal, avg (saldo)
fromCUENTA
group by nombre_sucursal
having avg (saldo) > 1200
27 Bases de Datos
Valores Nulos 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 números de préstamo en la relacion
PRESTAMO que tienen un valor nulo en su importe.
select num_prestamo
fromPRESTAMO
where importe is null
el resultado de cualquier expresión aritmetica conteniendo null es null
Ejemplo: 5 + null retorna null
Sin embargo, las funciones de agregación simplemente ignoran los valores
nulos
28 Bases de Datos
Null Values y Three Valued Logic Null Values y Three Valued Logic
cualquier comparación 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 claúsula where es tratado como falso si P es
evaluado como desconocido
29 Bases de Datos
Valores nulos y Funciones de Agregación Valores nulos y Funciones de Agregación
Total de todos los importes de préstamo
select sum (importe )
fromPRESTAMO
La sentencia ignora los importes nulos.
El resultado es nulo si todos los importes son nulos.
Todas las operaciones de agregación, excepto count(*) ignoran las
tuplas con valores nulos sobre los atributos agregados.
30 Bases de Datos
Subconsultas Anidadas Subconsultas Anidadas
SQL provee un mecanismo para el anidamiento de subconsultas.
Una subconsulta es una expresión select-from-where que es anidada dentro de
otra consulta.
Un uso común 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 Ejemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta y un préstamo en el
banco .
Encontrar todos los clientes que tienen un préstamo 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
fromCUENTAHABIENTE )
32 Bases de Datos
Ejemplo de Subconsulta 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 Ejemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta y un préstamo en la
sucursal Portales
Nota: La consulta anterior puede ser escrita en una forma más simple y sólo se
muestra así para ilustrar las características de SQL.
select distinct nombre_cliente
from PRESTATARIO, PRESTAMO
where PRESTATARIO.Num_Préstamo = PRESTAMO .Num_Préstamo
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
Comparación de Conjuntos Comparación 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
fromSUCURSAL as T, SUCURSAL as S
where T.activos > S.activos
and S.ciudad_sucursal = ¶Veracruz·
35 Bases de Datos
Definición de la claúsula Definición de la claúsula Some Some
F <comp> some r  n t r tal que (F <comp> t )
Dónde <comp> pueden ser : ·, e, >, =, =
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 relación)
(5 < some
) = true (5 = some
(= some) | in
Sin embargo, (= some) | not in
36 Bases de Datos
Ejemplo de Subconsulta 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
fromSUCURSAL
where ciudad_sucursal = µVeracruz¶)
37 Bases de Datos
Definición de la claúsula Definición de la claúsula all all
F <comp> all r  V t 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 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
vacía.
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 operación de contención de un
conjunto (es decir superconjunto)
Se puede escribir ³La relación A contiene a la relación B´ como:
not exists (B except A)
39 Bases de Datos
Ejemplo de Subconsulta 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
fromCUENTAHABIENTE 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 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
fromCUENTAHABIENTE 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 Ejemplo de Subconsulta
Por último el select más externo:
En consultas que contengan subconsultas se aplica la regla de visibilidad para
las variables tupla. En una subconsulta, sólo se pueden usar variables tupla que
estén 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 definición 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 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
fromCUENTA, 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 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 Relaciones Derivadas
SQL permite el uso de una expresión de subconsulta en la claúsula from.
Si se usa una expresión de este tipo se debe dar un nombre a la relación
resultante y se pueden renombrar los atributos usando la cláusula as. Por
ejemplo considerese la subconsulta:
(select nombre_sucursal, avg (saldo)
fromCUENTA
group by nombre_sucursal )
as PROMEDIO_SUCURSAL ( nombre_sucursal, saldo_promedio )
Esta subconsulta produce una relación 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 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)
fromCUENTA
group by nombre_sucursal )
as PROMEDIO_SUCURSAL ( nombre_sucursal, saldo_promedio )
where saldo_promedio > 1200
Note que no es necesario el uso de la claúsula having, puesto que la relación temporal
PROMEDIO_SUCURSAL se calcula en la claúsula from, y los atributos de
PROMEDIO_SUCURSAL pueden ser usados directamente en la claúsula where.
46 Bases de Datos
Cláusula Cláusula With With
La claúsula with provee una forma de definir una vista temporal cuya
definición esta disponible en la consulta en cual la claúsula with ocurre.
Encontrar todas cuentas con el saldo maximo.
with max_saldo (valor ) as
select max (saldo)
fromCUENTA
select num_cuenta
from CUENTA, max_saldo
where CUENTA.saldo = max_saldo.valor
47 Bases de Datos
Consultas complejas usando la cláusula Consultas complejas usando la cláusula With 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)
fromCUENTA
group by nombre_sucursal
with sucursal _total_avg (prom_ saldo_total) as
select avg (saldo_total )
fromsucursal _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 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 número de préstamo de un
cliente pero no necesita ver el importe del préstamo. Esta persona debe de ver
una relación descrita, en SQL, por
(select nombre_cliente, num_prestamo
from PRESTATARIO, PRESTAMO
where PRESTATARIO.Num_Préstamo =
PRÉSTAMO.Num_Préstamo)
Una vista provee un mecanismo para ocultar ciertos Datos de la vista de
ciertos usuarios.
Toda relación que no es parte del modelo conceptual pero es hecha visible para
un usuario es una ³relación virtual´ o una vista .
49 Bases de Datos
Definición de Vista Definición de Vista
Una vista es definida usando la declaración create view y tiene la forma:
create view v as < expresión de la consulta >
donde < expresión de la consulta > es cualquier expresión 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 relación virtual que la vista genera.
La definición de la vista no es lo mismo que crear una nueva relación
mediante la evaluación de una expresión de una consulta
Más bién, una definición de una vista causa el almacenamiento de una
expression; la expresión es substituida en las consultas usando la
vista.
50 Bases de Datos
Consultas Consultas de de Ejemplo 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_Préstamo =
PRÉSTAMO.Num_Préstamo)
select nombre_cliente
from todos_los_clientes
where nombre_sucursal = ³Portales´
51 Bases de Datos
Vistas Vistas definidas definidas usando usando otras otras Vistas Vistas
Una vista puede ser usada en la expresión 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 expresión 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
Expansión Expansión de Vistas 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 expresión e
1
que puede ella misma contener
vistas.
La expansión de una vista es una expresión que repite el siguiente paso de
remplazamiento:
repeat
Encontrar toda vista v
i
en e
1
Remplazar la vista v
i
por la expresión que definie v
i
until no exista una vista en e
1
Tan pronto la vista deje de ser recursive, el ciclo termina.

Chapter 3: SQL 
Definición de Datos  Estructura Basica de Consultas  Operaciones de Conjuntos  Funciones de Agregación  Valores Nulos  Subconsultas Anidadas  Consultas Complejas  Vistas  Modificación de la Base de Datos  Combinación de Relationes

Bases de Datos

2

Lenguage de Definición de Datos
Permite la especificación de un conjunto de relaciones y de la información acerca de cada relación, incluyendo: 
El esquema para cada relación .  El dominio de valores asociado con cada atributo.  Restricciones de Integridad  El conjunto de indices definidos para cada relación.  La información de Seguridad y autorizaciones para cada relation.  La estructura de almacenamiento físico en disco de cada relación.

Bases de Datos

3

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 máximo n    

caracteres. int. Entero (un subconjunto finito de los enteros que es dependiente de la máquina ). smallint. Entero corto (un subconjunto finito del dominio de los enteros que es dependiente de la máquina ). numeric(p,d). Número de punto fijo, con precisión de p digits, con d dígitos a la derecha del punto decimal. real, double precision. Números de punto flotante, precisión simple y doble, con precisión dependiente de la máquina. 

float(n). Números de punto flotante, con precisión de al menos n dígitos.

Bases de Datos

4

El comando Create Table 
Una relación SQL es definida usando el comando create table : 

 

create table r (A1 D1, A2 D2, ..., An Dn, (restricción de integridad1), ..., (restricción de integridadk)) r es el nombre de la relación Cada Ai es un nombre de atributo en el esquema de la relación r Di es el tipo de dato de valores en el dominio del atributo Ai 

Ejemplo:

create table SUCURSAL (nombre_sucursal char(15) not null, ciudad_sucursal char(30), activos integer)

Bases de Datos

5

create table SUCURSAL (nombre_sucursalchar(15).Restricciones de Integridad en Create Table  not null  primary key (A1.. activos integer.. .. en SQL-89 se necesita declarar. Bases de Datos 6 . primary key (nombre_sucursal)) La declaración primary key automaticamente asigna la restricción not null en el atributo en SQL-92. An) Ejemplo: Declarar nombre_sucursal como la llave primaria para sucursal y asegurarse que los valores de activos sean no-negativos. ciudad_sucursal char(30).

Declaraciones Drop y Alter Table  El comando drop table borra toda la información acerca de una relación en la base de datos.  El comando alter table es usado para agregar atributos a una relación existente : alter table r add A D donde A es el nombre de el atributo que va a ser agregado a la relación r y D es el dominio de A. El comando alter table puede ser usado para borrar atributos de la relación: alter table r drop A donde A es el nombre de un atributo de relación r  El borrado de atributos no es soportado por muchas bases de datos Bases de Datos 7 .   Null es asignado como valor para los nuevos atributos.

A2.  Una consulta típica en SQL tiene la forma: select A1.... .  Esta consulta es equivalente a la expresión del álgebra relacional:  SQL esta basado en la teoría de conjuntos y operadores relacionales con — A . An from r1.A . rm where P  Ai representa un atributo  Ri representa una relación  P es un predicado.A (W P ( r1 v r2 v ..Estructura básica de las Consultas ciertas mejoras y modificaciones....v rm )) 1 2 n  El resultado de una consulta SQL es una relación. r2. . Bases de Datos 8 ..

Bases de Datos 9 .La claúsula select  La claúsula select lista los atributos deseados en el resultado de una consulta  corresponde al operador de proyección de el algebra relacional select nombre_sucursal from PRESTAMO  Ejemplo: encontrar los nombres de todas sucursales en el relación PRESTAMO :  en el algebra relacional. el consulta puede ser: —nombre_sucursal (PRESTAMO )  NOTA: En SQL los nombres pueden ser escrito con minúsculas o mayúsculas indistintamente.

select all nombre_sucursal from PRESTAMO Bases de Datos 10 .La claúsula select (Cont. y remover los duplicados select distinct nombre_sucursal from PRESTAMO  La palabra clave all especifica que los duplicados no serán removidos.  Para forzar la eliminación de duplicados. insertar la palabra clave distinct después de select.  Encontrar los nombres de todas las sucursales en la relación PRESTAMO .)  SQL permite duplicados en las relaciones como en los resultados de una consulta.

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

y not. aritmeticas.  Para encontrar todos los préstamos hechos en la sucursal Portales con importes mayores a $1200. or.  Las comparaciones pueden ser aplicadas a los resultados de expresiones Bases de Datos 12 .La claúsula where  La claúsula where especifica las condiciones que las filas (tuplas) resultantes deben satisfacer  Corresponde a la operación de selección del algebra relacional. select num_prestamo from PRESTAMO where nombre_sucursal = µ Portales¶ and importe > 1500  Varias comparaciones pueden ser combinadas usando los conectores lógicos and.

)  SQL incluye el operador comparación between  Ejemplo: Encontrar los préstamos cuyos importes esten entre $90.000 y $100.000) select num_prestamo from PRESTAMO where importe between 90000 and 100000 Bases de Datos 13 .000 (esto es.000 y e $100. u $90.La claúsula where (Cont.

importe from PRESTATARIO.num_prestamo = PRESTAMO .num_prestamo . PRESTATARIO. PRESTAMO where PRESTATARIO.La claúsula from  La claúsula from lista las relaciones involucradas en la consulta  Corresponde a la operación de producto Cartesiano del algebra relacional. número de préstamo e importe del préstamo de todos los clientes que tienen un préstamo en la sucursal Portales. PRESTAMO  Encontrar el nombre.  Encontrar el producto Cartesiano PRESTATARIO X PRESTAMO select  from PRESTATARIO. select nombre_cliente.num_prestamo and nombre_sucursal = µPortales¶ Bases de Datos 14 .

num_prestamo as id_prestamo . PRESTAMO where PRESTATARIO. id_prestamo importe Bases de Datos 15 . renombrando la columna num_prestamo como id_prestamo . from PRESTATARIO. número de préstamo e importe del préstamo de todos los clientes.La operación de Renombrado  SQL permite renombrar relaciones y atributos usando la claúsula as : nombre_anterior as nuevo-nombre  Encontrar el nombre. select nombre_cliente.num_prestamo = PRESTAMO . PRESTAMO.

activos > S.Variables Tupla  Las variables tupla son definidas en la claúsula from via el uso de la claúsula as. select nombre_cliente.num_prestamo .num_prestamo = S. S. select distinct T.importe from PRESTATARIO as T.  Encontrar los nombres de los clientes y su número de préstamo para todos los clientes que tienen un préstamo en alguna sucursal. SUCURSAL as S where T.activos AND S.num_prestamo  Encontrar los nombres de todas las sucursales que tienen activos mayores a los alguna sucursal localizada en Veracruz. PRESTAMO as S where T.ciudad_sucursal = µ Veracruz¶ Bases de Datos 16 .nombre_sucursal from SUCURSAL as T. T.

El caracter % representa cualquier subcadena. etc. El operador ³like´ usa patrones que son descritos usando dos caracteres especiales:   porcentaje (%). 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 mayúsculas a minúsculas (y vice versa) determinar la longitud de una cadena. extraer subcadenas. guión bajo (_).Operaciones con cadenas  SQL incluye un operador de coincidencia para comparaciones con cadenas de caracteres. El caracter _ representa cualquier caracter.  Encontrar los nombres de todos los clientes que su calle incluye la subcadena ³Central´. Bases de Datos 17 .

el orden ascendente es el default.num_prestamo = PRESTAMO .Ordenando la presentación de las Tuplas  Listar en orden alfabetico los nombres de todos los clientes que tienen un préstamo en la sucursal Portales select distinct nombre_cliente from PRESTATARIO. PRESTAMO where PRESTATARIO.  Ejemplo: order by nombre_cliente desc Bases de Datos 18 . num_prestamo and nombre_sucursal = ¶Portales· order by nombre_cliente  Para cada atributo podemos especificar desc para ordenar descendentemente o asc para ordenar ascendentemente.

Duplicados  En relaciones con duplicados. hay c1 x c2 copias de la tupla t1.. 3. hay una copia de la tupla 4A (t1) en 4A (r1) donde 4A (t1) denota la proyección de la tupla t1. entonces hay c1 copias de t1 en WU (r1).  Algunos operadores del algebra relacional tienen versiones Multiconjuntos± dadas las relaciones multiconjunto r1 y r2: 1. y t1 satisface la seleccion WU. t2 en r1 x r2 Bases de Datos 19 . r1 x r2 : Si hay c1 copias de la tupla t1 en r1 y c2 copias de tupla t2 en r2. WU (r1): Si hay c1 copias de la tupla t1 en r1. 4A (r ): para cada copia de la tupla t1 en r1. 2. SQL puede definir cuantas copias de tuplas aparecerán en el resultado .

(3). A2..v rm )) 1 2 n Bases de Datos 20 .3). a) (2. (a.3). mientras 4B(r1) x r2 puede ser {(a.. B) y r2 (C) son: r1 = {(1.Duplicados (Cont.2).a)} r2 = {(2). (a)}. (a. An from r1. (a. (a. (a. (3)}  entonces 4B(r1) puede ser {(a). ... rm where P es equivalente a la versión multiconjunto de la expression: — A ...3)}  Semántica de duplicados en SQL : select A1... .)  Ejemplo: Suponga que relaciones multiconjunto r1 (A.2).3).A . r2..A (W P (r1 v r2 v .

intersect.Operaciones sobre Conjuntos  Las operaciones sobre conjuntos union. Suponga que una tupla se repite m veces en r y n veces en s. intersect all y except all. entonces. m ± n) veces en r except all s Bases de Datos 21 . y except operan sobre  Cada de estas operaciones automaticamente elimina los duplicados.n) veces en r intersect all s max(0. se repite:    m + n veces en r union all s min(m. para relaciones y corresponden a las operaciones del algebra relacional Š‰ retener todos los duplicados hay que usar las versiones multiconjuntos correspondientes union all.

(select nombre_cliente from CUENTAHABIENTE) intersect (select nombre_cliente from PRESTATARIO)  Encontrar todos los clientes que tienen una cuenta pero no un préstamo. una cuenta . o ambos : (select nombre_cliente from CUENTAHABIENTE) union (select nombre_cliente from PRESTATARIO)  Encontrar todos los clientes que tienen un préstamo y una cuenta .Operaciones sobre Conjuntos  Encontrar todos los clientes que tienen un préstamo. (select nombre_cliente from CUENTAHABIENTE) except (select nombre_cliente from PRESTATARIO) Bases de Datos 22 .

Funciones de Agregación  Estas funciones operas sobre el conjunto de valores de una columna de una relación. y retornan un valor avg: promedio min: mínimo max: máximo sum: suma count: número de elementos Bases de Datos 23 .

select count (distinct nombre_cliente) from CUENTAHABIENTE Bases de Datos 24 . select avg (saldo) from CUENTA where nombre_sucursal = µPortales¶  Encontrar el número de tuplas en la relación cliente.Funciones de Agregación (Cont. select count (*) from CLIENTE  Encontrar el número de cuentahabientes en el banco .)  Encontrar el saldo promedio de las cuentas pertenecientes a la sucursal Portales .

select nombre_sucursal. CUENTA where cuentahabiente.num_cuenta group by nombre_sucursal Nota: Los atributos en la claúsula select fuera de las funciones de agregación pueden aparecer en la lista group by Bases de Datos 25 .num_cuenta = cuenta. count (distinct nombre_cliente) from CUENTAHABIENTE.Funciones de Agregación ± Group By  Encontrar el número de cuentahabientes para cada sucursal.

select nombre_sucursal.Funciones de Agregación claúsula Having  Encontrar los nombres de todas las sucursales dónde el saldo promedio de sus cuentas es mayor a $1. avg (saldo) from CUENTA group by nombre_sucursal having avg (saldo) > 1200 Nota: los predicados en la claúsula having se aplican después de la formación de grupos mientras que los predicados en la claúsula where se aplican antes de formar los grupos Bases de Datos 26 .200.

Valores Nulos  Las tuplas pueden tener un valor nulo. denotado por null.  Ejemplo: Encontrar todos los números de préstamo en la relacion PRESTAMO que tienen un valor nulo en su importe. las funciones de agregación simplemente ignoran los valores nulos Bases de Datos 27 . 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. select num_prestamo from PRESTAMO where importe is null  el resultado de cualquier expresión aritmetica conteniendo null es null  Ejemplo: 5 + null retorna null  Sin embargo.

(falso y desconocido ) = falso .Null Values y Three Valued Logic  cualquier comparación 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 . (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 claúsula where es tratado como falso si P es evaluado como desconocido Bases de Datos 28 .

Bases de Datos 29 . El resultado es nulo si todos los importes son nulos.  Todas las operaciones de agregación.Valores nulos y Funciones de Agregación  Total de todos los importes de préstamo select sum (importe ) from PRESTAMO   La sentencia ignora los importes nulos. excepto count(*) ignoran las tuplas con valores nulos sobre los atributos agregados.

Subconsultas Anidadas  SQL provee un mecanismo para el anidamiento de subconsultas.  Un uso común de subconsultas es realizar tests para la pertenencia a un conjunto. Bases de Datos 30 .  Una subconsulta es una expresión select-from-where que es anidada dentro de otra consulta. comparaciones entre conjuntos y cardinalidad de conjuntos.

Ejemplo de Subconsulta  Encontrar todos los clientes que tienen una cuenta y un préstamo en el banco . select distinct nombre_cliente from PRESTATARIO where nombre_cliente in (select nombre_cliente from CUENTAHABIENTE )  Encontrar todos los clientes que tienen un préstamo 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 ) Bases de Datos 31 .

ciudad_sucursal) Bases de Datos 32 . activos from SUCURSAL as S where activos = ( select max(T. select ciudad_sucursal. activos from SUCURSAL where activos = ( select max(activos) from SUCURSAL )  Encontrar para cada ciudad la sucursal que tiene el activo mayor. ciudad_sucursal.ciudad_sucursal = T.activos) from SUCURSAL as T where S. select nombre_sucursal. nombre_sucursal.Ejemplo de Subconsulta  Encontrar la sucursal (y su ciudad) que tiene el mayor de los activos .

Bases de Datos 33 . CUENTA where cuentahabiente.num_cuenta = cuenta.Ejemplo de Subconsulta  Encontrar todos los clientes que tienen una cuenta y un préstamo en la sucursal Portales select distinct nombre_cliente from PRESTATARIO. PRESTAMO where PRESTATARIO.Num_Préstamo = PRESTAMO . nombre_cliente from CUENTAHABIENTE.Num_Préstamo and nombre_sucursal = µPortales¶ and (nombre_sucursal. nombre_cliente ) in (select nombre_sucursal.num_cuenta )  Nota: La consulta anterior puede ser escrita en una forma más simple y sólo se muestra así para ilustrar las características de SQL.

SUCURSAL as S where T. select nombre_sucursal from SUCURSAL where activos > some (select activos from SUCURSAL where ciudad_sucursal = ¶Veracruz·) Bases de Datos 34 .nombre_sucursal from SUCURSAL as T.activos > S.ciudad_sucursal = ¶Veracruz·  Encontrar las sucursales que tienen activos mayores que al menos una sucursal localizada en Veracruz.Comparación de Conjuntos  Encontrar todas las sucursales que tienen activos mayores que los de alguna sucursal localizada en Veracruz. select distinct T.activos and S.

Definición de la claúsula Some  F <comp> some r t r tal que (F <comp> t ) Dónde <comp> pueden ser :  e " ! { (5 < some 0 5 6 0 5 0 5 0 5 ) = true (se lee: 5 < alguna tupla en la relación) (5 < some (5 = some ) = false ) = true (5 { some ) = true (puesto que 0 { 5) (= some) | in Sin embargo. ({ some) | not in Bases de Datos 35 .

select nombre_sucursal from SUCURSAL where activos > all (select activos from SUCURSAL where ciudad_sucursal = µVeracruz¶) Bases de Datos 36 .Ejemplo de Subconsulta  Encontrar los nombres de todas las sucursales que tienen activos mayores que todas las sucursales localizadas en Veracruz.

(= all) | in Bases de Datos 37 .Definición de la claúsula all  F <comp> all r t r (F <comp> t) (5 < all 0 5 6 6 10 4 5 4 6 ) = false (5 < all (5 = all ) = true ) = false (5 { all ) = true (puesto que 5 { 4 y 5 { 6) ({ all) | not in Sin embargo.

 Es posible usar not exists para simular la operación de contención de un conjunto (es decir superconjunto)  Se puede escribir ³La relación A contiene a la relación B´ como:  not exists (B except A) Bases de Datos 38 .  El constructor exists regresa el valor true si la subconsulta argumento no es  exists r  r { Ø  not exists r  r = Ø  Usando not exists se puede comprobar la inexistencia de tuplas en el resultado de una subconsulta.Test para Relaciones Vacias  SQL incluye la posibilidad de comprobar si una subconsulta no produce ninguna tupla como resultado. vacía.

num_cuenta and S.Ejemplo de Subconsulta  Encontrar todos los clientes que tienen una cuenta en todas las sucursales localizadas en Veracruz. CUENTA as R where T.nombre_cliente ))  Note que X ± Y = Ø  X Y  Nota: No se puede escribir esta consulta usando = all y sus variantes Bases de Datos 39 .num_cuenta= R.nombre_sucursal from CUENTAHABIENTE as T. 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_cliente = T.

Ejemplo de Subconsulta  En este ejemplo la subconsulta (select nombre_sucursal from SUCURSAL where ciudad_sucursal = µVeracruz¶) Obtiene todas las sucursales de Veracruz.nombre_sucursal from CUENTAHABIENTE as T. CUENTA as R where T.nombre_cliente = T.nombre_cliente tiene una cuenta.num_cuenta= R.nombre_cliente )) Obtiene todas las sucursales en las cuales el cliente S.  Por otro lado la subconsulta: (select R. Bases de Datos 40 .num_cuenta and S.

contiene al conjunto de todas las sucursales de Veracruz  En consultas que contengan subconsultas se aplica la regla de visibilidad para las variables tupla.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. En una subconsulta. sólo se pueden usar variables tupla que estén 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 definición local. Bases de Datos 41 .Ejemplo de Subconsulta  Por último el select más externo: select distinct S.

nombre_cliente from CUENTA.num_cuenta= CUENTA.  Encontrar todos los clientes que tienen una cuenta en la sucursal Portales. CUENTAHABIENTE as R where T.nombre_cliente from CUENTAHABIENTE as T where unique ( select R.nombre_cliente = R.nombre_sucursal = µ Portales¶ ) Bases de Datos 42 .Test para Ausencia de tuplas Duplicadas  El constructor unique prueba si una subconsulta tiene tuplas duplicadas en su resultado. select T.nombre_cliente and R.num_cuenta and CUENTA.

num_cuenta and CUENTA.nombre_sucursal = ¶Portales ·) Bases de Datos 43 .nombre_cliente and R.nombre_cliente from CUENTA.nombre_cliente = R.Ejemplo de Subconsulta  Encontrar todos los clientes que tienen al menos dos cuentas en la sucursal Portales . select distinct T.num_cuenta= CUENTA.nombre_cliente from CUENTAHABIENTE as T where not unique ( select R. CUENTAHABIENTE as R where T.

Por ejemplo considerese la subconsulta: (select nombre_sucursal.  Si se usa una expresión de este tipo se debe dar un nombre a la relación resultante y se pueden renombrar los atributos usando la cláusula as. Bases de Datos 44 . Este resultado recibe el nombre de PROMEDIO_SUCURSAL y contiene los atributos nombre_sucursal y saldo_promedio. saldo_promedio ) Esta subconsulta produce una relación consistente en los nombres de todas las sucursales y sus correspondientes saldos promedio. avg (saldo) from CUENTA group by nombre_sucursal ) as PROMEDIO_SUCURSAL ( nombre_sucursal.Relaciones Derivadas  SQL permite el uso de una expresión de subconsulta en la claúsula from.

Bases de Datos 45 . saldo_promedio ) where saldo_promedio > 1200 Note que no es necesario el uso de la claúsula having. select nombre_sucursal. saldo_promedio from (select nombre_sucursal. puesto que la relación temporal PROMEDIO_SUCURSAL se calcula en la claúsula from.Relaciones Derivadas  Obtener el saldo promedio de las cuentas de aquellas sucursales donde dicho saldo promedio sea mayor a $1200. avg (saldo) from CUENTA group by nombre_sucursal ) as PROMEDIO_SUCURSAL ( nombre_sucursal. y los atributos de PROMEDIO_SUCURSAL pueden ser usados directamente en la claúsula where.

definición esta disponible en la consulta en cual la claúsula with ocurre. max_saldo where CUENTA.valor Bases de Datos 46 .Cláusula With  La claúsula with provee una forma de definir una vista temporal cuya  Encontrar todas cuentas con el saldo maximo. with max_saldo (valor ) as select max (saldo) from CUENTA select num_cuenta from CUENTA.saldo = max_saldo.

with sucursal _total (nombre_sucursal.Consultas complejas usando la cláusula With  Encontrar todas las sucursales cuyos saldos totales son mayores que el promedio de los saldos de todas las cuentas en todas sucursales. sucursal _total_avg where sucursal _total. saldo_total >= sucursal _total_avg. 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. prom_saldo_total Bases de Datos 47 .

todas las relaciones almacenadas en la base de datos.)  Considere una persona que necesita conocer el número de préstamo de un cliente pero no necesita ver el importe del préstamo.  Toda relación que no es parte del modelo conceptual pero es hecha visible para un usuario es una ³relación virtual´ o una vista . PRESTAMO where PRESTATARIO.Num_Préstamo = PRÉSTAMO. no es deseable para todos los usuarios ver el modelo logico ciertos usuarios. Bases de Datos 48 . en SQL. Esta persona debe de ver una relación descrita.Vistas completo (esto es. num_prestamo from PRESTATARIO.Num_Préstamo)  Una vista provee un mecanismo para ocultar ciertos Datos de la vista de  En algunos casos. por (select nombre_cliente.

el nombre de la vista puede ser usado para referirse a la relación virtual que la vista genera. la expresión es substituida en las consultas usando la vista. El nombre de la vista es representado por v.  La definición de la vista no es lo mismo que crear una nueva relación mediante la evaluación de una expresión de una consulta  Más bién.Definición de Vista  Una vista es definida usando la declaración create view y tiene la forma: create view v as < expresión de la consulta > donde < expresión de la consulta > es cualquier expresión legal de SQL. una definición de una vista causa el almacenamiento de una expression. Bases de Datos 49 .  Una vez que la vista es definida.

num_cuenta ) union (select distinct nombre_sucursal. nombre_cliente from PRESTATARIO. nombre_cliente from CUENTAHABIENTE. CUENTA where cuentahabiente.Num_Préstamo)  Encontrar todos los clientes de la sucursal Portales select nombre_cliente from todos_los_clientes where nombre_sucursal = ³Portales´ Bases de Datos 50 . PRESTAMO where PRESTATARIO.num_cuenta = CUENTA.Num_Préstamo = PRÉSTAMO.Consultas de Ejemplo  Una vista de las sucursales y todos sus clientes create view todos_los_clientes as (select distinct nombre_sucursal.

 Una vista v1 se dice que depende directamente de una vista v2 si v2 es usada en la expresión que define v1.  Una vista v se dice que es recursiva si depende de ella misma.Vistas definidas usando otras Vistas  Una vista puede ser usada en la expresión que definine otra vista.  Una vista v1 se dice que depende de la vista v2 si v1 depende directamente de v2 o hay una trayectoria de dependencias de v1 a v2 . Bases de Datos 51 .

 Sea una vista v1 definida por una expresión e1 que puede ella misma contener  La expansión de una vista es una expresión que repite el siguiente paso de remplazamiento: repeat Encontrar toda vista vi en e1 Remplazar la vista vi por la expresión que definie vi until no exista una vista en e1  Tan pronto la vista deje de ser recursive. Bases de Datos 52 . el ciclo termina. vistas.Expansión de Vistas  Esta es una forma de definir el significado de vistas definidas en terminos de otras vistas.

Sign up to vote on this title
UsefulNot useful