Escolar Documentos
Profissional Documentos
Cultura Documentos
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)))
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.