3_BaseDat2

Embed Size (px)

DESCRIPTION

Integridad Referencial, Consultas con SQL, Operaciones de Reunión, Operaciones de Conjuntos (Unión, Intersección, Diferencia de Conjuntos, Pertenencia a Conjuntos)

Citation preview

  • 7/17/2019 3_BaseDat2

    1/15

    Apuntes de Bases de Datos 2 15/09/15

    Integridad referencial

    La integridad referencial es una propiedad deseable en las bases de datos. Gracias a la integridadreferencial se garantiza que una entidad fila o registro! sie"pre se relacione con otras entidades#$lidas% es decir% que e&isten en la base de datos. '"plica que en todo "o"ento dic(os datos seancorrectos% sin repeticiones innecesarias% ni datos perdidos ni relaciones "al resueltas .)odas las bases de datos relacionales gozan de esta propiedad gracias a que el soft*are gestor

    de base de datos #ela por su cu"pli"iento.

    Cmo funciona+uponga"os una base de datos con las entidades ,-+A A3)4A. )oda facturacorresponde a una sola"ente una persona. '"plica que en todo "o"ento dic(os datos seancorrectos% sin repeticiones innecesarias% datos perdidos relaciones "al resueltas.+uponga"os que una persona se identifica por su atributo 34, 3la#e nica de egistro de,oblacional!. )a"bi6n tendr$ otros atributos co"o el no"bre la direcci7n. La entidad A3)4Adebe tener un atributo 34,8cliente que identifique a qui6n pertenece la factura.,or sentido co"n es e#idente que todo #alor de 34,8cliente debe corresponder con algn#alor e&istente del atributo 34, de la entidad ,-+A. -sta es la idea intuiti#a de la integridad

    referencial.

    La integridad referencial en juego3uando se crea una nue#a instancia de A3)4A% la integridad referencial e&ige que el atributo34,8cliente coincida con el atributo 34, de alguna instancia de la entidad ,-+A. -ncaso contrario% no se per"ite la operaci7n.3uando se intenta eli"inar una instancia de ,-+A% la integridad referencial e&ige que noe&ista ninguna factura asociada% es decir% se co"prueba que no e&iste ninguna instancia deA3)4A cuo atributo 34,8cliente coincida con el atributo 34, de la instancia a borrar. -ncaso contrario% no se per"ite la operaci7n.

    -&isten tres tipos de integridad referencial: 'ntegridad referencial d6bil: si en una tupla de todos los #alores de los atributos de ;

    tienen un #alor que no es el nulo% entonces debe e&istir una tupla en + que to"e esos"is"os #alores en los atributos de

  • 7/17/2019 3_BaseDat2

    2/15

    Apuntes de Bases de Datos 2 15/09/15

    ,er"ite la entrada de #alores nulossal#o que se establezca a la #ez una restricci7n) 4LL.

    Basta con que una de las celdas to"e para el #alor nulo para que se considere que secu"ple la restricci7n de unicidad.

    Las co"posite unique Ce s7lo se pueden crear a ni#el de tabla. +i deseo que una colu"na o un con?unto de ellas dos o "$s colu"nas! identifiquen de

    "anera nica a cada fila registro!% usa"os PRIMAR !E.'dentifica un@#oca"ente cada fila de la tabla ,'EAF ;-F i"plica ot ull 4nique 'gual que para 4'>4-% e&isten pri"ar Ce co"posite pri"ar Ce for"adas por

    "$s de una colu"na!. stas segundas se definen a ni#el de tabla. +i quere"os garantizar que los #alores a introducir en una colu"na tengan un for"ato en

    particular o que est6n dentro de un rango de #alores per"itido% pode"os usar C"EC!.-specifica una condici7n que debe ser cierta

    +i quere"os que la infor"aci7n de una tabla tabla (i?a! (aga referencia est6 ligada o

    #erificada! (acia otra tabla de orden superior tabla padre!% usa"os #OREI$N !E.-stablece obliga a que se cu"pla una restricci7n de integridad entre

    una colu"na en una tabla (i?a! otra colu"na de la tabla referenciada tabla padre! -l #alor de la cla#e a?ena debe coincidir con un #alor e&istente en la tabla referenciada

    parent table! o ser nulo. Las cla#es a?enas son pura"ente l7gicas est$n basadas en #alores de datos! por

    tanto no son punteros f@sicos. Las co"posite foreign Ce est$n for"adas por "$s de una colu"na deben ser

    definidas a ni#el de tabla.

    ,or colu"na% se refieren a una nica colu"na se definen dentro de la especificaci7n de la propiacolu"na. ,uede ser de cualquiera de los tipos de restricciones de integridad indicados en elapartado anterior.+inta&is a ni#el de colu"na: H3+)A') Ino"breJK Itipo de restricci7nJ

    ,or tabla% se refieren a una o a #arias colu"nas se definen de for"a separada a las definicionesde las colu"nas. ,ueden ser de cualquier tipo de restricci7n sal#o ) 4LL.+inta&is a ni#el de tabla: H3+)A') Ino"breJK Itipo de restricci7nJ Icolu"naJH%K!-n a"bos casos:

    Ino"breJ o"bre de la restricci7n.Itipo de restricci7nJ 4no de los 5 tipos de restricciones de integridad per"itidas.Icolu"naJ o"bre de colu"na

    -?e"plos3-A)- )ABL- -"pleados no"bre A3MA220! NOT NULL% ec(a8alta DA)- 3+)A') fec(a8obli NOT NULL% !

    3-A)- )ABL- -"pleados apellidos A3MA2N0! ) 4LL%

    alent@n Belisario Do"@nguez era 2

  • 7/17/2019 3_BaseDat2

    3/15

    Apuntes de Bases de Datos 2 15/09/15

    no"bre A3MA220!% e"ail A3MA225! UNIQUE% 3+)A') apel8no"8unico UNIQUEapellidos% no"bre!

    3-A)- )ABL- Deptos nu" 4EB-N!% no"bre A3MA2O0! ) 4LL% 3+)A') dep8pC PRIMAR !Enu"! !

    3-A)- )ABL- -"pleados dep 4EB-N! 3+)A') e"p8dep8fC #OREI$N !Edep! ---3-+ Deptos nu"! !

    ACTI%I&A&'. bser#e detenida"ente el siguiente "odelo conteste las preguntas que #ienen"$s adelante. Luego% en su cuaderno% (aga una representaci7n de posible infor"aci7n que podr@acontener este "odelo. )o"e en cuenta las restricciones. i"positor es un depositante o a(orrador!.

    create tablecliente (nombre-cliente char(20), calle-cliente char(30),ciudad-cliente char(30), constraint client_pkprimary key(nombre-cliente))

    create tablesucursal (nombre-sucursal char(30), ciudad-sucursalchar(30), activo integer, constraint sucursal_pkprimary key(nombre-sucursal), constraint sucursal_activo_check check(activo >= 100000))

    create tablecuenta (numero-cuenta integer, nombre-sucursal char(30),nombre-cli char(20), saldo integer, constraint cuenta_pkprimary key(numero-cuenta), constraint cta_nombre_cli_k foreign key(nombre-cli)reerences cliente(nombre-cliente), constraint cta_nom_sucursal_kforeign key(nombre-sucursal) referencessucursal(nombre-sucursal),constraint cuenta_saldo_check check(saldo >= !00))

    create tableimpositor (nombre-cliente char(20), numero-cuenta integer,constraint impositor_pkprimary key(nombre-cliente, numero-cuenta),constraint impositor_nom_cli_k foreign key(nombre-cliente) referencescliente(nombre_cliente), constraint impositor_num_cta_k foreign key(numero-cuenta) referencescuenta(numero-cuenta))

    P3u$les atributos son lla#e pri"aria en cada tablaQ )abla Lla#e pri"aria )abla Lla#e pri"aria )abla Lla#e pri"aria

    )abla Lla#e pri"aria )abla Lla#e pri"ariaP3u$les atributos son las lla#es for$neas qu6 tablas se est$n asociandoQ indique pri"ero a latabla padre luego a la tabla (i?a! Lla#e for$nea: )abla padre )abla (i?a Lla#e for$nea: )abla padre )abla (i?a Lla#e for$nea: )abla padre )abla (i?a Lla#e for$nea: )abla padre )abla (i?a

    alent@n Belisario Do"@nguez era O

  • 7/17/2019 3_BaseDat2

    4/15

    Apuntes de Bases de Datos 2 15/09/15

    -scriba las restricciones constraints! de #erificaci7n de condici7n del "odelo anterior unadescripci7n de su prop7sito estricci7n: ,rop7sito: estricci7n: ,rop7sito:

    ACTI%I&A&(: 4tilice el "odelo anterior para que lo introduzca en ,ostgre+>L. +e le ad#ierte queel postgre+>L no ad"ite que los no"bres de las colu"nas tengan gui7n "edio% as@ que

    sustitalos por gui7n ba?o en todo el "odelo. tra ad#ertencia es que los no"bre tanto de tablasco"o de colu"nas deben estar en "insculas% de otra for"a% cuando (aga las sentencias de +>Lle "arcar$ error a sea en tablas o en colu"nas% donde tenga letras "asculas. +i introduce elc7digo% no ol#ide ter"inar las sentencias con punto co"a.'ntroduzca los siguientes #aloresen la base de datos

    3uando se #iola una restricci7n de integridad referencial% el procedi"iento nor"al es rec(azar laacci7n que pro#oc7 la #iolaci7n. +in e"bargo% la cl$usula foreign Ce puede especificar que% si unaacci7n de borrado D-L-)-! o de actualizaci7n 4,DA)-! de la relaci7n a la que (ace referencia#iola la restricci7n% en lugar de rec(azar la acci7n% (a que adoptar "edidas para "odiRcar la tuplade la relaci7n que (ace la referencia con ob?eto de restaurar la restricci7n. 3onsid6rese la

    siguiente deRnici7n

    create ta)lecuenta foreign Ce no"bre8sucursal! reference*sucursalno"bre8sucursal! on delete ca*cade% on u+date ca*cade% !

    Debido a la cl$usula on delete ca*cadeasociada con la declaraci7n de la cla#e e&terna for$nea!%si un borrado de una tupla de sucursal da lugar a que se #iole la restricci7n de integridadreferencial% el siste"a no rec(aza el borrado. -n su lugar% el borrado se realiza en ScascadaT en larelaci7n cuenta% borrando la tupla que (ace referencia a la sucursal que se borr7. De "odoparecido% no se rec(aza la actualizaci7n de un ca"po al que (aga referencia la restricci7n si #iolaesta= en #ez de eso% el ca"po no"breUsucursal de las tuplas que realizan la referencia de cuenta

    se actualizan ta"bi6n al nue#o #alor. +>L ta"bi6n per"ite que la cl$usula foreign Ce especiRqueuna acci7n diferente a cascade si se #iola la restricci7n: el ca"po que (ace la referencia en estecaso% no"breUsucursal! se puede establecer en nulo o darle un #alor predeter"inado para eldo"inio usando set default!.

    ,re-e recordatorio de con*ulta*

    La estructura b$sicade una e&presi7n +>L consiste en tres cl$usulas: select% fro" *(ere. La cl$usula selectcorresponde a la operaci7n proecci7ndel $lgebra relacional. +e usa

    para listar los atributos deseados del resultado de una consulta. La cl$usula fro"corresponde a la operaci7n producto cartesianodel $lgebra relacional.

    Lista las relaciones que deben ser analizadas en la e#aluaci7n de la e&presi7n. La cl$usula *(erecorresponde al predicado selecci7ndel $lgebra relacional. -s un

    predicado que engloba a los atributos de las relaciones que aparecen en la cl$usula fro".

    +>L for"a el producto cartesianode las relaciones incluidas en la cl$usula fro"% lle#a a cabo laselecci7ndel $lgebra relacional usando el predicado de la cl$usula *(ere entonces proecta elresultadosobre los atributos de la cl$usula select. -n la pr$ctica% +>L puede con#ertir la e&presi7nen una for"a equi#alente que puede ser procesada "$s eRciente"ente.

    alent@n Belisario Do"@nguez era N

    http://var/www/apps/conversion/tmp/scratch_2/actividad%204.odshttp://var/www/apps/conversion/tmp/scratch_2/actividad%204.ods
  • 7/17/2019 3_BaseDat2

    5/15

    Apuntes de Bases de Datos 2 15/09/15

    ,uede generalizarse que una consulta tiene el for"ato siguiente: selectcolumnas a visuali"ar fromtabla (real o producto cartesiano)wherecondici#n o condiciones $ue deben cumplir algunas columnas

    -l resultado de una consulta+>L es% por supuesto% una relaci7n tabla!. ,or e?e"plo% si deseoobtener los no"bres de todas las sucursales en la tabla cuenta% escribo selectnombre_sucursal fromcuenta

    -l resultado es una relaci7n consistente en un atributo: no"breUsucursal.

    -n aquellos casos donde se quiera forzar la aparici7n de duplicados% se insertar$ la palabracla#e di*tinctdespu6s de select. ,or lo tanto% se puede reescribir la consulta anterior co"o selectdistinctnombre_sucursal fromcuenta

    -l s@"bolo asteriscoV! se puede usar para denotar todos los atributos. As@% el uso de pr6sta"o.Vindicar@a que todos los atributos de pr6sta"o ser@an seleccionados.4na cl$usula select de la for"a select V indica que se deben seleccionar todos los atributos detodas las relaciones tablas! que aparecen en la cl$usula fro". Select% fromprestamo, cuenta

    La cl$usula select ta"bi6n puede contener e&presiones arit"6ticasque contengan los operadores%W% X% V /% operando sobre constantes o atributos de la tuplas. ,or e?e"plo% la consulta selectnombre_sucursal, numero_prestamo, importe % 100 fromprestamo

    de#ol#er$ una relaci7n tabla! que es igual que la relaci7n pr6sta"o% sal#o que el atributo i"porteest$ "ultiplicado por 100.

    3onsid6rese la consulta btener todos los n"eros de pr6sta"o para pr6sta"os (ec(os en lasucursal con no"bre a#acerrada% en los que el i"porte sea superior a 1%200 ,esos. -staconsulta puede escribirse en +>L co"o selectnumero_prestamo fromprestamowherenombre_sucursal =&'avacerrada andimporte > 1200

    +i se desea obtener el n"ero de pr6sta"o de aquellos pr6sta"os por i"portes entre 90%000 100%000 ,esos% se puede usar la co"paraci7n bet*eenpara escribir selectnumero_prestamo fromprestamowhereimportebetween0000 and100000

    inal"ente la cl$usula fro"% esta cl$usula definepor s@ "is"a un producto cartesiano de lasrelaciones tablas!que aparecen en dic(a cl$usula.La consulta ,ara todos los clientes que tienen un pr6sta"o en el banco% obtener los no"bres%n"eros de pr6sta"o e i"portes. -sta consulta puede escribirse en +>L co"o selectnombre_cliente, prestatario*numero_prestamo, importe fromprestatario, prestamowhereprestatario*numero_prestamo =prestamo*numero_prestamo

    7tese que +>L usa la notaci7n no"breUrelaci7n.no"breUatributo% co"o lo (ace el $lgebrarelacional% para e#itar a"bigYedad en los casos en que un atributo aparece en el esque"a de "$sde una relaci7n.

    ACTI%I&A&: )o"ando co"o base el "odelo de la ACTI%I&A&'% -scriba las sentencias en +>Lpara las siguientes solicitudes de infor"aci7n.

    alent@n Belisario Do"@nguez era 5

  • 7/17/2019 3_BaseDat2

    6/15

    Apuntes de Bases de Datos 2 15/09/15

    a! btener los clientes que #i#en en -scobedo.b! btener las sucursales cuo acti#o sea superior a Z100%000.00.c! btener las cuentas que pertenezcan a la sucursal +oriana +endero orte cuo saldo est6entre Z[%000.00 Z15%000.00 pesosd! btener los n"eros de cuenta de los clientes que #i#en en -scobedo.e! btener los n"eros de cuenta de las sucursales que tengan un acti#o inferior a Z500%000.00.f! btener los clientes cuas cuentas tengan un saldo "enor a Z500.00.

    O+eracione* de Reunin/ Con*ulta* de -aria* ta)la*

    +>L ta"bi6n proporciona #arios "ecanis"os para co"binar relaciones "ediante operaciones dereuni7n% e inclue reuniones naturales reuniones condicionales% as@ co"o #arias for"as dereuni7n e&terna. -stas operaciones adicionales se usan a "enudo co"o subconsultas dentro dela cl$usula fro".-n la siguiente figura se "uestra el esque"a que usare"os para ilustrar las operaciones dereuni7n. 4n prestatario es una persona que pide un pr6sta"o.

    ,ri"ero #ere"os las reuniones de tipo internoinner ?oin!.-n la reuni7n internainner ?oin!% +>LU200O especifica dos for"as diferentes para e&presar estaco"binaci7n.

    La pri"era% conocida co"o explcitausala palabra 0OIN% "ientras que La segunda es implcita usala co"a 1! para separar las tablas a co"binar en la sentencia

    E de la declaraci7n +-L-3).

    +ie"pre se genera el producto cartesianodel cual se seleccionan las tuplasque cu"planlo que indica la condici7nonen la e&pl@cita 23ereen la i"pl@cita! .

    -s necesario tener especial cuidado cuando se co"binan colu"nas con #alores NULLaque el #alor nulo no se co"bina con otro #alor o con otro nulo% e&cepto cuando se leagregan predicados condiciones! tales co"o I4 NULLo I4 NOT NULL. ,or e?e"plo% laconsulta:

    select% fromprestamo inner joinprestatario onprestamo*numero_prestamo =prestatario*numero_prestamo,roduce el resultado "ostrado a continuaci7n% e ilustra la for"a e&pl@cita.

    F es equi#alente a esta otra que "uestra la for"a i"pl@cita: select% fromprestamo, prestatario

    where prestamo*numero_prestamo = prestatario*numero_prestamo

    La e&presi7n inner ?oin calcula la reuni7n interna que es la for"a general! de las relacionespr6sta"o prestatario% donde la condici7n de reuni7n es prestamo*numero_prestamo =

    alent@n Belisario Do"@nguez era \

    ,.-+)AE/ ,.-+)A)A.'/

    nu"ero8presta"o no"bre8sucursal i"porte no"bre8cliente nu"ero8presta"o,U1]0 3entro O000 +antos ,U1]0

    ,U2O0 Eoralzarzal N000 G7"ez ,U2O0

    ,U2\0 a#acerrada 1]00 L7pez ,U155

  • 7/17/2019 3_BaseDat2

    7/15

    Apuntes de Bases de Datos 2 15/09/15

    prestatario*numero_prestamo. -l resultado% que es una relaci7n o tabla% est$ co"puestopor los atributos de la tabla del lado izquierdo de la condici7n% seguidos por los atributos de latabla del lado derec(o de la condici7n.

    La reuni7n internaa #eces ta"bi6n recibe el no"bre de reuni7n zeta o t(eta. La t(eta ?oin es aquella que en la condici7n usa operadores% co"o I% J% not ^% I^% J^. ,or

    e?e"plo:select% fromprestamo inner joinprestatario

    onprestamo*numero_prestamo

  • 7/17/2019 3_BaseDat2

    8/15

    Apuntes de Bases de Datos 2 15/09/15

    La segunda aparici7n de n"eroUpr6sta"o se (a reno"brado co"o n"eroUpr6sta"oUcliente. -lorden de los atributos en el resultado de una reuni7n natural es i"portante a la (ora dereno"brarlos.

    ,rocede"os a(ora a "ostrar el funciona"iento de los tipos de reuni7n e&terna.La reuni7n e&terna por la izquierda se calcula del "odo siguiente.,ri"ero se calcula el resultado de la reuni7n interna% co"o se #io anterior"ente.

    A continuaci7n% para cada tupla r perteneciente a la relaci7n del lado izquierdo que no enca?e conninguna tupla s de la relaci7n del lado derec(o% se a_ade al resultado de la reuni7n una tupla tco"puesta por los #alores de r una tupla s con #alores nulos. ,or e?e"plo:

    select% rom prestamo left outer joinprestatario onprestamo*numero_prestamo = prestatario*numero_prestamo

    La reuni7n e&terna por la derec(aes la operaci7n in#ersa a la anterior= el resultado de estaoperaci7n sie"pre contiene todos los registros de la tabla de la derec(a la segunda tabla que se"enciona en la consulta!% aun cuando no e&ista un registro correspondiente en la tabla de laizquierda% para uno de la derec(a. ,or e?e"plo: select% rom prestamo right outer joinprestatario onprestamo*numero_prestamo = prestatario*numero_prestamo

    ,roduce el siguiente resultado:

    nu"ero8presta"o no"breUsucursal i"porte no"breUcliente nu"ero8presta"o

    ,U1]0 3entro O000 +antos ,U1]0

    ,U2O0 Eoralzarzal N000 G7"ez ,U2O0

    null null null L7pez ,U155

    La reuni7n co"pletapresenta los resultados de la tabla izquierda tabla derec(a aunque notengan correspondencia en la otra tabla. La tabla co"binada contendr$% entonces% todos losregistros de a"bas tablas presentar$ #alores nulos para registros sin pare?a. ,or e?e"plo: select% rom prestamo full outer joinprestatario onprestamo*numero_prestamo = prestatario*numero_prestamo

    ,roduce el siguiente resultado:

    nu"ero8presta"o no"breUsucursal i"porte no"breUcliente nu"ero8presta"o

    ,U1]0 3entro O000 +antos ,U1]0

    ,U2O0 Eoralzarzal N000 G7"ez ,U2O0

    null null null L7pez ,U155

    ,U2\0 a#acerrada 1]00 null null

    ACTI%I&A&5: '! )o"e co"o referencia el siguiente "odelo % en su cuaderno% elabore lasrelaciones resultado de las consultas siguientes.

    alent@n Belisario Do"@nguez era [

  • 7/17/2019 3_BaseDat2

    9/15

    Apuntes de Bases de Datos 2 15/09/15

    a!select% fromempleados INNER JINdepartamentosNempleados*depto = departamentos*+_depto

    b!select% rom empleadosN!"#R!$ JINdepartamentosc!select% fromempleados $E%" #"ER JINdepartamentos

    Nempleados*epto = departamentos*+_depto

    d!select% fromempleados RI&'" #"ER JINdepartamentosNempleados*epto = departamentos*+_epto

    e!select% fromempleados %#$$ #"ER JINdepartamentosNempleados*epto = departamentos*+_epto

    ''! -scriba dos sentencias diferentes con las que obtenga el producto cruz% en una use cross ?oin en otra la cl$usula fro" co"a %! sin condici7n.

    Ti+o* 6 condicione* de reunin

    Las e&presiones de reuni7n e&terna se usan nor"al"ente en la cl$usula from% aunque se puedenutilizar en cualquier lugar en el que cabr@a usar cualquier otra relaci7n.3ada #ariante de las operaciones de reuni7n en +>L est$ for"ado por un tipo de reuni7n unacondici7n de reuni7n. La condici7n de reuni7n indica las tuplas pertenecientes a las dos relaciones

    que enca?an los atributos que se incluen en el resultado de la reuni7n . -l tipo de reuni7ndefinec7"o se tratan las tuplas de cada relaci7n que no enca?an con ninguna tupla de la otra relaci7n basado en la condici7n de reuni7n!.

    A continuaci7n se "uestran algunos de los tipos condiciones de reuni7n.

    -l pri"er tipo de reuni7n es la reuni7n interna los otros tres son tipos de reuniones e&ternas.Las tres condiciones de reuni7n son: la reuni7n natural la condici7n on% a #istas anterior"ente% la condici7n u*ing% que se #er$ "$s adelante.-l uso de una condici7n de reuni7n es

    obligatorio en las reuniones e&ternas opcional en las reuniones internas a que si se o"ite% el resultado ser$ el producto

    cartesiano de las dos relaciones!.La palabra cla#e natural aparecesint$ctica"ente antes del tipo de reuni7n% co"o se "ostr7anterior"ente% "ientras que las condiciones on u*ing aparecen al final de la e&presi7n dereuni7n.

    alent@n Belisario Do"@nguez era 9

    -E,L-AD/+ D-,A.)AE-0)/+

    apellido id8depto no"8depto id8depto

    .a"@rez 51 entas 51

    G7"ez 5O 'ngenier@a 5O

    2lores 5O ,roducci7n 5N

    Aala 5N 2inanzas 55

    ,6rez 5N

    +alas 5\

  • 7/17/2019 3_BaseDat2

    10/15

    Apuntes de Bases de Datos 2 15/09/15

    Las palabras cla#e inner outer son opcionales% a que el resto del tipo de reuni7n per"itededucir si la reuni7n es una reuni7n interna o e&terna.-l significado de la condici7n de reuni7n natural% en t6r"inos de las tuplas de las relaciones queenca?an% es in"ediato. La ordenaci7n de los atributos% dentro del resultado de la reuni7n natural esel siguiente: los atributos de reuni7n es decir% los atributos co"unes a las dos relaciones!aparecen en pri"er lugar% en el orden en el que aparezcan en la relaci7n del lado izquierdo. Acontinuaci7n est$n los de"$s atributos que no son de reuni7n de la relaci7n del lado izquierdo % al

    final% todos los atributos que no son de reuni7n de la relaci7n del lado derec(o de la relaci7n.La siguiente e&presi7n es un e?e"plo de la co"binaci7n de la condici7n de reuni7n natural con eltipo de reuni7n e&terna por la derec(a.

    select% fromprestamo natural right outer join prestatario

    Los atributos del resultado se definen por el tipo de reuni7n% que es una reuni7n natural= as@%n"eroUpr6sta"oaparece s7lo una #ez. Las pri"eras dos tuplas del resultado pro#ienen de la

    reuni7n natural deprstamo prestatario. La tupla de la relaci7n del lado derec(o L7pez% ,U155!no enca?a en la reuni7n interna con ninguna tupla de la relaci7n del lado izquierdo prstamo!. As@%la tupla ,U155% null% null% L7pez! aparece en el resultado de la reuni7n.La condici7n de reuni7n u*ing A1%A2% %An! es si"ilar a la condici7n de reuni7n natural% sal#oen que los atributos de reuni7n en este caso son A1%A2%%An% en lugar de todos los atributosco"unes de a"bas relaciones aparecen s7lo una #ez en el resultado de la uni7n.

    -l tipo de reuni7n e&terna co"pleta full outer join! es una co"binaci7n de los tipos de reuni7ne&terna por la derec(a por la izquierda. Despu6s de calcular el resultado de la reuni7n interna%las tuplas de la relaci7n del lado izquierdo que no enca?en con ninguna tupla de la relaci7n del ladoderec(o se co"pletan con #alores nulos se a_aden al resultado. De for"a an$loga% las tuplas de

    la relaci7n del lado derec(o que no enca?en con ninguna tupla de la relaci7n del lado izquierdo% seco"pletan con #alores nulos se a_aden al resultado.-l resultado de la siguiente e&presi7n aparece en la figura Select% fromprestamo naturalfull outer join prestatario using (numero_prestamo)

    tro e?e"plo del uso de la operaci7n reuni7n e&terna es la consulta: Listar todos los clientes queposeen una cuenta pero no tienen un pr6sta"o en el banco. -sta consulta se puede for"ularco"o sigue: select i-' from (impositor left outer join prestatario on impositor*nombre_cliente = prestatario*nombre_cliente) as db1 (i-', n.mero_cuenta, p-', numero_prestamo)where p-' is null

    +>L proporciona ade"$s otros dos tipos de reuni7n% lla"ados cro** join reuni7n cruzada! union join reuni7n de uni7n!. -l pri"ero es equi#alente a una reuni7n interna sin condici7n de

    alent@n Belisario Do"@nguez era 10

  • 7/17/2019 3_BaseDat2

    11/15

    Apuntes de Bases de Datos 2 15/09/15

    reuni7n= el segundo es equi#alente a una reuni7n e&terna co"pleta con condici7n falsa% es decir%donde la reuni7n interna es #ac@a.

    O+eracione* *o)re conjunto*

    La o+eracin unin-n +>L pode"os (acer otras operaciones del $lgebra relacional co"o son la uni7n% la

    intersecci7n la diferencia de con?untos% s7lo que en +>L reciben el no"bre de union% intersect e&cept% respecti#a"ente. Al igual que en $lgebra relacional% las relacionestablas! participantesdeben ser co"patibles% esto es% que deben tener el "is"o con?unto de atributos estos deben serdel "is"o do"inio.Los dos con?untos utilizados ser$n: el con?untos de todos los clientes que tienen una cuenta en elbanco% que puede obtenerse con:

    select nombre-cliente rom impositor

    el con?unto de todos los clientes que tienen un pr6sta"o en el banco% que puede obtenerse con: select nombre-cliente rom prestatario

    ,ara encontrar todos los clientes que poseen un pr6sta"o% una cuenta o las dos cosas en el

    banco% se escribir$: (select nombre-cliente rom impositor) union(select nombre-clienterom prestatario)

    A diferencia de la cl$usula select% la operaci7n unionuni7n! eli"ina duplicados auto"$tica"ente.,ara conser#ar los duplicados% se utilizar$ union all en lugar de union: (select nombre-cliente rom impositor) union all(select nombre-cliente rom prestatario)

    -l n"ero de tuplas duplicadas en el resultado es igual al n"ero total de duplicados queaparecen en las consultas operandos de la uni7n. As@% si +antos tu#iese tres cuentas dospr6sta"os en el banco% entonces en el resultado aparecer@an cinco tuplas con el no"bre de+antos.

    La o+eracin inter*eccin,ara encontrar todos los clientes que tienen tanto un pr6sta"o co"o una cuenta en el banco% seescribir$: (select distinct nombre-cliente rom impositor) intersect(selectdistinct nombre-cliente rom prestatario)

    La operacion intersectintersecci7n! eli"ina duplicados auto"$tica"ente.,ara conser#ar los duplicados se utilizar$ intersect all en lugar de intersect: (select nombre-cliente rom impositor) intersect all(select nombre-cliente rom prestatario)

    -l n"ero de tuplas duplicadas en el resultado es igual al "@ni"o n"ero de duplicados que

    aparecen en las consultas operandos de la intersecci7n.As@% si +antos tu#iese tres cuentas dos pr6sta"os en el banco% entonces en el resultado de laintersecci7n aparecer@an dos tuplas con el no"bre de +antos.

    La o+eracin e7ce+t8diferencia de conjunto*9,ara encontrar todos los clientes que tienen cuenta pero no tienen ningn pr6sta"o en el bancose escribir$: (select distinct nombre-cliente rom impositor) e(cept(selectdistinct nombre-cliente rom prestatario)

    alent@n Belisario Do"@nguez era 11

  • 7/17/2019 3_BaseDat2

    12/15

    Apuntes de Bases de Datos 2 15/09/15

    La operacion e&cepte&cepto! eli"ina duplicados auto"$tica"ente. As@% en la consulta anterior%una tupla con el no"bre de +antos aparecer$ en el resultado e&acta"ente una #ez!% s7lo si+antos tiene una cuenta en el banco% pero no tiene ningn pr6sta"o en el "is"o .,ara conser#ar los duplicados% se utilizar$ e&cept all en lugar de e&cept: (select nombre-cliente rom impositor) e(cept all(select nombre-cliente rom prestatario)

    -l n"ero de copias duplicadas de una tupla en el resultado es igual al n"ero de copias

    duplicadas de dic(a tupla en la consulta de la izquierda "enos el n"ero de copias duplicadas dela "is"a tupla en la consulta de la derec(a% sie"pre que la diferencia sea positi#a . As@% si +antostu#iese tres cuentas un pr6sta"o en el banco% entonces en el resultado aparecer@an dos tuplascon el no"bre de +antos. +i% por el contrario% dic(o cliente tu#iese dos cuentas tres pr6sta"osen el banco% no (abr$ ninguna tupla con el no"bre de +antos en el resultado.

    ACTI%I&A&:. +uponga el siguiente "odelo de datos. -labore las sentencias en +>L para obtenerla uni7n% la intersecci7n la diferencia de con?untos. )a"bi6n elabore las respecti#as tablasresultado de cada operaci7n.

    4u)con*ulta* anidada*

    4na subconsultaes una e&presi7n *elect;from;23ereque se anida dentro de otra consulta. 4nuso co"n de subconsultas es lle#ar a cabo

    co"probaciones sobre pertenencia a con?untos% co"paraci7n de con?untos cardinalidad de con?untos.

    Pertenencia a conjunto*

    +>L utiliza el c$lculo relacional para las operaciones que per"iten co"probar la pertenencia deuna tupla a una relaci7n. La conecti#a inco"prueba la pertenencia a un con?unto% donde elcon?unto es la colecci7n de #alores resultado de una cl$usula select. La conecti#a not inco"prueba la no pertenenciaa un con?unto.,or e?e"plo la consulta Encontrar todos los clientes que tienen tanto un prstamo como unacuenta en el banco. Anterior"ente escribi"os esta consulta co"o la intersecci7n de doscon?untos: el con?unto de los i"positores del banco el con?unto de los prestatarios del banco. +ine"bargo% e&iste un enfoque alternati#o consistente en encontrar todos los tenedores de cuentasen el banco que son "ie"bros del con?unto de prestatarios.

    alent@n Belisario Do"@nguez era 12

    AL4E+1'D8Alu"no o"bre Apellido -dad 3arrera 3urso 3osto8curso

    100 3laudia inc7n 2N Bioqu@"ica )enis O000200 Eiguel ,6rez 25 3ontadur@a utbol 2500O00 oberto -spinosa 2N 'ngenier@a ;arate 2000

    AL4E+2'D8Alu"no o"bre Apellido -dad 3arrera 3urso 3osto8curso

    150 Leticia Eiranda 2O ,sicolog@a ataci7n 2[00200 Eiguel ,6rez 25 3ontadur@a utbol 2500O50 -""a Garc@a 25 'ngenier@a ;arate 2000

  • 7/17/2019 3_BaseDat2

    13/15

    Apuntes de Bases de Datos 2 15/09/15

    3lara"ente% esta for"ulaci7n genera el "is"o resultado que la anterior% pero obliga a for"ular laconsulta usando la conecti#a inde +>L. Acontinuaci7n% se #an a obtener todos los tenedores decuentasfor"ulando as@ la siguiente subconsulta:

    (selectnombre-cliente fromimpositor)Acontinuaci7n es necesario encontrar aquellos clientes que son prestatarios del banco queaparecen en la lista de tenedores de cuenta% obtenida co"o resultado de la subconsulta anterior.-sto se consigue anidando la subconsulta en un select "$s e&terno. La consulta resultante es la

    siguiente:selectdistinct nombre-cliente fromprestatario

    wherenombre-cliente in(selectnombre-cliente fromimpositor)-ste e?e"plo "uestra que es posible escribir la "is"a consulta de di#ersas for"as en +>L .

    -n el e?e"plo anterior se co"probaba la pertenencia a un con?unto en una relaci7n de un soloatributo. )a"bi6n es posible co"probar la pertenencia a un con?unto en una relaci7n cualquiera .

    As@% se puede for"ular la consulta Listar los clientes que tienen tanto unacuenta como un prstamo en la sucursal Navacerrada de un "odo distinto al #isto anterior"ente:

    selectdistinct nombre_cliente fromprestatario, prestamowhereprestatario*numero_prestamo = prestamo*numero_prestamo and

    nombre_sucursal = &'avacerrada and(nombre_sucursal, nombre_cliente) in(selectnombre_sucursal, nombre_cliente fromimpositor, cuentawhereimpositor*numero_cuenta = cuenta*numero_

    cuenta)

    A continuaci7n% se ilustra el uso del not in. ,or e?e"plo% para encontrar todos los clientes quetienen un prstamo en el banco, pero no tienen una cuenta en el banco % se puede escribir selectdistinct nombre_cliente fromprestatario

    wherenombre_cliente not in(selectnombre_cliente fromimpositor)

    Los operadores in not in ta"bi6n se pueden usar sobre con?untos enu"erados. La consulta

    siguiente selecciona los nombres de los clientes que tienen un prstamo en el banco y cuyosnombres no son ni Santos ni Gme. selectdistinct nombre_cliente fromprestatario

    wherenombre_cliente not in(&/antos, me")

    Com+aracin de conjunto*

    3onsid6rese la consulta !btener los nombres de todas las sucursales que poseen un activomayor que al menos una sucursal situada en "arcelona . 4na "anera de for"ular esta consultaes del "odo siguiente:

    selectdistinct *nombre-sucursal fromsucursal as, sucursal as/

    where*activo > /*activo and/*ciudad-sucursal = &arcelona+>L ofrece un estilo alternati#o de for"ular la consulta anterior. La e&presi7n mayor que almenos una se representa en +>L por J so"e. -sta instrucci7n per"ite reescribir la consulta enuna for"a "$s parecida al lengua?e natural. selectnombre-sucursal fromsucursal whereactivo ) some(selectactivo fromsucursal

    whereciudad-sucursal = &arcelona)La subconsulta select acti#o fro" sucursal *(ere ciudadUsucursal ^ Barcelona! genera elcon?unto de todos los #alores de acti#o para todas las sucursales sitas en Barcelona .

    alent@n Belisario Do"@nguez era 1O

  • 7/17/2019 3_BaseDat2

    14/15

    Apuntes de Bases de Datos 2 15/09/15

    La co"paraci7n J so"e% en la cl$usula *(ere de la cl$usula select "$s e&terna% es cierta si el#alor del atributo acti#o de la tupla es "aor que al "enos un "ie"bro del con?unto de todos los#alores de acti#o de las sucursales de Barcelona. +>L ta"bi6n per"ite realizar las co"paracionesI so"e% I^ so"e% J^ so"e% ^ so"e IJ so"e. 3o"o e?ercicio% se puede #eriRcar que ^ so"ees id6ntico a in% "ientras que I^ so"e no es lo "is"o que not in.

    A(ora la consulta se "odiRcar$ ligera"ente a Rn de obtener los nombres de todas las sucursales

    que tienen un activo superior al de todas las sucursales de "arcelona . La instrucci7n J allcorresponde a la e&presi7n superior a todas. 4tilizando esta instrucci7n la consulta se podr@afor"ular del "odo siguiente:

    selectnombre_sucursal fromsucursalwhereactivo > all(selectactivo fromsucursalwhereciudad_sucursal = &arcelona)

    Al igual que con so"e% +>L ta"bi6n per"ite utilizar las co"paraciones I all% I^ all% J^ all% ^ all IJ all. -n +>L% la palabra cla#e an6es sin7ni"o de *ome.3o"o e?ercicio se puede #eriRcar queI^ an es lo "is"o que not in.

    Com+ro)acin de relacione* -acL inclue la posibilidad de co"probar si una subconsulta produce ninguna tupla co"oresultado. La instrucci7n e7i*t*de#uel#e un #alor #erdadero si la subconsulta argu"ento no es#ac@a. 4sando la instrucci7n e&ists se puede for"ular la consulta btener los clientes que tienentanto una cuenta co"o un pr6sta"o en el banco de otra nue#a for"a:

    selectnombre_clientewhereeists (select% fromimpositor

    whereimpositor*nombre_cliente = prestatario*nombre_cliente)4tilizando la constructora not e&ists se puede co"probar la ine&istencia de tuplas en el resultadode una subconsulta.

    Com+ro)acin de tu+la* du+licada*

    +>L inclue la posibilidad de co"probar si una subconsulta produce co"o resultado tuplasduplicadas. La cl$usula uni=uede#uel#e el #alor cierto si la subconsulta que se le pasa co"oargu"ento no produce tuplas duplicadas. 4sando la cl$usula unique se puede for"ular la consultabtener todos los clientes que tienen s7lo una cuenta en la sucursal de no"bre a#acerrada delsiguiente "odo:

    select*nombre_cliente fromimpositor as whereuni$ue (select 4*nombre_cliente fromcuenta, impositor as 4

    where*nombre_cliente = 4*nombre_cliente and4*numero_cuenta = cuenta*numero_cuenta and

    cuenta*nombre_sucursal = &'avacerrada)

    La e&istencia de tuplas duplicadas en una subconsulta se puede co"probar utilizando laconstructora not uni=ue. ,ara ilustrar esta constructora consid6rese la consulta !btener todoslos clientes que tienen al menos dos cuentas en la sucursal Navacerrada % que se puede for"ulardel "odo siguiente: selectdistinct *nombre_cliente fromimpositor as

    wherenot uni$ue (select4*nombre_cliente fromcuenta,impositor as4 where*nombre_cliente = 4*nombre_cliente and

    4*numero_cuenta = cuenta*numero_cuenta andcuenta*nombre_sucursal =&'avacerrada)

    alent@n Belisario Do"@nguez era 1N

  • 7/17/2019 3_BaseDat2

    15/15

    Apuntes de Bases de Datos 2 15/09/15

    ACTI%I&A&>: +uponga el siguiente "odelo de datos. -labore las respecti#as tablas resultado decada operaci7n.

    a! select+_alumno, nombre, apellido fromalumnos1where+_alumno in(select+_alumno fromalumnos2)

    b! select+_alumno, nombre, apellido fromalumnos1where+_alumno not in (select+_alumno fromalumnos2)

    c! select*+_alumno fromalumnos1 as whereuni*ue(selectalumnos1*+_alumno fromalumnos1 , alumnos2 as

    5here alumnos1*+_alumno = alumnos2*+_alumno)

    ACTI%I&A&?: -labore un cuadro sin7ptico de las operaciones uni7n% intersecci7n% diferencia decon?untos% pertenencia a con?untos% co"paraci7n de con?untos% co"probaci7n de relaciones#ac@as co"probaci7n de tuplas duplicadas.-specifique:

    a! La cl$usula o constructor para cada operaci7nb! Los "odificadores ALL ) de las operaciones que lo usenc! -l prop7sito de cada operaci7n

    uentes:

    (ttp://es.*iCipedia.org/*iCi/'ntegridad8de8datos(ttp://es.*iCipedia.org/*iCi/'ntegridad8referencialLibro: +ilbersc(atz% ;ort( +udars(an= unda"entos de bases de datos% N edici7n% 2002% -dit.EcGra*UMill

    alent@n Belisario Do"@nguez era 15

    AL4E+1'D8Alu"no o"bre Apellido -dad 3arrera 3urso 3osto8curso

    100 3laudia inc7n 2N Bioqu@"ica )enis O000200 Eiguel ,6rez 25 3ontadur@a utbol 2500

    O00 oberto -spinosa 2N 'ngenier@a ;arate 2000

    AL4E+2'D8Alu"no o"bre Apellido -dad 3arrera 3urso 3osto8curso

    150 Leticia Eiranda 2O ,sicolog@a ataci7n 2[00200 Eiguel ,6rez 25 3ontadur@a utbol 2500O50 -""a Garc@a 25 'ngenier@a ;arate 2000

    http://es.wikipedia.org/wiki/Integridad_de_datoshttp://es.wikipedia.org/wiki/Integridad_referencialhttp://es.wikipedia.org/wiki/Integridad_de_datoshttp://es.wikipedia.org/wiki/Integridad_referencial