Você está na página 1de 5

lgebra relacional Introduccin

Los lenguajes de consultas son los lenguajes en el que los usuarios solicitan informacin de la base de datos. Estos lenguajes son generalmente de ms alto nivel que los lenguajes de programacin. Los lenguajes de consulta pueden clasificarse como procedimentales y no procedimentales. En el lenguaje del tipo procedimental el usuario da las instrucciones al sistema para que realice una secuencia de operaciones en la base de datos para calcular el resultado deseado. En el lenguaje no procedimental, el usuario describe la informacin deseada sin dar un procedimiento especfico para obtener dicha informacin. El lgebra relacional es un lenguaje de consulta formal procedimental, el lgebra relacional define operadores que funcionan sobre las tablas (de una manera similar a los operadores +, -, etc. del lgebra comn) para llegar al resultado deseado. Al utilizar el lgebra relacional no slo debemos saber lo que queremos, tambin cmo obtenerlo. El lgebra relacional toma dos o ms tablas como entrada y produce una nueva tabla como resultado de la serie de operaciones. Las operaciones fundamentales en el lgebra relacional son seleccionar, proyectar, renombrar, unin, diferencia de conjuntos y producto cartesiano. Adems de las operaciones fundamentales existen otras operaciones como son: interseccin de conjuntos, producto natural, divisin y asignacin.

lgebra relacional Apuntes Korth Operaciones fundamentales Las operaciones seleccionar, proyectar y renombrar se llaman operaciones unitarias, ya que operan sobre una relacin, las otras tres operaciones operan sobre pares de relaciones y, por lo tanto, se llaman operaciones binarias. La operacin seleccionar La operacin seleccionar selecciona tuplas que satisfacen un predicado dado. Usamos la letra griega minscula sigma ( ), o bien, (SL) para indicar la seleccin. As para seleccionar aquellas tuplas de la relacin prstamo en las que la sucursal es Perryridge, escribimos: nombre_sucursal=Perryridge(prstamo) SLnombre_sucursal=Perryridge(prstamo) Podemos encontrar todas las tuplas en las que la cantidad prestada es ms de 1200 dlls escribiendo: cantidad>1,200(prstamo) SLcantidad>1,200(prstamo) En general, permitimos las comparaciones usando =, <>, <, <=, >, >=, en el predicado de seleccin. Adems, pueden combinarse varios predicados en un predicado ms complejo usando los conectores y ( ) y o ( ).

As, para encontrar las tuplas pertenecientes a prstamos de ms de 1,200 dlls Hechas por la sucursal Perryridge, escribimos: nombre_sucursal=Perryridge cantidad>1,200 (prstamo) SLnombre_sucursal=Perryridge cantidad>1,200 (prstamo) La operacin proyectar La operacin proyectar es una operacin unitaria que devuelve su relacin argumento con ciertas columnas omitidas. Puesto que una relacin es un conjunto, se eliminan todas las filas duplicadas. La proyeccin se indica con por la letra griega pi ( ) (PJ). Listamos los atributos que queremos que aparezcan en el resultado como subndice de . La relacin argumento se escribe a continuacin de entre parntesis. Supngase que queremos una relacin que muestre los clientes y las sucursales en las que tienen prstamos, pero no necesitamos de la cantidad ni del nmero del prstamo. Escribimos: nombre_sucursal, nombre_cliente(prstamo) PJnombre_sucursal, nombre_cliente(prstamo) Si necesitamos encontrar a los clientes que tienen el mismo nombre que su banquero personal: nombre_cliente ( nombre_cliente=nombre_banquero servicio)) PJnombre_cliente ( nombre_cliente=nombre_banquero servicio))

La operacin producto cartesiano La operacin producto cartesiano nos permite combinar informacin de varias relaciones, est representada por una cruz (x), o bien por (CP) es una operacin binaria. La podemos representar como r1 x r2. Supngase que queremos encontrar a todos los clientes del banquero Johnson, as como las ciudades en las que viven estos clientes. Necesitamos la informacin de la relacin servicio y de la relacin cliente. r= servicio x cliente r= servicio CP cliente Es decir, simplemente listamos todos los atributos de las dos relaciones, y adjuntamos el nombre de la relacin de la que el atributo procede originalmente. Necesitamos adjuntar el nombre de la relacin para distinguir de servicio.nombre-cliente de cliente.nombre-cliente. Para aquellos atributos que slo aparecen en uno de los dos esquemas, omitiremos el prefijo. Volviendo a la pregunta Encontrar a todos los clientes del banquero Johnson y la ciudad en la que viven, tenemos que escribir: nombre_banquero=Johnson (servicio x cliente) SLnombre_banquero=Johnson (servicio CP cliente) Puesto que la operacin producto cartesiano asocia todas las tuplas de cliente con todas las tuplas de servicio, sabemos que alguna tupla en servicio x cliente tiene la direccin del cliente del banquero. Esto ocurre si servicio.nombre-cliente = cliente.nombre-cliente. Escribimos sevicio.nombre-cliente=cliente.nombre-cliente nombre_banquero=Johnson (servicio x cliente) SLsevicio.nombre-cliente=cliente.nombre-cliente SLnombre_banquero=Johnson (servicio CP cliente) Finalmente, como slo queremos nombre-cliente y ciudad-cliente, hacemos unas proyecciones: servicio.nombre-cliente, ciudad cliente( sevicio.nombre-cliente=cliente.nombre-cliente ( nombre_banquero=Johnson (servicio x cliente)))

PJservicio.nombre-cliente, ciudad cliente(SLsevicio.nombre-cliente=cliente.nombre-cliente (SLnombre_banquero=Johnson (servicio CP


cliente))) Y esta expresin nos da la respuesta correcta a la pregunta. La operacin renombrar Una ambigedad surge cuando la misma relacin aparece ms de una vez en una pregunta. Para ilustrarlo, considrese la consulta Encontrar los nombres de todos los clientes que viven en la misma calle y en la misma ciudad que Smith. Podemos obtener la calle y la ciudad de Smith escribiendo: calle, ciudad_cliente ( nombre_cliente =Smith (cliente)) Sin embargo, para encontrar otros clientes con esa calle y esa ciudad, debemos hacer eferencia, una segunda vez a la relacin cliente: (cliente) x nombre_sucursal, nombre_cliente (cliente)) donde p es un predicado de seleccin que requiere que los valores de calle y los valores de ciudad_cliente sean iguales. Para especificar a qu valor de calle nos referimos, no podemos usar cliente.calle, ya que ambos valores de calle se toman de la misma relacin cliente. Una dificultad parecida existe para cliente.ciudad. Este problema se resuelve utilizando el operador renombrar, representado por . La expresin x(r) nos devuelve la relacin r con el nombre de x. Usaremos sta para renombrar una referencia a la relacin cliente y as hacer referencia a la relacin sin ambigedad. En la consulta de abajo usaremos cliente2 como un segundo nombre para la relacin cliente: cliente.nombre_cliente ( cliente2.calle=cliente.calle cliente2.cliente_ciudad=cliente.cliente_ciudad (cliente x ( calle,ciudad_cliente ( nombre_cliente=Smith ( cliente2 (cliente)))))) La operacin unin Considere la siguiente consulta: Encontrar a todos los clientes de la sucursal Perryridge. Es decir, encontrar a todas las personas que tienen un prstamo, una cuenta o ambos. Para contestar a esta consulta, necesitamos la informacin de la relacin prstamo y de la relacin depsito. Sabemos cmo encontrar a todos los clientes con un prstamo en la sucursal Perryridge: nombre_cliente( nombre_sucursal=Perryridge(prstamo)) tambin sabemos cmo encontrar a todos los clientes con una cuenta en la sucursal Perryridge: nombre_cliente( nombre_sucursal=Perryridge(depsito)) para contestar esta consulta necesitamos la unin de estos dos conjuntos, es decir, todos los clientes que aparecen en cualquiera de las dos relaciones o en ambas. Esto se logra mediante la operacin binaria unin, representada, como en la teora de conjuntos por , o por UN. Tenemos: nombre_cliente( nombre_sucursal=Perryridge(prstamo)) nombre_cliente( nombre_sucursal=Perryridge(depsito)) PJnombre_cliente(SLnombre_sucursal=Perryridge(prstamo)) UN PJnombre_cliente(SLnombre_sucursal=Perryridge(depsito)) puesto que las operaciones son conjuntos se eliminan los valores duplicados. En general, debemos asegurarnos que las uniones se toman entre relaciones compatibles. Para que una operacin de unin r s sea vlida exigimos que se cumplan dos condiciones: 1. Las relaciones r y s deben tener el mismo nmero de atributos 2. Los dominios del atributo iesimo de r y del atributo psimo de s deben ser los mismo

Esto debido a que una unin de dos relaciones distintas no tendra sentido en la mayora de las situaciones. La operacin diferencia de conjuntos Esta operacin, representada por -, o por DF, nos permiten encontrar tuplas que estn en una relacin pero no en otra. La operacin r s da como resultado una relacin que contiene aquellas tuplas que estn en r pero no en s. Podemos encontrar a todos los clientes de la sucursal Perryridge que tienen una cuenta all, pero no un prstamo, escribiendo: nombre_cliente( nombre_sucursal=Perryridge(depsito)) - nombre_cliente( nombre_sucursal=Perryridge(prstamo)) PJnombre_cliente(SLnombre_sucursal=Perryridge(depsito)) DF PJnombre_cliente(SLnombre_sucursal=Perryridge(prstamo)) Operaciones adicionales Las operaciones fundamentales de lgebra relacional son suficientes para expresar cualquier consulta en lgebra relacional. Sin embargo, si nos restringimos slo a las operaciones fundamentales, algunas consultas comunes son largas de expresar. Por tanto, definimos operaciones adicionales que no aaden ninguna potencia al lgebra relacional, pero simplifican consultas comunes. La operacin interseccin de conjuntos Se representa con el siguiente smbolo: . Supngase que queremos encontrar a todos los clientes con un prstamo y una cuenta en la sucursal Perryridge. Escribimos: nombre_cliente( nombre_sucursal=Perryridge(prstamo)) nombre_cliente( nombre_sucursal=Perryridge(depsito)) Esta operacin se puede sustituir con un par de operaciones de diferencia de conjuntos. La operacin producto natural Frecuentemente se desea simplificar ciertas consultas que requieren de un producto cartesiano. Considrese la consulta Encontrar a todos los clientes que tienen un prstamo en un banco y las ciudades en las que viven. Primero formamos el producto cartesiano de las relaciones prstamo y cliente, despus seleccionamos aquellas tuplas que presentan un nico nombre-cliente. As, escribimos: prstamo.nombre-cliente, ciudad-cliente( prstamo.nombre-cliente=cliente.nombre-cliente (prstamo x cliente)) PJprstamo.nombre-cliente, ciudad-cliente(SLprstamo.nombre-cliente=cliente.nombre-cliente (prstamo CP cliente)) El producto natural es una operacin binaria que nos permite combinar ciertas selecciones y un producto cartesiano en una operacin. Se representa con el smbolo de producto |X|, o por, NCP, o bien por NJN (Natural Join). La operacin producto natural forma un producto cartesiano de sus dos argumentos, realiza una seleccin forzando la igualdad en aquellos atributos que aparezcan en ambas planificaciones de relaciones y, finalmente, quita las columnas duplicadas. Consideremos nuevamente el ejemplo: Encontrar a todos los clientes que tienen un prstamo en un banco y las ciudades en las que viven. Esta consulta puede expresarse usando el producto natural como sigue: prstamo.nombre-cliente, ciudad-cliente(prstamo |X| cliente)) PJprstamo.nombre-cliente, ciudad-cliente(prstamo NJN cliente))

Otro ejemplo es encontrar el activo y el nombre de todas las sucursales que tienen depositantes (es decir, clientes en una cuenta) que viven en Stamford nombre-sucursal, activo ( ciudad-cliente=Stamford(cliente |X| depsito |X| sucursal)) PJnombre-sucursal, activo (SLciudad-cliente=Stamford(cliente NJN depsito NJN sucursal)) Ntese que escribimos cliente x depsito x sucursal, sin insertar parntesis para especificar el orden en el que se van a ejecutar las operaciones de producto natural en las tres relaciones. En el caso anterior hay dos posibilidades: - (cliente |X| depsito) |X| sucursal - cliente |X| (depsito |X| sucursal) no se especific qu expresin queramos porque son equivalentes, es decir, la reunin natural es asociativa. Otro ejemplo es: Encontrar a todos los clientes que tienen una cuenta y un prstamo en la sucursal Perryridge nombre-cliente( nombre-sucursal=Perryridge(prstamo |X| depsito)) PJnombre-cliente(SLnombre-sucursal=Perryridge(prstamo NJN depsito)) que es equivalente al ejemplo de interseccin, por lo que decimos que en lgebra relacional es posible escribir varias expresiones de lgebra relacional equivalentes. La operacin divisin La operacin divisin representada por , o bien, por /, se establece para aquellas consultas que incluyen la frase para todos. Supngase que queremos encontrar a todos los clientes que tienen una cuenta en todas las sucursales que estn en Brooklyn. Podemos obtener todas las sucursales en Brooklyn mediante la expresin: r1 = nombre-sucursal ( ciudad-sucursal=Brooklyn(sucursal)) luego podemos encontrar el nombre y la sucursal del cliente, para los cuales el cliente tiene una cuenta en una sucursal, escribiendo: r2 = nombre-cliente, nombre-sucursal (depsito) Ahora necesitamos encontrar a los clientes que aparecen en r2 con cada nombre de sucursal en r1. La operacin que proporciona exactamente esos clientes es la operacin de dividir. La consulta puede contestarse escribiendo: nombre-cliente, nombre-sucursal (depsito) nombre-sucursal ( ciudad-sucursal=Brooklyn(sucursal)) nombre-cliente, nombre-sucursal (depsito) / nombre-sucursal ( ciudad-sucursal=Brooklyn(sucursal)) El resultado de esta expresin es una relacin que tiene el esquema (nombre-cliente) y contiene la tupla (Green).
La operacin asignacin A veces es conveniente escribir una expresin del lgebra relacional por partes usando la asignacin a una variable de relacin temporal. La operacin asignacin, representada por , funciona de forma parecida a la asignacin en un lenguaje de programacin. Podemos escribir r s como: temp R S (r) temp R S ((temp x s) r) La evaluacin de una asignacin no da como resultado una relacin que se presenta al usuario. Ms bien, el resultado de la expresin a la derecha de es asignado a la variable de la relacin a la izquierda de . Esta variable de relacin puede usarse en subsiguientes expresiones. Para consultas en lgebra relacional, la asignacin debe hacerse a una variable de relacin temporal.

Você também pode gostar