Top Banner

of 52

SQL_P2011

Apr 07, 2018

Download

Documents

JORGE JIMENEZ
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 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.