8/6/2019 SQL_P2011
1/52
Database System Concepts, 5th Ed.
Silberschatz, Korth y Sudarshan
Traducido por Jorge Jimnez Glz.
SQLSQL
8/6/2019 SQL_P2011
2/52
2Bases de Datos
Chapter 3: SQLChapter 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
8/6/2019 SQL_P2011
3/52
3Bases de Datos
Lenguage de Definicin de DatosLenguage 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 lainformacin acerca de cada relacin, incluyendo:
8/6/2019 SQL_P2011
4/52
4Bases de Datos
Tipos de Dominios en SQLTipos 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 ncaracteres.
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 esdependiente de la mquina ).
numeric(p,d). Nmero de punto fijo, con precisin de p digits, con d dgitos a laderecha del punto decimal.
real, double precision. Nmeros de punto flotante, precisin simple y doble, conprecisin dependiente de la mquina.
float(n). Nmeros de punto flotante, con precisin de al menos n dgitos.
8/6/2019 SQL_P2011
5/52
5Bases de Datos
El comando Create TableEl comando Create Table
Una relacin SQL es definida usando el comando create table :create table r (A1 D1, A2D2, ..., An Dn,(restriccin de integridad1),...,(restriccin de integridadk))
r es el nombre de la relacin
Cada Aies un nombre de atributo en el esquema de la relacin r Dies 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)
8/6/2019 SQL_P2011
6/52
6Bases de Datos
Restricciones de Integridad en Create TableRestricciones de Integridad en Create Table
not null
primary key (A1, ..., An)
Ejemplo: Declarar nombre_sucursal como la llave primaria para sucursaly 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 declaracin primary key automaticamente asigna la restriccin notnull en el atributo en SQL-92, en SQL-89 se necesita declarar.
8/6/2019 SQL_P2011
7/52
7Bases de Datos
Declaraciones Drop y Alter TableDeclaraciones Drop y Alter Table
El comando drop table borra toda la informacin acerca de una relacin enla base de datos.
El comando alter table es usado para agregar atributos a una relacinexistente :
alter table r add A D
donde A es el nombre de el atributo que va a ser agregado a la relacin r y Des el dominio de A.
Null es asignado como valor para los nuevos atributos.
El comando alter tablepuede ser usado para borrar atributos de larelacin:
alter table r drop Adonde A es el nombre de un atributo de relacin r
El borrado de atributos no es soportado por muchas bases de datos
8/6/2019 SQL_P2011
8/52
8Bases de Datos
Estructura bsica de las ConsultasEstructura bsica de las Consultas
SQL esta basado en la teora de conjuntos y operadores relacionales conciertas mejoras y modificaciones.
Una consulta tpica en SQL tiene la forma:
select A1, A2, ..., Anfrom r1, r2, ..., rmwhere P
Airepresenta un atributo
Rirepresenta 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.
))(( 21,,, 21 mPAAA rrrn vvv -- W
8/6/2019 SQL_P2011
9/52
9Bases de Datos
La clasulaLa clasula selectselect
La clasula selectlista 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_sucursalfrom PRESTAMO
en el algebra relacional, el consulta puede ser:nombre_sucursal(PRESTAMO )
NOTA: En SQL los nombres pueden ser escrito con minsculas o maysculasindistintamente.
8/6/2019 SQL_P2011
10/52
10Bases de Datos
La clasulaLa clasula selectselect (Cont.)(Cont.)
SQL permite duplicados en las relaciones como en los resultados de unaconsulta.
Para forzar la eliminacin de duplicados, insertar la palabra clave distinctdespus de select.
Encontrar los nombres de todas las sucursales en la relacin PRESTAMO , yremover los duplicados
select distinct nombre_sucursalfrom PRESTAMO
La palabra clave all especifica que los duplicados no sern removidos.
select all nombre_sucursalfrom PRESTAMO
8/6/2019 SQL_P2011
11/52
11Bases de Datos
La clasulaLa clasula selectselect (Cont.)(Cont.)
Un asterisco en la clasula select denota todos los atributos
select *from PRESTAMO
La clasula select puede contener expresiones aritmeticas ( +, , , y / ), y estasoperan sobre constantes o atributos de las tuplas.
La consulta:
select num_prestamo , nombre_sucursal, importe 100from PRESTAMO
va a retornar una relacin que es la misma que la relacion PRESTAMO, exceptoque el valor del atributo importe es multiplicado por 100.
8/6/2019 SQL_P2011
12/52
12Bases de Datos
La clasulaLa clasula wherewhere
La clasula where especifica las condiciones que las filas (tuplas) resultantesdeben satisfacer
Corresponde a la operacin de seleccin del algebra relacional.
Para encontrar todos los prstamos hechos en la sucursal Portales con importesmayores a $1200.
select num_prestamofrom PRESTAMOwhere nombre_sucursal = Portales and importe > 1500
Varias comparaciones pueden ser combinadas usando los conectores lgicosand, or, y not.
Las comparaciones pueden ser aplicadas a los resultados de expresiones
aritmeticas.
8/6/2019 SQL_P2011
13/52
13Bases de Datos
La clasulaLa clasula wherewhere (Cont.)(Cont.)
SQL incluye el operador comparacin between
Ejemplo: Encontrar los prstamos cuyos importes esten entre $90,000 y $100,000(esto es, u $90,000 ye $100,000)
select num_prestamofrom PRESTAMOwhere importe between 90000 and 100000
8/6/2019 SQL_P2011
14/52
14Bases de Datos
LaLa clasulaclasula fromfrom
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 losclientes que tienen un prstamo en la sucursal Portales.
select nombre_cliente, PRESTATARIO.num_prestamo , importefrom PRESTATARIO, PRESTAMOwhere PRESTATARIO.num_prestamo =
PRESTAMO .num_prestamoand nombre_sucursal = Portales
8/6/2019 SQL_P2011
15/52
15Bases de Datos
La operacin de RenombradoLa 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 losclientes; renombrando la columna num_prestamo como id_prestamo .
select nombre_cliente, PRESTAMO.num_prestamo as id_prestamo , importefrom PRESTATARIO, PRESTAMOwhere PRESTATARIO.num_prestamo = PRESTAMO . id_prestamo
8/6/2019 SQL_P2011
16/52
16Bases de Datos
Variables TuplaVariables Tupla
Las variables tupla son definidas en la clasula from via el uso de la clasulaas.
Encontrar los nombres de los clientes y su nmero de prstamo para todos losclientes que tienen un prstamo en alguna sucursal.
select distinct T.nombre_sucursalfrom SUCURSAL as T, SUCURSAL as Swhere T.activos > S.activos AND S.ciudad_sucursal = Veracruz
Encontrar los nombres de todas las sucursales que tienen activos mayores alos alguna sucursal localizada en Veracruz.
select nombre_cliente, T.num_prestamo , S.importe
from PRESTATARIO as T, PRESTAMO as Swhere T.num_prestamo = S.num_prestamo
8/6/2019 SQL_P2011
17/52
17Bases de Datos
Operaciones con cadenasOperaciones con cadenas
SQL incluye un operador de coincidencia para comparaciones con cadenas decaracteres. El operador like usa patrones que son descritos usando doscaracteres 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_clientefrom clientewhere 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.
8/6/2019 SQL_P2011
18/52
18Bases de Datos
Ordenando la presentacin de las TuplasOrdenando la presentacin de las Tuplas
Listar en orden alfabetico los nombres de todos los clientes que tienen unprstamo en la sucursal Portales
select distinct nombre_clientefrom PRESTATARIO, PRESTAMOwhere PRESTATARIO.num_prestamo =PRESTAMO . num_prestamo
and nombre_sucursal = Portalesorder by nombre_cliente
Para cada atributo podemos especificardescpara ordenar descendentementeo ascpara ordenar ascendentemente, el orden ascendente es el default.
Ejemplo: order by nombre_cliente desc
8/6/2019 SQL_P2011
19/52
19Bases de Datos
DuplicadosDuplicados
En relaciones con duplicados, SQL puede definir cuantas copias de tuplasaparecern en el resultado .
Algunos operadores del algebra relacional tienen versiones Multiconjuntosdadas las relaciones multiconjunto r1 y r2:
1. WU (r1): Si hay c1 copias de la tupla t1 en r1, y t1 satisface la seleccionWU,,
entonces hay c1 copias de t1 en WU (r1).2. 4A (r ): para cada copia de la tupla t1 en r1, hay una copia de la tupla 4A
(t1)en 4A (r1) donde 4A (t1) denota la proyeccin de la tupla t1.
3. r1 x r2 : Si hay c1 copias de la tupla t1 en r1 y c2copias de tupla t2en r2,hay c1x c2copias de la tupla t1. t2en r1 x r2
8/6/2019 SQL_P2011
20/52
20Bases de Datos
Duplicados (Cont.)Duplicados (Cont.)
Ejemplo: Suponga que relaciones multiconjunto r1
(A, B) y r2 (C) son:
r1 = {(1, a) (2,a)} r2= {(2), (3), (3)}
entonces4B(r1) puede ser {(a), (a)}, mientras 4B(r1) x r2puede ser
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
Semntica de duplicados en SQL :
select A1,,A2, ..., Anfrom r1, r2, ..., rmwhere P
es equivalente a la versin multiconjunto de la expression:
))((21,,, 21 mPAAA
rrrn
vvv --
W
8/6/2019 SQL_P2011
21/52
21Bases de Datos
Operaciones sobre ConjuntosOperaciones sobre Conjuntos
Las operaciones sobre conjuntos union, intersect, yexceptoperan sobrerelaciones y corresponden a las operaciones del algebra relacional
Cada de estas operaciones automaticamente elimina los duplicados; pararetener todos los duplicados hay que usar las versiones multiconjuntoscorrespondientes union all, intersect allyexcept all.
Suponga que una tupla se repite m veces en r y n veces en s, entonces, serepite:
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
8/6/2019 SQL_P2011
22/52
22Bases de Datos
Operaciones sobre ConjuntosOperaciones 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 .
8/6/2019 SQL_P2011
23/52
8/6/2019 SQL_P2011
24/52
24Bases de Datos
Funciones de Agregacin (Cont.)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 CUENTAwhere nombre_sucursal = Portales
select count (*)from CLIENTE
select count (distinct nombre_cliente)from CUENTAHABIENTE
8/6/2019 SQL_P2011
25/52
25Bases de Datos
FuncionesFunciones dede AgregacinAgregacin Group ByGroup By
Encontrar el nmero de cuentahabientes para cada sucursal.
Nota: Los atributos en la clasula select fuera de las funciones de agregacin puedenaparecer en la lista group by
select nombre_sucursal, count (distinct nombre_cliente)from CUENTAHABIENTE, CUENTAwhere cuentahabiente.num_cuenta = cuenta.num_cuentagroup by nombre_sucursal
8/6/2019 SQL_P2011
26/52
26Bases de Datos
Funciones de Agregacin clasulaFunciones de Agregacin clasula HavingHaving
Encontrar los nombres de todas las sucursales dnde el saldo promedio desus cuentas es mayor a $1,200.
Nota: los predicados en la clasula having se aplican despus de laformacin de grupos mientras que los predicados en la
clasula where se aplican antes de formar los grupos
select nombre_sucursal, avg (saldo)from CUENTAgroup by nombre_sucursal
having avg (saldo) > 1200
8/6/2019 SQL_P2011
27/52
27Bases de Datos
Valores NulosValores Nulos
Las tuplas pueden tener un valor nulo, denotado por null, para alguno de susatributos
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 relacionPRESTAMO que tienen un valor nulo en su importe.
select num_prestamofrom PRESTAMOwhere 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 valoresnulos
8/6/2019 SQL_P2011
28/52
28Bases de Datos
Null Values y Three Valued LogicNull 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 esevaluado como desconocido
8/6/2019 SQL_P2011
29/52
29Bases de Datos
Valores nulos y Funciones de AgregacinValores 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 lastuplas con valores nulos sobre los atributos agregados.
8/6/2019 SQL_P2011
30/52
30Bases de Datos
Subconsultas AnidadasSubconsultas Anidadas
SQL provee un mecanismo para el anidamiento de subconsultas.
Una subconsulta es una expresin select-from-where que es anidada dentro deotra consulta.
Un uso comn de subconsultas es realizar tests para la pertenencia a unconjunto, comparaciones entre conjuntos y cardinalidad de conjuntos.
8/6/2019 SQL_P2011
31/52
31Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta y un prstamo en elbanco .
Encontrar todos los clientes que tienen un prstamo en el banco pero notienen una cuenta en el banco
select distinct nombre_clientefrom PRESTATARIOwhere nombre_cliente not in (select nombre_cliente
from CUENTAHABIENTE )
select distinct nombre_clientefrom PRESTATARIOwhere nombre_cliente in (select nombre_cliente
from CUENTAHABIENTE )
8/6/2019 SQL_P2011
32/52
32Bases de Datos
Ejemplo de SubconsultaEjemplo 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, activosfrom SUCURSALwhere activos = ( select max(activos)
from SUCURSAL )
8/6/2019 SQL_P2011
33/52
33Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta y un prstamo en lasucursal Portales
Nota: La consulta anterior puede ser escrita en una forma ms simple y slo semuestra as para ilustrar las caractersticas de SQL.
select distinct nombre_clientefrom PRESTATARIO, PRESTAMOwhere PRESTATARIO.Num_Prstamo = PRESTAMO .Num_Prstamo
and nombre_sucursal = Portalesand (nombre_sucursal, nombre_cliente ) in
(select nombre_sucursal, nombre_clientefrom CUENTAHABIENTE, CUENTAwhere cuentahabiente.num_cuenta =cuenta.num_cuenta )
8/6/2019 SQL_P2011
34/52
34Bases de Datos
Comparacin de ConjuntosComparacin de Conjuntos
Encontrar todas las sucursales que tienen activos mayores que los de algunasucursal localizada en Veracruz.
Encontrar las sucursales que tienen activos mayores que al menos unasucursal localizada en Veracruz.
select nombre_sucursal
from SUCURSALwhere activos > some
(select activosfrom SUCURSALwhere ciudad_sucursal = Veracruz)
select distinct T.nombre_sucursalfrom SUCURSAL as T, SUCURSAL as Swhere T.activos > S.activos
and S.ciudad_sucursal =
Veracruz
8/6/2019 SQL_P2011
35/52
35Bases de Datos
Definicin de la clasulaDefinicin de la clasula SomeSome
F some rtr tal que (F t )Dnde 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 relacin)
(5 < some
) = true(5 = some
(= some) | in
Sin embargo, ({ some) | not in
8/6/2019 SQL_P2011
36/52
36Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
Encontrar los nombres de todas las sucursales que tienen activos mayores quetodas las sucursales localizadas en Veracruz.
select nombre_sucursalfrom SUCURSALwhere activos > all
(select activosfrom SUCURSALwhere ciudad_sucursal = Veracruz)
8/6/2019 SQL_P2011
37/52
37Bases de Datos
Definicin de la clasulaDefinicin de la clasula allall
F all rtr (F t)
0
5
6
(5 < all ) = false
610
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
8/6/2019 SQL_P2011
38/52
38Bases de Datos
Test para Relaciones VaciasTest para Relaciones Vacias
SQL incluye la posibilidad de comprobar si una subconsulta no produce ningunatupla como resultado.
El constructor exists regresa el valor true si la subconsulta argumento no esvaca.
exists r r{
not exists r r =
Usando not exists se puede comprobar la inexistencia de tuplas en el resultadode una subconsulta.
Es posible usar not exists para simular la operacin de contencin de unconjunto (es decir superconjunto)
Se puede escribir La relacin A contiene a la relacin B como:
not exists (B except A)
8/6/2019 SQL_P2011
39/52
39Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
Encontrar todos los clientes que tienen una cuenta en todas las sucursaleslocalizadas en Veracruz.
select distinct S.nombre_clientefrom CUENTAHABIENTE as Swhere not exists (
(select nombre_sucursal
from SUCURSALwhere ciudad_sucursal = Veracruz)except(select R.nombre_sucursalfrom CUENTAHABIENTE as T, CUENTA as Rwhere 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
8/6/2019 SQL_P2011
40/52
40Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
En este ejemplo la subconsulta
(select nombre_sucursalfrom SUCURSALwhere ciudad_sucursal = Veracruz)
Por otro lado la subconsulta:
Obtiene todas las sucursales de Veracruz.
(select R.nombre_sucursalfrom CUENTAHABIENTE as T, CUENTA as Rwhere T.num_cuenta= R.num_cuentaand S.nombre_cliente = T.nombre_cliente ))
Obtiene todas las sucursales en las cuales el cliente S.nombre_cliente tiene unacuenta.
8/6/2019 SQL_P2011
41/52
41Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
Por ltimo el select ms externo:
En consultas que contengan subconsultas se aplica la regla de visibilidad paralas variables tupla. En una subconsulta, slo se pueden usar variables tupla queestn definidas en la propia subconsulta o en cualquier consulta que contenga adicha subconsulta. Si una variable tupla esta definida tanto localmente (en unasubconsulta) como globalmente (en una consulta que contiene a la subconsulta) seaplica la definicin local.
select distinct S.nombre_clientefrom CUENTAHABIENTE as Swhere not exists ( )
toma cada cliente y comprueba si el conjunto de todas las sucursales en las quedicho cliente tiene cuenta,contiene al conjunto de todas las sucursales deVeracruz
8/6/2019 SQL_P2011
42/52
42Bases de Datos
Test para Ausencia de tuplas DuplicadasTest para Ausencia de tuplas Duplicadas
El constructoruniqueprueba si una subconsulta tiene tuplas duplicadas ensu resultado.
Encontrar todos los clientes que tienen una cuenta en la sucursal Portales.
select T.nombre_clientefrom CUENTAHABIENTE as Twhere unique (
select R.nombre_clientefrom CUENTA, CUENTAHABIENTE as Rwhere T.nombre_cliente = R.nombre_cliente and
R.num_cuenta= CUENTA.num_cuenta andCUENTA.nombre_sucursal = Portales )
8/6/2019 SQL_P2011
43/52
43Bases de Datos
Ejemplo de SubconsultaEjemplo de Subconsulta
Encontrar todos los clientes que tienen al menos dos cuentas en la sucursal
Portales .
select distinct T.nombre_clientefrom CUENTAHABIENTE as Twhere not unique (
select R.nombre_clientefrom CUENTA, CUENTAHABIENTE as Rwhere T.nombre_cliente = R.nombre_cliente and
R.num_cuenta= CUENTA.num_cuenta andCUENTA.nombre_sucursal = Portales )
8/6/2019 SQL_P2011
44/52
44Bases de Datos
Relaciones DerivadasRelaciones 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 relacinresultante y se pueden renombrar los atributos usando la clusula as. Porejemplo considerese la subconsulta:
(select nombre_sucursal, avg (saldo)
from CUENTAgroup by nombre_sucursal )as PROMEDIO_SUCURSAL ( nombre_sucursal, saldo_promedio )
Esta subconsulta produce una relacin consistente en los nombres de todas lassucursales y sus correspondientes saldos promedio. Este resultado recibe elnombre de PROMEDIO_SUCURSAL y contiene los atributos nombre_sucursal ysaldo_promedio.
8/6/2019 SQL_P2011
45/52
45Bases de Datos
Relaciones DerivadasRelaciones Derivadas
Obtener el saldo promedio de las cuentas de aquellas sucursales donde dicho saldo
promedio sea mayor a $1200.
select nombre_sucursal, saldo_promediofrom (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 temporalPROMEDIO_SUCURSAL se calcula en la clasula from, y los atributos dePROMEDIO_SUCURSAL pueden ser usados directamente en la clasula where.
8/6/2019 SQL_P2011
46/52
8/6/2019 SQL_P2011
47/52
47Bases de Datos
Consultas complejas usando la clusulaConsultas complejas usando la clusula WithWith
Encontrar todas las sucursales cuyos saldos totales son mayores que elpromedio de los saldos de todas las cuentas en todas sucursales.
with sucursal _total (nombre_sucursal, saldo_total ) asselect nombre_sucursal, sum (saldo)from CUENTAgroup by nombre_sucursal
with sucursal _total_avg (prom_ saldo_total) asselect avg (saldo_total )from sucursal _total
select nombre_sucursalfrom sucursal _total, sucursal _total_avgwhere sucursal _total. saldo_total >=
sucursal _total_avg. prom_saldo_total
8/6/2019 SQL_P2011
48/52
48Bases de Datos
VistasVistas
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 veruna relacin descrita, en SQL, por
(select nombre_cliente, num_prestamo
from PRESTATARIO, PRESTAMOwhere PRESTATARIO.Num_Prstamo =PRSTAMO.Num_Prstamo)
Una vista provee un mecanismo para ocultar ciertos Datos de la vista deciertos usuarios.
Toda relacin que no es parte del modelo conceptual pero es hecha visible paraun usuario es una relacin virtual o una vista .
8/6/2019 SQL_P2011
49/52
49Bases de Datos
Definicin de VistaDefinicin 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. Elnombre 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 unaexpression; la expresin es substituida en las consultas usando lavista.
8/6/2019 SQL_P2011
50/52
50Bases de Datos
ConsultasConsultas dede EjemploEjemplo
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_clientefrom CUENTAHABIENTE, CUENTAwhere cuentahabiente.num_cuenta =
CUENTA.num_cuenta )
union(select distinct nombre_sucursal, nombre_clientefrom PRESTATARIO, PRESTAMOwhere PRESTATARIO.Num_Prstamo =PRSTAMO.Num_Prstamo)
select nombre_clientefrom todos_los_clienteswhere nombre_sucursal = Portales
8/6/2019 SQL_P2011
51/52
51Bases de Datos
VistasVistas definidasdefinidas usandousando otrasotras VistasVistas
Una vista puede ser usada en la expresin que definine otra vista.
Una vista v1 se dice que depende directamente de una vista v2 si v2es usadaen la expresin que define v1.
Una vista v1 se dice que depende de la vista v2 si v1 depende directamente dev2 o hay una trayectoria de dependencias de v1 a v2 .
Una vista v se dice que es recursiva si depende de ella misma.
8/6/2019 SQL_P2011
52/52
ExpansinExpansin de Vistasde Vistas
Esta es una forma de definir el significado de vistas definidas en terminos de
otras vistas. Sea una vista v1 definida por una expresin e1 que puede ella misma contener
vistas.
La expansin de una vista es una expresin que repite el siguiente paso deremplazamiento:
repeatEncontrar toda vista vien e1Remplazar la vista vipor la expresin que definie vi
until no exista una vista en e1 Tan pronto la vista deje de ser recursive, el ciclo termina.