Está en la página 1de 39

Bases de datos

3
Javier Arroyo
Yolanda García
Luis Garmendia
Virginia Francisco Gilmartín
Iván Martínez
Fernando Sáenz
Facultad de Informática
Universidad Complutense
(Modificado y adaptado por María Cruz Valiente Blázquez
para el Grado en Ingeniería del Software)
1. Introducción

2. Estructuras de datos

3. Restricciones

4. Transformación del modelo E/R a modelo relacional

5. Lenguajes de consulta

1
 Un lenguaje de consulta es un lenguaje con el que los usuarios
solicitan datos de la BD.
 Estos lenguajes suelen ser de nivel superior (más abstractos)
que el de los lenguajes de programación habituales.
 Clasificación:
— Procedimientales
─ El usuario indica al sistema que lleve a cabo una serie de
operaciones en la BD para calcular el resultado.
— No procedimientales
─ El usuario describe la información deseada sin dar un
procedimiento concreto para obtener la información.

2
 Lenguajes formales del modelo relacional:
— Álgebra relacional (procedimental)
— Basados en cálculo (no procedimental):
─ Cálculo relacional de tuplas (TRC - Tuple Relational Calculus).
─ Cálculo relacional de dominios (DRC - Domain Relational Calculus).
 Lenguajes prácticos de los SGBD (basados en TRC):
— QBE (Query By Example)
— SQL (Structured Query Language)
 Otros lenguajes:
— Datalog (basado en DRC)
 El álgebra relacional es la base de la parte de consultas del lenguaje
SQL.

3
 Lenguaje de consulta procedimental basado en álgebra de conjuntos
de la teoría matemática de conjuntos:
— No incluye operaciones de modificación de datos.
— Cada operación realizada genera una nueva relación en el MR que se puede
manipular a su vez a través de otras operaciones del álgebra.
 Las consultas se definen mediante la aplicación de una serie de
operaciones sobre las relaciones definidas en la BD:
— Operaciones de teoría de conjuntos: Unión ∪, Intersección ∩ ,
Diferencia ─ y Producto cartesiano ×.
— Renombramiento ρ.
— Selección σ.
— Proyección π .
— Reunión (JOIN o producto cartesiano con condición) ⨝
— División ÷.
 También se considera la asignación (←) sobre relaciones temporales
para dar un nombre a los resultados intermedios.

4
 Unión, intersección, diferencia y producto cartesiano.
 Operaciones binarias.
 Para las tres primeras (unión, intersección y diferencia),
las relaciones deben ser compatibles, es decir, han de tener
el mismo número de atributos y mismo dominio en cada
posición i:
R1 (A1, A2, ... An) R2 (B1, B2, … Bn)
Para todo i, 1 ≤ i ≤ n, Dom (Ai) = Dom (Bi)
 El resultado de estas operaciones será otra relación (no
repite tuplas).
 En la relación resultante, los atributos serán los de la
relación que se ponga como primer operando.

5
 Unión (R ∪ S): produce una relación con todas las tuplas
que están en R o en S. Las tuplas duplicadas se eliminan.
 Intersección (R ∩ S): produce una relación con las tuplas
que aparezcan tanto en R como en S. La intersección se
puede definir en función de la unión y la diferencia.
 Diferencia (R ─ S): produce una relación con instancias que
aparecen en R pero no en S.
 Producto cartesiano (R × S): no exige que las relaciones
sean compatibles. A partir de dos relaciones especificadas,
construye una relación concatenando cada tupla de la
primera relación con cada una de las tuplas de la segunda,
siempre y cuando ambas satisfagan una condición dada. Si
dos atributos tienen el mismo nombre se renombran.
R (A1, ..., An) × S (B1, ..., Bm) → (A1, ..., An, B1, ..., Bm)

6
PRODUCTO CARTESIANO. Ejemplo:
EMPLEADO (dni, numdep)
DEPARTAMENTO (nd, nomd)
EMPLEADO (dni, numdep) DEPARTAMENTO (nd, nomd)
123 1 1 'Ventas'
456 2 2 'Contabilidad'
235 2

EMPLEADO X DEPARTAMENTO
dni numdep nd nomd
123 1 1 'Ventas'
123 1 2 'Contabilidad'
456 2 1 'Ventas'
456 2 2 'Contabilidad'
235 2 1 'Ventas'
235 2 2 'Contabilidad'
7
 La operación de selección da como resultado un conjunto de
tuplas que cumplen la condición de selección aplicada sobre la
entrada.
 σc(R): conjunto de tuplas de la relación R que cumplen la
condición c (una expresión lógica).
— R será un esquema de relación o una expresión que lo represente.
— c será un conjunto de comparaciones conectadas entre sí mediante
expresiones booleanas (∧, ∨, ¬).
— Cada comparación será de la forma:
─ <nombre atributo de R> OPCOMP <nombre atributo de R>
─ <nombre atributo de R> OPCOMP <valor constante>
─ donde OPCOMP será un operador de comparación: =, ≠, <, ≤, >, ≥.
 El resultado de la consulta es una relación con los mismos
atributos que la original.

8
Ejemplo:
EMPLEADO (dni, nom, ap1, ap2, sueldo)
 Empleados con sueldo superior a 1.200 €:
σsueldo > 1200 (EMPLEADO)
 Empleados cuyos apellidos sean iguales:
σap1 = ap2 (EMPLEADO)
 Empleados con sueldo superior a 1.200 € y cuyos apellidos
sean iguales:
σ (sueldo > 1200) ∧ (ap1 = ap2) (EMPLEADO)

9
 La operación de proyección extrae los atributos especificados
de una relación dada eliminando las tuplas duplicadas.
— Los atributos que se desean obtener se colocan como subíndice
de la operación, separados por comas.
 πLISTA_ATRIBUTOS (R): conjunto de tuplas de R con los atributos de
la lista.
— R es un esquema de relación o una expresión que lo represente.
— LISTA_ATRIBUTOS será una sucesión de atributos separados por
comas.
 Una proyección no repite tuplas porque su resultado es una
relación que a su vez es un conjunto de tuplas.
— Los conjuntos no repiten elementos.
— Dos tuplas son iguales si son iguales atributo por atributo.

10
Ejemplo:
EMPLEADO (dni, nom, ap1, ap2, sueldo)
 DNI y sueldo de todos los empleados:
π dni, sueldo (EMPLEADO)
 DNI de los empleados con más de 1.200 € de sueldo:
π dni ( σ sueldo > 1200 (EMPLEADO) )
 DNI de los empleados con más de 1.200 € de sueldo en 'dos
pasos':
r1 ← σ sueldo > 1200 (EMPLEADO) /* Tuplas con sueldo > 1200 */
r2 ← π dni (r1) /* DNI empleados con sueldo > 1200 */

11
 La operación de renombramiento permite cambiar el
nombre del esquema y de las columnas de otro esquema.
 ρE(LISTA_ATRIBUTOS)(R):
produce una relación con nombre E que
contiene los atributos indicados en LISTA_ATRIBUTOS.
— R será un esquema de relación o una expresión que lo represente.
— E será el nombre del esquema resultante.
— LISTA_ATRIBUTOS será una sucesión de atributos separados por
comas. Éstos serán los nuevos nombres para los atributos definidos
en el esquema R para el esquema E.
 La relación resultante contiene las mismas tuplas y
número de atributos que el esquema original.

12
Ejemplo:
EMPLEADO (dni, nom, ap1, ap2, sueldo)
 Los atributos de una relación se pueden renombrar para facilitar
su manejo:
/* Renombramiento de dni a DNI */
ρEMPLEADO(DNI,nom,ap1,ap2,sueldo) (EMPLEADO)
/* Renombramiento de todos los atributos */
ρEMPLEADO(d,n,a1,a2,s) (EMPLEADO)
 Es también posible realizar "copias" de relaciones renombrando
o no sus atributos (aunque no se hacen persistentes):
/* Copia de EMPLEADO a EMPLEADO1 sin renombrar atributos */
ρEMPLEADO1(dni, nom, ap1, ap2, sueldo) (EMPLEADO)

13
Para el siguiente esquema se pide obtener el DNI de los empleados
que trabajan en el departamento 'Contabilidad'.

EMPLEADO (dni, numdep) DEPARTAMENTO (nd, nomd)


123 1 1 'Ventas'
456 2 2 'Contabilidad'
235 2
987 1

Pasos a seguir:
 Combinar los datos de ambas tablas.
 Quedarse con las filas donde cada empleado aparezca junto a su departamento
y además el nombre del departamento sea 'Contabilidad'
 Filtrar campos para obtener DNI.

14
Solución 1:
res ← πdni ( σnumdep = nd ∧ nomd = 'Contabilidad' (EMPLEADO × DEPARTAMENTO) )

Solución 2:
r1 ← σnomd = 'contabilidad' (DEPARTAMENTO) /* Tuplas con NOMD = 'Contabilidad'*/

r2 ← πnd (r1)
r3 ← EMPLEADO × r2 /* Prod. cartesiano como antes, pero solo con ND */

r4 ← σnumdep = nd (r3) /* Tuplas de los empleados de 'Contabilidad'.*/

res ← πdni (r4) /* Escoger solamente el DNI. */

15
 En un producto cartesiano podría aparecer el mismo
nombre de atributo en las dos relaciones.
— Un convenio de denominación permite distinguir unos
atributos de otros:
─ Se adjuntan el nombre de la relación de la que procede el
argumento.

— Si el producto cartesiano contiene dos veces la misma


tabla se soluciona utilizando renombramiento.

16
Ejemplo: Para el siguiente esquema se pide obtener el DNI de los empleados que
trabajan en el departamento 'Contabilidad'.

EMPLEADO (dni, num) DEPARTAMENTO (num, nomd)

Solución 1 (sin renombramiento):


res ← πdni (σEMPLEADO.num = DEPARTAMENTO.num ∧ nom = 'Contabilidad' (EMPLEADO × DEPARTAMENTO))
Solución 2 (a través de renombramiento):
r1 ← σnomd = 'Contabilidad' (DEPARTAMENTO) /* tuplas con nomd = 'Contabilidad' */

r2 ← ρnumdep (πnum (r1)) /* renombramiento */


r3 ← EMPLEADO × r2 /* producto cartesiano */

r4 ← σnum = numdep (r3) /* tuplas de los empleados de 'Contabilidad'. */

res ← πdni (r4) /* Escoger solamente el DNI. */

17
Para el siguiente esquema se pide obtener el nombre de los
empleados que trabajan en proyectos dirigidos por 'López'.

EMPLEADO (dni, nom) PROYECTO (np, director)

TRABAJA ( dnie, npro )

Observaciones:
— El atributo que formará la relación resultado está en EMPLEADO.
— El atributo sobre el que se aplica la condición está en PROYECTO.
— Se deben combinar los datos de las relaciones y luego filtrar para
obtener aquellas filas donde los atributos de reunión coinciden,
además de aplicar las condiciones correspondientes.

18
Solución:
r1 ← πnp (σdirector = 'López' (PROYECTO)) /* np de proyectos dirigidos por López. */
r2 ← TRABAJA × r1 /* combinación de proyectos con TRABAJA. */

r3 ← σnp = npro (r2) /* selección de las filas que contienen datos relacionados. */

r4 ← πdnie (r3) /* aquí solo se tiene el dni, están pidiendo el nombre. */


r5 ← r4 × EMPLEADO /* mismo proceso de combinación y selección .*/

r6 ← σdni = dnie (r5)

res ← πnom (r6) /* resultado final*/

19
Para el siguiente esquema se pide obtener el DNI de los empleados
cuyo supervisor gana más de 2.000 €.

EMPLEADO (dni, sueldo, dnisupervisor)

Solución 1: Solución 2:
emp1← ρ(dni1, s1, dni_s1) (EMPLEADO) r1← σsueldo > 2000 (EMPLEADO)
r1 ← EMPLEADO × emp1
r2 ← ρ(dni_s) (πdni (r1))
r2 ← σdnisupervisor = dni1 ∧ s1 > 2000 (r1)
r3 ← EMPLEADO × r2
res ← πdni (r2)
r4 ← σdnisupervisor = dni_s (r3)

res ← πdni (r4)

20
Para el siguiente esquema se pide obtener el DNI de los empleados con al
menos dos hijos.

EMPLEADO (dni, nom) HIJO (dni,nom)

Solución:
r1 ← ρ(dni1, nom1) (HIJO) /* primero renombrar para no confundir atributos. */
r2 ← HIJO × r1 /* r2 tiene tuplas dni, nom, dni1, nom1 */

r3 ← σdni1 = dni ∧ nom ≠ nom1 (r2) /* interesan tuplas de la forma (1, a, 1, b), es decir,
mismo dni del padre (1), y distinto nombre (a ≠ b) */

res ← πdni (r3)

21
 Operación binaria que implementa el producto cartesiano con
condición de selección.
 R ⨝c S: conjunto de tuplas resultantes del producto cartesiano R ×
S que cumplen la condición c.
 Si la condición c no se cumple para ninguna tupla, devuelve como
resultado un conjunto vacío.
 Si alguna tupla tiene un valor nulo en algún atributo que forma
parte de la condición c, no se incluirá en el resultado.
 Se cumple la siguiente correspondencia y al tener su propio
operador hace que se simplifiquen mucho las consultas:
R ⨝c S ≡ σc (R × S)

22
Ejemplo:
Para el siguiente esquema se pide:

EMPLEADO (dni, nombre, ap1, ap2, salario)


PROYECTO (codpr, descripcion, DNIdir)
DEDICACION (codpr, DNIempl, horas)

Nombres de los empleados que dirigen algún proyecto.


π (nombre, ap1, ap2)(EMPLEADO ⨝dni = DNIdir PROYECTO)
Nombres de los empleados que trabajan en un proyecto más de 10 horas.
π (nombre, ap1, ap2)(DEDICACION ⨝(dni = DNIempl ∧ horas >10) EMPLEADO)

23
Para el siguiente esquema se pide obtener el DNI de los empleados
que trabajan en el departamento 'Contabilidad'.

EMPLEADO(dni, numdep) DEPARTAMENTO(nd, nomd)

Solución:
r1 ← σnomd = 'Contabilidad' (DEPARTAMENTO) /* Tuplas con nomd = 'Contabilidad‘. */
r2 ← EMPLEADO ⨝numdep = nd r1 /* Tuplas de los empleados de 'Contabilidad'. */
res ← πdni (r2)

24
 Reunión con condición implícita: se seleccionan aquellas
tuplas cuyos valores coincidan en los atributos con igual
nombre.
— Se eliminan los atributos duplicados.
— Dados R y S donde ai, 1 ≤ i ≤ k son atributos comunes a R y S.
R ⨝ S ≡ ΠR∪S(σR.a1=S.a1…S.ak=S.ak(R × S))
— Si no hay atributos comunes, es decir, R ∩ S=∅, entonces:

R⨝S≡R×S

25
 Ejemplo:
EMPLEADO (dni, nd) DEPARTAMENTO (nd, nomd)

— EMPLEADO ⨝ DEPARTAMENTO devuelve una relación con los


atributos (dni, nd, nomd).
 Hay que tener cuidado al usar la reunión natural porque puede
haber otros atributos comunes que en realidad no hagan
referencia a lo mismo:

EMPLEADO (dni, nom, apes, nd) DEPARTAMENTO (nd, nom)

26
Dado el siguiente esquema, obtener el nombre de los propietarios de
coches modelo 'Ferrari F50'.

CLIENTE (dni, nom, dir) COCHE (matr, modelo, año)

PROPIEDAD (dni, matr)

Solución:
r1 ← σmodelo = 'Ferrari F50' (COCHE) /* Tuplas del modelo 'Ferrari F50‘. */
r2 ← PROPIEDAD ⨝ r1 /* DNI de propietarios junto a los datos de sus coches. */
res ← πnom (CLIENTE ⨝ r2) /* Nombre de los propietarios de 'Ferrari F50‘. */

27
 Sean R y S dos esquemas de relación, con X e Y como
conjuntos de atributos respectivamente, para realizar la
división debe ocurrir que Y sea subconjunto propio de X:
R (X) ÷ S (Y)
— El resultado es una relación R cuyos atributos son: X – Y.
 Una tupla r está en R ÷ S cuando para todo s de S, la tupla que
se obtiene al unir los valores de r y s está en R:
R (A1, A2, ... , An) ÷ S (An-s, … , An) → T (A1, A2, …, An-s-1)
<A1, … , An-s-1> ∈ T si ∀<An-s, … , An> ∈ S ⇒
<A1, … , An-s-1, An-s, … , An> ∈ R
 Utilidad:
— Consultas en las que se busca que algún atributo de una relación
tome (al menos) todos los valores de otro atributo en otra
relación (cuantificación universal).

28
Dado el siguiente esquema de relación, obtener el DNI de los
empleados que trabajan en todos los proyectos en los que trabaja el
empleado con DNI = 123.

EMPLEADO (dni, nom) TRABAJA (dni, npro)

Solución:
temp ← πnpro (σdni = 123 (TRABAJA)) /* npro de proyectos en los que trabaja dni=123 */
res ← TRABAJA ÷ temp /* dni tales que todas las concatenaciones de los dni
con los npro de temp existe en TRABAJA. */

29
TRABAJA (DNI, NPRO) TEMP (NPRO) RES (DNI)
123 1 ÷ 1 → 123
123 2 2 456
456 1
456 2
456 3
987 1

30
Obtener el DNI de los empleados que trabajan en todos los proyectos en los que
trabaja el empleado con DNI = 123.

EMPLEADO (dni, nom) TRABAJA (dni, npro, nhoras)

Solución 1 (incorrecta):
r1 ← πnpro (σdni = 123 (TRABAJA)) /* npro de todos los proyectos en los que trabaja dni=123. */
res ← TRABAJA ÷ r1 /* CONJUNTO VACÍO (probablemente): ¡atención al esquema de TRABAJA! */

Solución 2 (utiliza un esquema adecuado para el primer operando de la división):


r1 ← πnpro (σdni = 123 (TRABAJA)) /* npro de todos los proyectos en los que trabaja dni=123. */
r2 ← πdni, npro (TRABAJA) /* todas la tuplas dni, npro. */
res ← r2 ÷ r1 /* DNI de los empleados que trabajan todos los proyectos en que trabaja 123. */

31
 Existen operadores adicionales que extienden el álgebra
relacional orientados a facilitar la implementación de
consultas complejas.
 Casi todas las operaciones se pueden implementar con el
conjunto básico visto hasta ahora, aunque en ocasiones dan
como resultado consultas difíciles de entender.
 Los operadores de reunión R ⨝c S solamente incluye las
combinaciones de tuplas que coinciden tanto en R como en S:
— Las tuplas de R que no coinciden con ninguna de S no van a
aparecer en el resultado, y a la inversa.
— Las reuniones que preservan todas las tuplas de algunos de los
operandos se denominan reuniones externas (outer joins).
 También de interés son otros operadores de álgebra relacional
extendida como la agregación, proyección generalizada, cierre
recursivo…
32
 Reunión externa izquierda (left outer join) (R S): reunión
natural en la que se incluyen todas las tuplas de R combinadas
con las que coincidan de S.
— Las tuplas de R que no coincidan con ninguna de S se rellenan con
nulos (NULL) en los atributos de S. NOTA: no confundir el valor
nulo (ausencia de información) con una cadena vacía, que sí es un
valor.
 Reunión externa derecha (right outer join) (R S): análoga a
la anterior, pero esta vez con S (es decir, con el segundo
operando), en vez de con R.
 Reunión externa completa (full outer join) (R S): se
corresponde con la unión de las dos anteriores.

33
Ejemplo 1:
EMPLEADO (dni, nd) DEPARTAMENTO (nd, nomd)
123 1 1 'Ventas'
456 2 2 'Contabilidad'
235 2 3 'Marketing'
987 4

 EMPLEADO DEPARTAMENTO (natural join):

resultado (dni, nd, nomd)


123 1 'Ventas'
456 2 'Contabilidad'
235 2 'Contabilidad'

34
 EMPLEADO DEPARTAMENTO (left outer join)

resultado (dni, nd, nomd)


123 1 'Ventas'
456 2 'Contabilidad'
235 2 'Contabilidad'
987 4 NULL

 EMPLEADO DEPARTAMENTO (right outer join)

resultado (dni, nd, nomd)


123 1 'Ventas'
456 2 'Contabilidad'
235 2 'Contabilidad'
NULL 3 'Marketing'

35
 EMPLEADO DEPARTAMENTO (full outer join)

resultado (dni, nd, nomd)


123 1 'Ventas'
456 2 'Contabilidad'
235 2 'Contabilidad'
NULL 3 'Marketing'
987 4 NULL

36
Ejemplo 2:

37
 Cualquier comparación (=, ≠, <, ≤, >, ≥) con un valor nulo
(NULL) genera un resultado desconocido.
 En álgebra relacional, una expresión lógica con un valor
desconocido devuelve un valor desconocido (en SQL resulta
más complejo).
 Por tanto, las expresiones lógicas en álgebra relacional
pueden devolver tres valores: verdadero, falso o desconocido.
 Comportamiento ante nulos en álgebra relacional:
— Unión, intersección, diferencia y proyección: Los valores nulos se
tratan como cualquier otro valor para eliminar duplicados (no se
repiten tuplas idénticas aunque tengan valores nulos en algún
atributo).
— Selección (σc (R)), reunión (R ⨝c S) y reunión natural (R ⨝ S):
Se seleccionan las tuplas de R donde se cumple la condición. Si el
resultado de la condición es desconocido, la tupla no se incluye.

38

También podría gustarte