Álgebra relacional
El álgebra relacional es un conjunto de operaciones que describen paso a paso cómo computar una respuesta sobre las relaciones, tal y como éstas son definidas en el modelo relacional. Denominada de tipo procedimental, a diferencia del Cálculo relacional que es de tipo declarativo.
Describe el aspecto de la manipulación de datos. Estas operaciones se usan como una representación intermedia de una consulta a una base de datos y, debido a sus propiedades algebraicas, sirven para obtener una versión más optimizada y eficiente de dicha consulta.
Índice
1 Tuplas
2 Unión compatible
2.1 Grado (Paridad)
3 Las operaciones
3.1 Básicas
3.1.1 Selección - restricción (σ)
3.1.2 Proyección (Π)
3.1.3 Producto cartesiano (x)
3.1.4 Unión (∪)
3.1.5 Diferencia (-)
3.2 No básicas o Derivadas
3.2.1 Intersección (∩)
3.2.2 Unión natural (⋈) (Natural Join)
3.2.3 División (/) (Cociente)
3.2.4 Agrupación (Ģ) (Unión)
4 Ejemplos
4.1 Mostrar los nombres de los alumnos y su apoderado
4.2 Mostrar el nombre de los alumnos inscritos y el nombre de los cursos que tomaron
4.3 Mostrar los nombres y precios de los cursos inscritos con valor menor a 3.000
5 Véase también
6 Enlaces externos
Tuplas
Una tupla se define como una función finita que asocia unívocamente los nombres de los campos de una relación con los valores de una instanciación de la misma. En términos simples, es una fila de una tabla relacional.
Unión compatible
Una unión es compatible entre dos relaciones R, S, si ellas poseen el mismo grado y el dominio del i-ésimo elemento de la relación R es el mismo que el i-ésimo elemento de la relación S.
Grado (Paridad)
Número de atributos.
Las operaciones
Básicas
Cada operador del álgebra acepta una o dos relaciones y retorna una relación como resultado.
σ y Π son operadores unarios, el resto de los operadores son binarios. Las operaciones básicas del álgebra relacional son:
Selección - restricción (σ)
Permite seleccionar un subconjunto de tuplas de una relación (R), todas aquellas que cumplan la(s) condición(es) P, esto es:
- σP(R){displaystyle sigma _{P}(R)!}
Ejemplo:
- σApellido=Gomez(Alumnos){displaystyle sigma _{Apellido=Gomez}(Alumnos)!}
Selecciona todas las tuplas que contengan Gómez como apellido en la relación Alumnos.
Una condición puede ser una combinación booleana, donde se pueden usar operadores como: ∧{displaystyle wedge } , ∨{displaystyle vee }, combinándolos con operadores <,>,≤,≥,=,≠{displaystyle <,>,leq ,geq ,=,neq }.
Proyección (Π)
Permite extraer columnas (atributos) de una relación, dando como resultado un subconjunto vertical de atributos de la relación, esto es:
- ΠA1,A2,…,An{displaystyle Pi _{A_{1},A_{2},dots ,A_{n}}!}
donde A1,A2,…,An{displaystyle A_{1},A_{2},dots ,A_{n}} son atributos de la relación R .
Ejemplo:
- ΠApellido,Semestre,NumeroControl(Alumnos){displaystyle Pi _{Apellido,Semestre,NumeroControl}(Alumnos)!}
Selecciona los atributos Apellido, Semestre y NumeroControl de la relación Alumnos, mostrados como un subconjunto de la relación Alumnos.
Producto cartesiano (x)
El producto cartesiano de dos relaciones se escribe como:
- R×S{displaystyle Rtimes S}
y entrega una relación, cuyo esquema corresponde a una combinación de todas las tuplas de R con cada una de las tuplas de S, y sus atributos corresponden a los de R seguidos por los de S.
Ejemplo:
- Alumnos×Maestros{displaystyle Alumnostimes Maestros}
Muestra una nueva relación, cuyo esquema contiene cada una de las tuplas de la relación Alumnos junto con las tuplas de la relación Maestros, mostrando primero los atributos de la relación Alumnos seguidos por las tuplas de la relación Maestros.
Unión (∪)
La operación
- R∪S{displaystyle Rcup S}
retorna el conjunto de tuplas que están en R, o en S, o en ambas.
R y S deben ser uniones compatibles.
Diferencia (-)
La diferencia de dos relaciones, R y S denotada por:
- R−S{displaystyle R-S!}
entrega todas aquellas tuplas que están en R, pero no en S.
R y S deben ser uniones compatibles.
Estas operaciones son fundamentales en el sentido en que (1) todas las demás operaciones pueden ser expresadas como una combinación de éstas y (2) ninguna de estas operaciones pueden ser omitidas sin que con ello se pierda información.
No básicas o Derivadas
Entre los operadores no básicos tenemos:
Intersección (∩)
La intersección de dos relaciones se puede especificar en función de otros operadores básicos:
- R∩S=R−(R−S){displaystyle Rcap S=R-(R-S)}
La intersección, como en Teoría de conjuntos, corresponde al conjunto de todas las tuplas que están en R y en S, siendo R y S uniones compatibles.
Unión natural (⋈) (Natural Join)
La operación unión natural en el álgebra relacional es la que permite reconstruir las tablas originales previas al proceso de normalización. Consiste en combinar las proyección, selección y producto cartesiano en una sola operación, donde la condición θ{displaystyle theta } es la igualdad Clave Primaria = Clave Externa (o Foránea), y la proyección elimina la columna duplicada (clave externa).
Expresada en las operaciones básicas, queda
- R⋈S=ΠA1,A2...An(σθ(R×S)){displaystyle Rbowtie S=Pi _{A1,A2...An}(sigma _{theta }(Rtimes S))}
Una reunión theta ( θ-Join) de dos relaciones es equivalente a:
- R⋈θS=σθ(R×S){displaystyle Rbowtie _{theta }S=sigma _{theta }(Rtimes S)}
donde la condición θ{displaystyle theta } es libre.
Si la condición θ{displaystyle theta } es una igualdad se denomina EquiJoin.
División (/) (Cociente)
Supongamos que tenemos dos relaciones A(x, y) y B(y) donde el dominio de y en A y B, es el mismo.
El operador división A / B retorna todos los valores de x tales que para todo valor y en B existe una tupla ⟨x,y⟩{displaystyle langle x,yrangle } en A.
Agrupación (Ģ) (Unión)
Permite agrupar conjuntos de valores en función de un campo determinado y hacer operaciones con otros campos.
Ejemplos
Suponga las relaciones o tablas:
ID | NOMBRE | CIUDAD | EDAD |
01 | Pedro | Santiago | 14 |
11 | Juan | Buenos Aires | 18 |
21 | Diego | Lima | 12 |
31 | Rosita | Concepción | 15 |
41 | Manuel | Lima | 17 |
ID | NOMBRE | FONO | ID_ALUMNO |
054 | Víctor | 654644 | 21 |
457 | José | 454654 | 11 |
354 | María | 997455 | 31 |
444 | Paz | 747423 | 01 |
COD | NOMBRE | FECHA_INICIO | DURACIÓN | VALOR |
01142 | Psicología | 13-01 | 15 | 3.000 |
02145 | Biología | 15-02 | 12 | 2.500 |
03547 | Matemáticas | 01-03 | 30 | 4.000 |
04578 | Música | 05-04 | 10 | 1.500 |
05478 | Física | 20-04 | 15 | 3.200 |
ID | ID_AL | COD |
1 | 01 | 05478 |
2 | 01 | 02145 |
3 | 11 | 03547 |
4 | 21 | 02145 |
5 | 41 | 03547 |
Mostrar los nombres de los alumnos y su apoderado
Primero, realizaremos una combinación entre alumnos y apoderados (pues necesitamos saber a que alumno le corresponde tal apoderado). La combinación realizará un producto cartesiano, es decir, para cada tupla de alumnos (todas las filas de alumnos) hará una mezcla con cada una tupla de apoderados y seleccionará aquellas nuevas tuplas en que alumnos.id sea igual a apoderados.id_alumno, esto es:
ID (alumno) | NOMBRE (alumno) | CIUDAD | EDAD | ID (apoderado) | NOMBRE (apoderado) | FONO | ID_ALUMNO |
01 | Pedro | Santiago | 14 | 054 | Víctor | 654644 | 21 |
01 | Pedro | Santiago | 14 | 457 | José | 454654 | 11 |
01 | Pedro | Santiago | 14 | 354 | María | 997455 | 31 |
01 | Pedro | Santiago | 14 | 444 | Paz | 747423 | 01 |
11 | Juan | Buenos Aires | 18 | 054 | Víctor | 654644 | 21 |
11 | Juan | Buenos Aires | 18 | 457 | José | 454654 | 11 |
11 | Juan | Buenos Aires | 18 | 354 | María | 997455 | 31 |
11 | Juan | Buenos Aires | 18 | 444 | Paz | 747423 | 01 |
21 | Diego | Lima | 12 | 054 | Víctor | 654644 | 21 |
21 | Diego | Lima | 12 | 457 | José | 454654 | 11 |
21 | Diego | Lima | 12 | 354 | María | 997455 | 31 |
21 | Diego | Lima | 12 | 444 | Paz | 747423 | 01 |
31 | Rosita | Concepción | 15 | 054 | Víctor | 654644 | 21 |
31 | Rosita | Concepción | 15 | 457 | José | 454654 | 11 |
31 | Rosita | Concepción | 15 | 354 | María | 997455 | 31 |
31 | Rosita | Concepción | 15 | 444 | Paz | 747423 | 01 |
41 | Manuel | Lima | 17 | 054 | Víctor | 654644 | 21 |
41 | Manuel | Lima | 17 | 457 | José | 454654 | 11 |
41 | Manuel | Lima | 17 | 354 | María | 997455 | 31 |
41 | Manuel | Lima | 17 | 444 | Paz | 747423 | 01 |
Por tanto, el resultado final de la combinación es:
ID (alumno) | NOMBRE (alumno) | CIUDAD | EDAD | ID (apoderado) | NOMBRE (apoderado) | FONO | ID_ALUMNO |
01 | Pedro | Santiago | 14 | 444 | Paz | 747423 | 01 |
11 | Juan | Buenos Aires | 18 | 457 | José | 454654 | 11 |
21 | Diego | Lima | 12 | 054 | Víctor | 654644 | 21 |
31 | Rosita | Concepción | 15 | 354 | María | 997455 | 31 |
Ahora, aquí debemos mostrar solo el nombre del alumno y el nombre del apoderado, esto lo hacemos con un Proyect o Proyección, donde la tabla final sería:
NOMBRE (alumno) | NOMBRE (apoderado) |
Pedro | Paz |
Juan | José |
Diego | Víctor |
Rosita | María |
Resumiendo en un solo paso:
ΠAlumnos.NOMBRE,Apoderados.NOMBRE({displaystyle Pi _{Alumnos.NOMBRE,Apoderados.NOMBRE}{big (}}Alumnos ⋈{displaystyle bowtie }Alumnos.ID = Apoderados.ID_ALUMNO{displaystyle {}_{Alumnos.ID{mbox{ }}={mbox{ }}Apoderados.ID_ALUMNO}} Apoderados){displaystyle {big )}}
Se lee: Proyecta los nombre de alumnos y nombre de apoderados de los alumnos cuyo ID sea el mismo que el ID_ALUMNO de los apoderados.
Mostrar el nombre de los alumnos inscritos y el nombre de los cursos que tomaron
Comenzaremos con una combinación entre los inscritos y los cursos para obtener el nombre de los cursos:
- Inscritos⋈Inscritos.COD=Cursos.CODCursos{displaystyle Inscritosbowtie _{Inscritos.COD=Cursos.COD}Cursos}
Lo que nos da la tabla:
ID | ID_AL | COD (inscritos) | COD (cursos) | NOMBRE | FECHA_INICIO | DURACION | VALOR |
1 | 01 | 05478 | 05478 | Física | 20-04 | 15 | 3.200 |
2 | 01 | 02145 | 02145 | Biología | 15-02 | 12 | 2.500 |
3 | 11 | 03547 | 03547 | Matemáticas | 01-03 | 30 | 4.000 |
4 | 21 | 02145 | 02145 | Biología | 15-02 | 12 | 2.500 |
5 | 41 | 03547 | 03547 | Matemáticas | 01-03 | 30 | 4.000 |
Como podemos observar, la combinación solo nos entrega las combinaciones entre Inscritos y Cursos en que COD sea igual entre los inscritos y el curso correspondiente.
Ahora necesitamos los nombres de los alumnos inscritos. Al resultado anterior (Resultado 1) aplicaremos una nueva combinación comparando los ID de los alumnos para colocar el nombre adecuado con el estudiante adecuado:
Resultado 1 ⋈{displaystyle bowtie }Resultado 1.ID_AL = Alumnos.ID{displaystyle {}_{Resultado{mbox{ }}1.ID_AL{mbox{ }}={mbox{ }}Alumnos.ID}} Alumnos
O escrito todo junto:
({displaystyle {big (}}Inscritos ⋈{displaystyle bowtie }Inscrito.COD = Curso.COD{displaystyle {}_{Inscrito.COD{mbox{ }}={mbox{ }}Curso.COD}}Cursos){displaystyle {big )}} ⋈{displaystyle bowtie }Resultado 1.ID_AL = Alumnos.ID{displaystyle {}_{Resultado{mbox{ }}1.ID_AL{mbox{ }}={mbox{ }}Alumnos.ID}} Alumnos
La tabla de este nuevo resultado sería:
ID (inscrito) | ID_AL | COD (inscritos) | COD (cursos) | NOMBRE (curso) | FECHA_INICIO | DURACION | VALOR | ID (alumno) | NOMBRE (alumno) | CIUDAD | EDAD |
1 | 01 | 05478 | 05478 | Física | 20-04 | 15 | 3.200 | 01 | Pedro | Santiago | 14 |
2 | 01 | 02145 | 02145 | Biología | 15-02 | 12 | 2.500 | 01 | Pedro | Santiago | 14 |
3 | 11 | 03547 | 03547 | Matemáticas | 01-03 | 30 | 4.000 | 11 | Juan | Buenos Aires | 18 |
4 | 21 | 02145 | 02145 | Biología | 15-02 | 12 | 2.500 | 21 | Diego | Lima | 12 |
5 | 41 | 03547 | 03547 | Matemáticas | 01-03 | 30 | 4.000 | 41 | Manuel | Lima | 17 |
Finalmente con una Proyección mostraremos el nombre del alumno y el curso inscrito:
ΠResultado2.NOMBRE (alumno),Resultado2.NOMBRE (curso){displaystyle Pi _{Resultado2.NOMBRE{mbox{ }}(alumno),Resultado2.NOMBRE{mbox{ }}(curso)}}({displaystyle {big (}}Resultado 2){displaystyle {big )}}
Donde la tabla final sería:
NOMBRE (alumno) | NOMBRE (curso) |
Pedro | Física |
Pedro | Biología |
Juan | Matemáticas |
Diego | Biología |
Manuel | Matemáticas |
La expresión completa sería:
ΠResultado2.NOMBRE (alumno),Resultado2.NOMBRE (curso)(({displaystyle Pi _{Resultado2.NOMBRE{mbox{ }}(alumno),Resultado2.NOMBRE{mbox{ }}(curso)}{Big (}{big (}}Inscritos )⋈{displaystyle {big )}bowtie } Inscritos.COD = Cursos.COD{displaystyle {}_{Inscritos.COD{mbox{ }}={mbox{ }}Cursos.COD}}Cursos)⋈{displaystyle {big )}bowtie } Resultado1.ID_AL = Alumnos.ID{displaystyle {}_{Resultado1.ID_AL{mbox{ }}={mbox{ }}Alumnos.ID}} Alumnos){displaystyle {Big )}}
Mostrar los nombres y precios de los cursos inscritos con valor menor a 3.000
ΠResultado1.NOMBRE, Resultado1.VALOR(δCurso.VALOR<3000({displaystyle Pi _{Resultado1.NOMBRE,{mbox{ }}Resultado1.VALOR}{Big (}delta _{Curso.VALOR<3000}{big (}}Resultado 1)){displaystyle {big )}{Big )}}
Lo que nos entregaría la tabla:
NOMBRE | VALOR |
Biología | 2.500 |
Musica | 1.500 |
Y la expresión completa sería:
ΠResultado1.NOMBRE, Resultado1.VALOR(δResultado1.VALOR<3000({displaystyle Pi _{Resultado1.NOMBRE,{mbox{ }}Resultado1.VALOR}{Big (}delta _{Resultado1.VALOR<3000}{big (}}Curso⋈Curso.COD=Inscrito.COD{displaystyle bowtie _{Curso.COD=Inscrito.COD}}Inscrito)){displaystyle {big )}{Big )}}
Véase también
- Base de datos relacional
- Relación matemática
- Modelo relacional
- Modelo de datos
- Cálculo relacional
- SQL
Enlaces externos
- RAT, Software Relational Algebra Translator to SQL
- TQL, a relational query language draft proposal
- LEAP - An implementation of the relational algebra
WinRDBI Home, Educational Tool (enlace roto disponible en Internet Archive; véase el historial y la última versión).
- Pireal - Educational tool for working with Relational Algebra
- WinRDBI - Educational tool for working with Relational Algebra and other formal languages
- DES - Educational tool for working with Relational Algebra and other formal languages