Los podemos dividir en dos tipos: Lenguajes
Formales y Lenguajes
Comerciales.
Los lenguajes formales están basados en el álgebra
relacional o
en el cálculo
relacional.
Solamente se han descrito para consulta a
Bases de Datos (existen lenguajes comerciales que además de consulta
permiten otras operaciones).
El álgebra relacional tiene procedimientos (procedimental), mientras
que los lenguajes basados en el cálculo relacional son
aprocedimentales. Dentro del cálculo relacional se distingue entre cálculo
relacional orientado a tuplas y cálculo
relacional orientado a dominios.
Los lenguajes comerciales, en su mayoría usan enfoques tanto
procedimentales como aprocedimentales, o lo que es lo mismo, no son
lenguajes puros como los formales. De esta manera hacen su sintaxis
más amigable al usuario.
4.1 Lenguajes Formales
Álgebra Relacional
A) Operaciones fundamentales: Tiene
cinco por medio de las cuales se puede realizar cualquier consulta.
Son las siguientes:
1.- Selección (σ).
Es una operación unaria (actúa sobre una relación única). Sirve para
obtener determinadas tuplas de una relación, basándose en que dichas
tuplas cumplan un predicado determinado P. Su sintaxis es la
siguiente: σP (r),
donde r es la relación sobre la que se actúa y P es el predicado que
debe cumplirse.
Si por ejemplo tenemos la relación: estudiante
= (NE, nombre, edad, dccion) y
queremos seleccionar al estudiante 2249 tendremos que hacer: σ NE
=2249(estudiante)
El predicado de selección admite los siguientes operadores
relacionales: < , ≤ , > , ≥ , = . Además un predicado puede estar
compuesto por varias condiciones unidas por los conectivos ∧ u ∨.
Ejemplo: σ nombre
= "Pepe" ∧ edad
> 25 (estudiante)
De esta manera se seleccionarían todos los estudiantes llamados Pepe
y cuya edad supere los 25 años.
2.- Proyección (Π):
Es también una operación unaria. Proyecta una nueva relación con un
nuevo esquema en el cual aparezcan solamente los atributos que se
especifican en la operación.
Sintaxis: Π A1
,..., An (r).
Donde A1 ,....,
An es
la lista de atributos y "r" la relación sobre la que se actúa. Si,
por ejemplo, queremos tener toda la relación de estudiantes, pero
sólo con el nombre haríamos:
Πnombre (estudiante)
Si quisiésemos obtener el nombre del estudiante 224: Πnombre (σ NE
= 2249 (estudiante))
3.- Producto
Cartesiano (r1 x
r2):
Si el número de tuplas de r1 es
n1,
y el número de tuplas de r2 es
n2,
el número de tuplas de la relación obtenida será n1·n2.
Veamos un ejemplo: Supongamos que tenemos las siguientes
relaciones:
Cliente = (nombre_cliente, ciudad, calle)
Sucursal = (nombre_sucursal, activo, ciudad)
Prestamo = (num_prestamo, nombre_sucursal, nombre_cliente, importe)
Deposito = (num_cuenta, nombre_sucursal, nombre_cliente, saldo)
Si realizamos el producto cliente x prestamo, el esquema sería la
unión de los esquemas:
(cliente.nombre_cliente, ciudad, calle, num_prestamo,
nombre_sucursal, prestamo.nombre_cliente, importe)
Como tuplas obtenemos las posibles combinaciones de tuplas de
cliente con tuplas de prestamo.
Habrá muchas tuplas de la nueva relación en las que se cumplirá
que: t[cliente.nombre_cliente] ≠
t[prestamo.nombre_cliente]
Por ello, normalmente la operación de producto cartesiano va unida a
una selección que de entre todas las posibles combinaciones de
tuplas selecciona las que cumplen unas condiciones. Por ejemplo,
queremos localizar los clientes y las ciudades donde viven que
tengan un préstamo.
Π prestamo.nombre_cliente, ciudad (σprestamo.nombre_cliente
= cliente.nombre_cliente (cliente
x prestamo))
4.- Unión
de Conjuntos (r1 ∪
r2):
Actúa sobre dos relaciones uniéndolas. El resultado es, por tanto,
una nueva relación con el mismo esquema que las relaciones
implicadas y con un número de tuplas que es la unión de las tuplas
de r1 y
r2 (los
elementos duplicados se desechan).
r1 y
r2 deben
tener el mismo esquema, es decir, los dominios de los atributos i-ésimos
de cada uno de los esquemas debe coincidir.
En el ejemplo que estamos considerando, no podríamos hacer la unión
de cliente con préstamo, pero sí sería posible hacer esto otro por
ejemplo
(Π nombre_cliente (cliente))
∪ (Πnombre_cliente (prestamo)) Con
la anterior operación obtendríamos los nombres de los clientes que
tienen préstamo o no. En la práctica esta sería una operación
inútil, puesto que se supone que todos los que tienen un préstamo en
un banco son automáticamente clientes del banco. Veamos otra unión
que sería de mayor utilidad: si queremos conocer los clientes que
tienen en la sucursal 2 una cuenta, un préstamo, o ambas cosas, la
operación a realizar sería:
(Π nombre_cliente (σnombre_sucursal
= "2" (prestamo)))
∪ (Πnombre_cliente(σnombre_sucursal
= "2"(deposito)))
5.- Diferencia
de Conjuntos (r1 -
r2):
Es una operación binaria que da como resultado una relación con los
elementos que están en r1,
y no están en r2.
Lógicamente r1 y
r2 deben
tener el mismo esquema.
Esta operación se podría utilizar, si por ejemplo queremos saber el
nombre de los clientes que tienen un préstamo en la sucursal
principal, pero que no tienen cuenta en dicha sucursal:
(Πnombre_cliente (σnombre_sucursal
= "Principal" (prestamo))) - (Π nombre_cliente (σnombre_sucursal
= "Principal" (deposito)))
Con las cinco operaciones definidas (operaciones fundamentales) se
puede realizar cualquier consulta en álgebra relacional. Aun así,
existen otras operaciones (operaciones adicionales), que facilitan
algunos tipos de consulta frecuente, y que puede resultar muy
tedioso el hacerlas mediante las operaciones fundamentales.
B) Operaciones Adicionales: 1.- Intersección
de Conjuntos (r1 ∩
r2):
Da como resultado una relación que contiene los elementos comunes a
r1y
r2.
Es adicional, ya que es equivalente a realizar r1 -
(r1 -
r2).
Por ejemplo, podríamos obtener los nombres de los clientes que
tienen depósito y préstamo al mismo tiempo en la sucursal 10.
(Π nombre_cliente (σnombre_sucursal
= "10" (prestamo))) ∩ (Πnombre_cliente (σnombre_sucursal
="10" (deposito)))
6.- Unión
Join o Producto Theta (r1
Θ P r2):
Es una forma de expresar un producto cartesiano que lleva implícita
una selección. P representa el predicado de la selección. De esta
manera, otra forma de conocer los nombres de los clientes que tienen
préstamo, cuenta o ambas cosas en la sucursal 10 sería:
(Πnombre_cliente (σnombre_sucursal
= "10" (prestamo))) Θ prestamo.nombre_cliente
= deposito.nombre_cliente(Πnombre_cliente (σnombre_sucursal
= "10" (deposito)))
Otra forma de conseguir esto mismo sería:
Πprestamo.nombre_cliente (prestamo
Θprestamo.nombre_cliente
= deposito.nombre_cliente ∧deposito)
prestamo.nombre_sucursal = "10" ∧
deposito.nombre_sucursal = "10"
Podemos afirmar que:
r1 Θ P r2 = σP (r1 x
r2)
7.- Producto
Natural (r1
r2):
Mejora la operación anterior, devolviendo directamente las tuplas
que tienen atributos comunes. En otras palabras, realiza la
proyección sobre la unión de los esquemas, es decir, elimina uno de
los atributos comunes a ambas relaciones y selecciona aquellas
tuplas cuyos atributos comunes coinciden en valor.
El siguiente ejemplo devuelve una
relación con los nombres de los clientes que tienen préstamo,
depósito o ambas cosas en la sucursal 10.
Π nombre_cliente (σnombre_sucursal
= "10" (prestamo
ℵdeposito))
Dados r1(R1) y r2(R2)
dos relaciones con sus respectivos esquemas, se cumple la
siguiente igualdad:
r1 ℵ
r2 =
ΠR1 ∪ R2 (σr1.A1
=r2.A1 ∪ .........∪ r1.An = r2.An (r1 x
r2))
Al ser unión de esquemas, como los elementos de los esquemas son
los nombres de los atributos, si existe una columna común a R1 y
R2sólo aparecerá una vez.