Академический Документы
Профессиональный Документы
Культура Документы
parntesis. Por tanto, la consulta para crear una lista de todos los nmeros de prstamo y del importe de los mismos puede escribirse como nmero-prstamo, importe (prstamo) Composicin de operaciones relacionales Es importante el hecho de que el resultado de una operacin relacional sea tambin una relacin. Considrese la consulta ms compleja Encontrar los clientes que viven en Peguerinos. Hay que escribir: nombre-cliente (ciudad-cliente = Peguerinos (cliente)) Tngase en cuenta que, en vez de dar en el argumento de la operacin proyeccin el nombre de una relacin, se da una expresin que se evala como una relacin. En general, dado que el resultado de una operacin del lgebra relacional es del mismo tipo (relacin) que los datos de entrada, las operaciones del lgebra relacional pueden componerse para formar una expresin del lgebra relacional. La composicin de operaciones del lgebra relacional para formar expresiones del lgebra relacional es igual que la composicin de operaciones aritmticas (como +, , * y ) para formar expresiones aritmticas. La operacin unin Considrese una consulta para averiguar el nombre de todos los clientes del banco que tienen una cuenta, un prstamo o ambas cosas. Obsrvese que la relacin cliente no contiene esa informacin, dado que los clientes no necesitan tener ni cuenta ni prstamo en el banco. Para contestar a esta consulta hace falta la informacin de la relacin impositor (Figura 3.5) y la de la relacin prestatario. Se conoce la manera de averiguar los nombres de todos los clientes con prstamos en el banco: nombre-cliente (prestatario) Tambin se conoce la manera de averiguar el nombre de los clientes con cuenta en el banco: nombre-cliente (impositor) Para contestar a la consulta hace falta la unin de estos dos conjuntos; es decir, hacen falta todos los nombres de clientes que aparecen en alguna de las dos relaciones o en ambas. Estos datos se pueden averiguar mediante la operacin binaria unin, denotada, como en la teora de conjuntos, por . Por tanto, la expresin buscada es nombre-cliente (prestatario)nombre-cliente (impositor)
La relacin resultante de esta consulta aparece en la. Tngase en cuenta que en el resultado hay diez tuplas, aunque hay siete prestatarios y seis impositores distintos. Esta discrepancia aparente se debe a que Gmez, Santos y Lpez son a la vez prestatarios e impositores. Dado que las relaciones son conjuntos, se eliminan los valores duplicados. Obsrvese que en este ejemplo se toma la unin de dos conjuntos, ambos consistentes en valores de nombre-cliente. En general, se debe asegurar que las uniones se realicen entre relaciones compatibles. Para que una operacin unin r s sea vlida hay que exigir que se cumplan dos condiciones: 1. Las relaciones r y s deben ser de la misma aridad. Es decir, deben tener el mismo nmero de atributos. 2. Los dominios de los atributos i-simos de r y de s deben ser iguales para todo i. Tngase en cuenta que r y s pueden ser, en general, relaciones temporales que sean resultado de expresiones del lgebra relacional. La operacin diferencia de conjuntos La operacin diferencia de conjuntos, denotada por , permite buscar las tuplas que estn en una relacin pero no en la otra. La expresin r s da como resultado una relacin que contiene las tuplas que estn en r pero no en s. Se pueden buscar todos los clientes del banco que tienen abierta una cuenta pero no tienen concedido ningn prstamo escribiendo nombre-cliente (impositor) nombre-cliente (prestatario) Como en el caso de la operacin unin, hay que asegurarse de que las diferencias de conjuntos se realicen entre relaciones compatibles. Por tanto, para que una operacin diferencia de conjuntos r s sea vlida hay que exigir que las relaciones r y s sean de la misma aridad y que los dominios de los atributos i-simos de r y s sean iguales. La operacin producto cartesiano La operacin producto cartesiano, denotada por un aspa (), permite combinar informacin de cualesquiera dos relaciones. El producto cartesiano de las relaciones r1 y r2 como r1 r2. Recurdese que las relaciones se definen como subconjuntos del producto cartesiano de un conjunto de dominios. A partir de esta definicin ya se debe tener una intuicin sobre la definicin de la operacin producto cartesiano. Sin embargo, dado que el mismo nombre de atributo puede aparecer tanto en r1 como en r2, hay que crear un esquema de denominaciones para distinguir entre ambos atributos. En este caso se logra adjuntando al atributo el nombre de la relacin de la
Con este esquema se puede distinguir entre prestatario. nmero-prstamo y prstamo.nmero-prstamo. Para los atributos que slo aparecen en uno de los dos esquemas se suele omitir el prefijo con el nombre de la relacin. Esta simplificacin no genera ambigedad alguna. Por tanto, se puede escribir el esquema de relacin de r como
(nombre-cliente, prestatario.nmero-prstamo, nombre-sucursal, prstamo.nmero-prstamo, importe)
El acuerdo de denominaciones precedente exige que las relaciones que sean argumentos de la operacin producto cartesiano tengan nombres diferentes. Esta exigencia causa problemas en algunos casos, como cuando se desea calcular el producto cartesiano de una relacin consigo misma. Se produce un problema similar si se utiliza el resultado de una expresin del lgebra relacional en un producto cartesiano, dado que har falta un nombre para la relacin para poder hacer referencia a sus atributos. Ahora que se conoce el esquema de relacin de r = prestatario prstamo hay que averiguar las tuplas que aparecern en r. Como se poda imaginar, se crea una tupla de r a partir de cada par de tuplas posible: una de la relacin prestatario y otra de la relacin prstamo. Por tanto, r es una relacin de gran tamao, donde slo se ha incluido una parte de las tuplas que forman parte de r. En general, si se tienen las relaciones r1 (R1) y r2 (R2), r1 r2 es una relacin cuyo esquema es la concatenacin de R1 y de R2. La relacin R contiene todas las tuplas t para las que hay unas tuplas t1 en r1 y t2 en r2 para las que t[R1] = t1[R1] y t[R2] = t2[R2]. Supngase que se desea averiguar los nombres de todos los clientes que tienen concedido un prstamo en la sucursal de Navacerrada. Se necesita para ello informacin de las relaciones prstamo y prestatario. Si se escribe nombre-sucursal = Navacerrada (prestatario prstamo) Se tiene una relacin que slo atae a la sucursal de Navacerrada. Sin embargo, la columna nombrecliente puede contener clientes que no tengan concedido ningn prstamo en la sucursal de Navacerrada. (Si no se ve el motivo por el que esto es cierto, recurdese que el producto cartesiano toma todos los emparejamientos posibles de una tupla de prestatario con una tupla de prstamo.)
Dado que la operacin producto cartesiano asocia todas las tuplas de prstamo con todas las tuplas de prestatario, se sabe que, si un cliente tiene concedido un prstamo en la sucursal de Navacerrada, hay alguna tupla de prestatario prstamo que contiene su nombre y que prestatario.nmero-prstamo = prstamo.nmeroprstamo. Por tanto, si escribimos prestatario.nmero-prstamo = prstamo.nmero-prstamo (nombre-sucursal = Navacerrada (prestatario prstamo)) slo se obtienen las tuplas de prestatario prstamo que corresponden a los clientes que tienen concedido un prstamo en la sucursal de Navacerrada. Finalmente, dado que slo se desea obtener nombrecliente, se realiza una proyeccin:
nombre-cliente (prestatario.nmero-prstamo = prstamo.nmero-prstamo (nombre-sucursal = Navacerrada (prestatario prstamo))) La operacin renombramiento A diferencia de las relaciones de la base de datos, los resultados de las expresiones de lgebra relacional no tienen un nombre que se pueda utilizar para referirse a ellas. Resulta til poder ponerles nombre; el operador renombramiento, denotado por la letra griega rho minscula (), permite realizar esta tarea. Dada una expresin E del lgebra relacional, la expresin x (E) devuelve el resultado de la expresin E con el nombre x. Las relaciones r por s mismas se consideran expresiones (triviales) del lgebra relacional. Por tanto, tambin se puede aplicar la operacin renombramiento a una relacin r para obtener la misma relacin con un nombre nuevo. Otra forma de la operacin renombramiento es la siguiente. E tiene aridad n. Por tanto, la expresin x (A1, A2, An) (E) devuelve el resultado de la expresin E con el nombre x y con los atributos con el nombre cambiado a A1, A2, , An. Para ilustrar el uso del renombramiento de las relaciones, considrese la consulta Buscar el mximo saldo de cuenta del banco. La estrategia empleada para obtener el resultado es 1) calcular una relacin intermedia consistente en los saldos que no son el mximo y 2) realizar la diferencia entre la relacin saldo (cuenta) y la relacin intermedia recin calculada. Paso 1: Para calcular la relacin intermedia hay que comparar los valores de los saldos de todas las cuentas. Esta comparacin se puede hacer calculando el producto cartesiano cuenta cuenta y formando una seleccin para comparar el valor de cualesquiera dos saldos que aparezcan en una tupla. En primer lugar hay que crear un mecanismo para distinguir entre los dos atributos saldo. Se utilizar la operacin renombramiento para cambiar el nombre de una referencia a la relacin cuenta; as, se puede hacer referencia dos veces a la relacin sin ambigedad alguna. La relacin temporal que se compone de los saldos que no son el mximo puede escribirse ahora como
cuenta.saldo (cuenta.saldo < d.saldo (cuenta d (cuenta))) Esta expresin proporciona los saldos de la relacin cuenta para los que aparece un saldo mayor en alguna parte de la relacin cuenta (cuyo nombre se ha cambiado a d). El resultado contiene todos los saldos salvo el mximo. Esta relacin se muestra: Paso 2: La consulta para averiguar el mximo saldo de cuenta del banco puede escribirse de la manera siguiente:
saldo (cuenta) cuenta.saldo (cuenta.saldo < d.saldo(cuenta d (cuenta)))
La operacin interseccin de conjuntos La primera operacin adicional del lgebra relacional que se definir es la interseccin de conjuntos (). Supngase que se desea averiguar todos los clientes que tienen un prstamo concedido y una cuenta abierta. Utilizando la interseccin de conjuntos se puede escribir nombre-cliente (prestatario)nombre-cliente (impositor) La expresin del lgebra relacional utilizando la interseccin de conjuntos sustituyendo la operacin interseccin por un par de operaciones de diferencia de conjuntos, de la manera siguiente: r s = r (r s) Por tanto, la interseccin de conjuntos no es una operacin fundamental y no aade potencia al lgebra relacional. Sencillamente, es ms conveniente escribir r s que r (r s).
La operacin reunin natural Suele resultar deseable simplificar ciertas consultas que exigen un producto cartesiano. Generalmente, las consultas que implican un producto cartesiano incluyen un operador seleccin sobre el resultado del producto cartesiano. En primer lugar se calcula el producto cartesiano de las relaciones prestatario y prstamo. Luego, se seleccionan las tuplas que slo ataen al mismo nmeroprstamo, seguidas por la proyeccin de nombre-cliente, nmero-prstamo e importe resultantes: nombre-cliente, prstamo.nmero-prstamo, importe(prestatario.nmeroprstamo = prstamo.nmero-prstamo(prestatario prstamo)) La reunin natural es una operacin binaria que permite combinar ciertas selecciones y un producto cartesiano en una sola operacin. Se denota por el smbolo de la reunin . La operacin reunin natural forma un producto cartesiano de sus dos argumentos, realiza una seleccin forzando la igualdad de los atributos que aparecen en ambos esquemas de relacin y, finalmente, elimina los atributos duplicados. Aunque la definicin de la reunin natural es compleja, la operacin es sencilla de aplicar. Como ilustracin, considrese nuevamente el ejemplo Averiguar los nombres de todos los clientes que tienen concedido un prstamo en el banco y averiguar su importe. Esta consulta puede expresarse utilizando la reunin natural de la manera siguiente: nombre-cliente, nmero-prstamo, importe (prestatario prstamo) Dado que los esquemas de prestatario y de prstamo (es decir, Esquemaprestatario y Esquema-prstamo) tienen en comn el atributo nmero-prstamo, la operacin reunin natural slo considera los pares de tuplas que tienen el mismo valor de nmero-prstamo. Esta operacin combina cada uno de estos pares en una sola tupla en la unin de los dos esquemas (es decir, nombre-cliente, nombresucursal, nmero-prstamo, importe). Si se consideran los esquemas como conjuntos, en vez de como listas, se pueden denotar los nombres de los atributos que aparecen tanto en R como en S mediante R S, y los nombres de los atributos que aparecen en R, en S o en ambos mediante R S. De manera parecida, los nombres de los atributos que aparecen en R pero no en S se denotan por R S, mientras que S R denota los nombres de los atributos que aparecen en S pero no en R. Obsrvese que las operaciones unin, interseccin y diferencia aqu operan sobre conjuntos de atributos, y no sobre relaciones. Ahora se est preparado para una definicin formal de la reunin natural. Considrense dos relaciones r(R) y s(S). La reunin natural de r y de s, denotada
por r s es una relacin del esquema R S definida formalmente de la manera siguiente: r s = R S (r.A1 = s.A1 r.A2 = s.A2 r.An = s.An r s) Donde R S = {A1, A2, , An}. Como la reunin natural es fundamental para gran parte de la teora y de la prctica de las bases de datos relacionales, se ofrecen varios ejemplos de su uso. Hallar los nombres de todas las sucursales con clientes que tienen una cuenta abierta en el banco y que viven en Peguerinos. nombre-sucursal (ciudad-cliente = Peguerinos (cliente cuenta impositor)) No se especific la expresin deseada porque las dos son equivalentes. Es decir, la reunin natural es asociativa. Hallar todos los clientes que tienen una cuenta abierta y un prstamo concedido en el banco. nombre-cliente (prestatario impositor) Se escribi una expresin para esta consulta utilizando la interseccin de conjuntos. Aqu se repite esa expresin. nombre-cliente (prestatario)nombre-cliente (impositor) Este ejemplo ilustra una realidad comn del lgebra relacional: se pueden escribir varias expresiones del lgebra relacional equivalentes que sean bastante diferentes entre s. Sean r(R) y s (S) relaciones sin atributos en comn; es decir, R S = . ( denota el conjunto vaco.) Por tanto, r s= r s. La operacin reunin zeta es una extensin de la operacin reunin natural que permite combinar una seleccin y un producto cartesiano en una sola operacin. Considrense las relaciones r(R) y s(S), y sea un predicado de los atributos del esquema R S. La operacin reunin zeta r s se define de la manera siguiente: r s = (r s) La operacin divisin La operacin divisin, denotada por , resulta adecuada para las consultas que incluyen la expresin para todos. Supngase que se desea hallar a todos los clientes que tengan abierta una cuenta en todas las sucursales ubicadas en
Arganzuela. Se pueden obtener todas las sucursales de Arganzuela mediante la expresin r1 = nombre-sucursal (ciudad-sucursal = Arganzuela (sucursal)) Formalmente, sean r(R) y s(S) relaciones y S R; es decir, todos los atributos del esquema S estn tambin en el esquema R. La relacin r s es una relacin del esquema R S (es decir, del esquema que contiene todos los atributos del esquema R que no estn en el esquema S). Una tupla t est en r s si y slo si se cumplen estas dos condiciones: 1. t est en R S (r) 2. Para cada tupla tS de s hay una tupla tr de r que cumple las dos condiciones siguientes: a. tr[S] = ts[S] b. tr[R S] = t Puede resultar sorprendente descubrir que, dados una operacin divisin y los esquemas de las relaciones, se puede, de hecho, definir la operacin divisin en trminos de las operaciones fundamentales. Sean r(R) y s(S) dadas, con S R: r s = R S (r) R S ((R S (r) s) R S, S (r)) Para comprobar que esta expresin es verdadera, obsrvese que R S (r) da todas las tuplas t que cumplen la primera condicin de la definicin de la divisin. La expresin del lado derecho del operador diferencia de conjuntos, R S ((R S (r) s) R S, S (r)), sirve para borrar esas tuplas que no cumplen la segunda condicin de la definicin de la divisin. Esto se logra de la manera siguiente. Considrese R S (r) s. Esta relacin est en el esquema R y empareja cada tupla deR S (r) con cada tupla de s. La expresin R S, S (r) slo reordena los atributos de r. Por tanto, (R S (r) s) R S, S (r) genera los pares de tuplas de R S (r) y de s que no aparecen en r. Si una tupla tj est en R S ((R S (r) s) R S, S (r)), hay alguna tupla ts de s que no se combina con la tupla tj para formar una tupla de r. Por tanto, tj guarda un valor de los atributos R S que no aparece en r s. Estos valores son los que se eliminan de R S (r). La operacin asignacin En ocasiones resulta conveniente escribir una expresin del lgebra relacional por partes utilizando la asignacin a una variable de relacin temporal. La operacin asignacin, denotada por , acta de manera parecida a la asignacin de los lenguajes de programacin. Para ilustrar esta operacin, considrese la definicin de la divisin dada en el Apartado 3.2.3.3. Se puede escribir r s como temp1R S (r)
temp2 R S ((temp1 s) R S, S (r)) resultado = temp1 temp2 La evaluacin de una asignacin no hace que se muestre ninguna relacin al usuario. Por el contrario, el resultado de la expresin a la derecha de se asigna a la variable relacin a la izquierda de . Esta variable relacin puede utilizarse en expresiones posteriores.
nombre-sucursal, sueldo)
Ntese que, si bien slo se pueden borrar tuplas de una sola relacin cada vez, se puede utilizar cualquier nmero de relaciones en una expresin select-fromwhere anidada en la clusula where de un delete. La orden delete puede contener un select anidado que use una relacin de la cual se van a borrar tuplas. Por ejemplo, para borrar todas las cuentas cuyos saldos sean inferiores a la media del banco se puede escribir: delete from cuenta where saldo < (select avg (saldo) from cuenta) La orden delete comprueba primero cada tupla de la relacin cuenta para comprobar si la cuenta tiene un saldo inferior a la media del banco. A continuacin se borran todas las tuplas que no cumplan la condicin anterior, es decir, las que representan una cuenta con un saldo menor que la media. Es importante realizar todas las comprobaciones antes de llevar a cabo ningn borrado (si se borrasen algunas tuplas antes de que otras fueran comprobadas, el saldo medio podra haber cambiado y el resultado final del borrado dependera del orden en que las tuplas fueran procesadas). Insercin Para insertar datos en una relacin, o bien se especifica la tupla que se desea insertar o se formula una consulta cuyo resultado sea el conjunto de tuplas que se desean insertar. Obviamente, los valores de los atributos de la tuplas que se inserten deben pertenecer al dominio de los atributos. De igual modo, las tuplas insertadas debern ser de la aridad correcta. La instruccin insert ms sencilla corresponde a la de insercin de una tupla. Supongamos que se desea insertar en la base de datos el hecho de que hay una cuenta C-9732 en la sucursal Navacerrada y que dicha cuenta tiene un saldo de 1.200 . La insercin se puede formular del modo siguiente: insert into cuenta values (C-9732, Navacerrada, 1200) Actualizaciones En determinadas situaciones puede ser deseable cambiar un valor dentro de una tupla, sin cambiar todos los valores de la misma. Para este tipo de situaciones se utiliza la instruccin update. Al igual que ocurre con insert y delete, se pueden elegir las tuplas que van a ser actualizadas mediante una consulta. Por ejemplo, si hubiera que realizar el pago de intereses anuales y todos los saldos se incrementasen en un 5 %, habra que formular la siguiente actualizacin: update cuenta set saldo = saldo * 1.05 Esta actualizacin se aplica una vez a cada tupla de la relacin cuenta.
Si se paga el inters slo a las cuentas con un saldo de 1.000 o superior, se puede escribir update cuenta set saldo = saldo * 1.05 where saldo >= 1000 En general, la clusula where de la instruccin update puede contener cualquier constructor legar en la clusula where de una instruccin select (incluyendo instrucciones select anidadas). Como con insert y delete, un select anidado en una instruccin update puede referenciar la relacin que se est actualizando. Como antes, SQL primero comprueba todas las tuplas de la relacin para determinar las que se deberan actualizar y despus realiza la actualizacin. Por ejemplo, se puede escribir Pagar un inters del 5% a las cuentas cuyo saldo sea mayor que la media como sigue: update cuenta set saldo = saldo * 1.05 where (saldo > select avg(saldo) from cuenta) Actualizacin de vistas . Como ejemplo considrese la siguiente definicin de vista: create view prstamo-sucursal as select nombre-sucursal, nmero-prstamo from prstamo Como SQL permite que el nombre de una vista aparezca en cualquier lugar en el que pueda aparecer el nombre de una relacin, se puede formular: insert into prstamo-sucursal values (Navacerrada, P-307) SQL representa esta insercin mediante una insercin en la relacin prstamo, puesto que prstamo es la relacin real a partir de la cual se construye la vista prstamo- sucursal. Por lo tanto, debera especificarse un valor para el atributo importe. Este valor es un valor nulo. De este modo, la insercin anterior es equivalente a la insercin de la tupla (P-307, Navacerrada, null) en la relacin prstamo. La anomala de la actualizacin de vistas se agrava cuando una vista se define en trminos de varias relaciones. Como resultado, muchas bases de datos basadas en SQL imponen la siguiente restriccin a las modificaciones de vistas: Una modificacin de una vista es vlida slo si la vista en cuestin se define en trminos de la base de datos relacional real, esto es, del nivel lgico de la base de datos (y sin usar agregacin). Bajo esta restriccin, las operaciones update, insert y delete realizadas sobre el ejemplo de la vista todos-losclientes definida anteriormente, estaran prohibidas.
Transacciones Una transaccin consiste en una secuencia de instrucciones de consulta y actualizaciones. La norma SQL especifica que una transaccin comienza implcitamente cuando se ejecuta una instruccin SQL. Una de las siguientes instrucciones SQL debe finalizar la transaccin: Commit work compromete la transaccin actual; es decir, hace que los cambios realizados por la transaccin sean permanentes en la base de datos. Despus de que se comprometa la transaccin se inicia una nueva transaccin automticamente. Rollback work causa el retroceso de la transaccin actual; es decir, deshace todas las actualizaciones realizadas por las instrucciones SQL de la transaccin; as, el estado de la base de datos se restaura al que exista previo a la ejecucin de la transaccin. La palabra work es opcional en ambas instrucciones. El retroceso de transacciones es til si se detecta alguna condicin de error durante la ejecucin de una transaccin. El compromiso es similar, bajo un punto de vista, a guardar los cambios de un documento que se est modificando, mientras que el retroceso es similar a abandonar la sesin de modificacin sin guardar los cambios. Una vez que una transaccin haya ejecutado commit work, sus efectos no se pueden deshacer con rollback work. El sistema de bases de datos garantiza que en el caso de una cada, los efectos de la transaccin se retrocedern si no se hubo ejecutado commit work. En el caso de fallo de alimentacin o cada del sistema, el retroceso ocurre cuando el sistema se reinicia.