You are on page 1of 9

1 Campeonato de futbol

Sean los siguientes esquemas sobre un campeonato de futbol:

Equipo(codEquipo, nombre, RUT DT)


DT(RUT DT, nombre, apellido)
Jugador(RUT, nombre, apellido, codEquipo, suspendido)
Partido(codLocal, codVisita, golesLocal, golesVisita)
Use algebra relacional para responder:

1. La lista de los equipos y sus directores tecnicos (con nombre y apel-


lido).

2. Los nombres de los equipos que han ganado al menos una vez.

3. Los directores tecnicos de los equipos que tienen 3 o mas jugadores


suspendidos.

4. Los jugadores suspendidos cuyos equipos han jugado solo 3 veces.

5. El equipo que ha jugado contra todos los demas.

6. El partido en el que ha habido la mayor diferencia de goles.

Solucion:

1. Primero renombro Equipos

Equipo(codEquipo, nombreEquipo, RU T DT ) Equipo(codEquipo, nombre, RU T DT )

Luego cruzo el resultado con DT dejando solo los que tiene el mismo
RUT DT (esto se puede hacer en un paso con la operacion Reunion
Natural)
Equipo y DT Equipo ? DT
Finalmente quito todos los atributos que no son necesarios usando
proyeccion:

Resultado (nombreEquipo,nombre,apellido) Equipo y DT

2. Primero busco los partidos en que ha salido un ganador de local:

GL golesLocal>golesV isita P artido

1
Luego busco los partidos en que ha ganado la visita:

GV golesV isita>golesLocal P artido

Luego extraigo solo los atributos de codigos de equipos para cada uno
y los renombro en una nueva tabla (notar que voy renombrando sobre
los mismos nombres de relaciones :P )

GL(codEquipo) codLocal GL

GV (codEquipo) codLocal GV
Luego junto los dos en una misma relacion:

G GL GV

Recordar que todo el algebra relacional es conjuntista y por ende los


resultados son conjuntos en los que NO hay elementos repetidos, es
por ello que no es necesario eliminar las repeticiones de equipos que
han ganado mas de una vez, estos se iran solos al momento que se hizo
la proyeccion sobre los codigos de equipo y al momento de la union
entre ganadores de local y ganadores de visita.

3. Primero extraigo todos los jugadores que estan suspendidos (atributo


suspedido==1)
S suspendido=1 Jugador
Ahora cruzo los jugadores suspendidos S con Equipos y elimino el
atributo superfluo codEquipo que aparecera dos veces (de nuevo, me-
diante reunion natural). Ahora para hacer esto necesito un atributo
que se repita en ambos con el mismo nombre, entonces primero voy a
renombrar el atributo nombre de los suspendidos por nombreJugador

S(RU T , nombreJugador, apellido, codEquipo, suspendido) S(RU T , nombre, apellido, codE

Ahora si entonces hago la reunion natural:

SE S o
n Equipo

Ahora cuento cuantos jugadores hay por cada equipo usando la funcion
agregada Count sobre codEquipo (la funcion Count cuenta cuantas
tuplas hay para un atributo que se agrega o reune)

SEC(codEquipo, numeroSuspendidos) < codEquipo > = < RU T, Count >

2
Ahora solo me quedo con los equipos que tienen mas de 3 jugadores
suspendidos:
SEC numeroSuspendidos>=3 SEC
Ahora quito la columna numeroSuspendidos

SEC(codEquipo) SEC

Finalmente tengo que encontrar los nombres de los directores tecnicos


asociados a la tabla de equipos que contiene SEC. Para eso uso la
consulta uno reemplazando SEC donde corresponda por Equipo.

4. Primero obtengo los jugadores suspendidos:

S suspendido=1 Jugador

Luego obtengo los equipos que han jugado *solo* de local y cuento la
cantidad de partidos:

L(codLocal, numeroP artidos) < codLocal > = < codV isitaCOU N T >

Ahora los que han jugado *solo* de visita y cuento la cantidad de


partidos:

V (codV isita, numeroP artidos) < codV isita > = < codLocalCOU N T >

Ahora renombre el atributo codLocal y codVisita para normalizar

L(codEquipo, numeroP artidos) L

V (codEquipo, numeroP artidos) V


Ahora los junto en una sola tabla

LV L V

Ahora sumo los partidos jugados de local y visita agrupados por cod-
Equipo

P J(codEquipo, numeroP artidosT otales) < codEquipo > = < numeroP artidosSU M A >

Ahora me quedo solo con los que tienen numeroPartidosTotales=3

P J numeroP artidosT otales=3

3
Ahora le quito el atributo numeroPartidosTotales

E codEquipo P J

Finalmente hago una reunion natural con los jugadores que estaban
suspendidos
JSE S o nE
Por ultimo una tabla que contenga solo los nombres de los jugadores:

JSE <nombre,apellido> JSE

5. Primero creo una tabla que tiene un atributo que indica el equipo y un
atributo que indica el equipo con el que se ha enfrentado. Para ello,
cruzo la tabla equipos con la tabla equipos para obtener un todos con
todos:
Equipo1(codEquipoBase) codEquipo Equipo
T CT Equipo1 o
n Equipo
Notar que por el momento no me interesa ninguna restriccion asi que
esta tabla contiene mas informacion de la que necesito. Luego, cruzo
esta tabla con la tabla Partido si y solo si el partido se jugo realmente,
es decir, si codLocal = codEquipoBase y codV isita = codEquipo o
codLocal = codEquipo y codV isita = codEquipoBase (en cualquiera
de estos dos casos quiere decir que esos equipos se han enfrentado)

T CT codEquipoBase,codEquipo (T CT o
ncond P artido)
Donde cond = (codLocal = codEquipoBasecodV isita = codEquipo)
(codLocal = codEquipo codV isita = codEquipoBase)
Ahora hago una division entre esta tabla y la tabla equipos, de esta
forma me arrojara todos los equipos de la tabla TCT que tienen en
codEquipo a todos los equipos de la tabla equipos (la que por supuesto
contiene todos los equipos). Para ello previamente debo proyectar la
tabla equipos:
Equipo codEquipo (Equipo)
T CT R T CT Equipo
Ahora busco el nombre si es que lo piden (esto lo voy hacer en una
operacion anidada: primero proyecto TCTR para obtener solo los cod-
EquipoBase, luego los renombro para hacer el reunion natural, luego

4
hago el reunion natural y finalmente proyecto para obtener solo los
nombres :P)

nombre ((E(codEquipo) codEquipoBase (T CT R)) ? Equipo)

6. Primero obtengo la diferencia de goles:

DG(codLocal, codV isita, dif G) < codLocal, codV isita > = < golesLocalgolesV isita >

Ahora obtenemos el maximo

DG(codLocal, codV isita, dif G) < codLocal, codV isita > =M AXIM Odif G

2 Arriendo de propiedades
Considerando el siguiente esquema:
Arrendatario(RUT, nombre, apellido)
Arrienda((RUT), idCasa, deuda)
Telefonos(RUT, fono)
Duen~no(RUT, nombre, apellido)
Casa(idCasa, RUT, numero, calle, comuna)
Con la informacion, responda:

1. Los arrendatarios de la casa que queda en Carrera 1024, Santiago.

2. La deuda total que tienen los arrendatarios con Maria Perez

3. La deuda total para cada dueno

4. El numero de casas de cada dueno

5. El total de telefonos de cada arrendador.

6. El promedio de arrendatarios por casa.

7. Los arrendatarios que tienen al menos 3 casas.

8. Los duenos que tienen deudores en todas sus casas.

9. El arrendatario que posee mas casas

Solucion:

5
1. Primero busco el idCasa de la casa que queda en Carrera 1024:

C(idCasa) idCasa (calle=Carrera numero=1024 (Casa))

Luego busco el RUT de quien arrienda esa casa:

R(RU T , idCasa) RUT,idCasa (idCasa=C.idCasa (Arrienda))

Finalmente busco LOS arrendatarios (supongo que pueden haber var-


ios arrendatarios) :

nombre, apellido (R ? Arrienda)

2. Primero busco el RU T de Maria Perez

R(RUT) nombre=Mariaapellido=Perez (Dueno)

Luego busco TODAS las casas que arrienda

C(idCasa) idCasa (RUT=R.RUT (Casa))

Luego busco todos los que arriendan alguna de las casas que estan en
las casas que arrienda Maria Perez

A C ? Arrienda

Finalmente sumo todas las deudas (ojo que como me piden todas no
tengo que agrupar)

DT = < SUMA deuda > (A)

3. Primero obtengo todos los duenos:

D(RUTD, idCasa) (RUT, idCasa) (Dueno ? (Casa))

Luego obtengo todas las deudas (notar que previamente renombre el


RU T de los duennos.)

DD(RUTD, RUT, idCasa, deuda) (RU T D,idCasa,deuda) (D?Arrienda)

Finalmente sumo las deudas, ahora SI tengo que agrupar por duenno.

DD(RUTD, deuda) < RUTD > = < SUMA deuda > (Arrienda)

6
4. Primero obtengo las casas y los duenos:

CD (RUT, idCasa) (Casa ? Dueno)

Luego cuento el numero de casas agrupando por dueno:

N C < RUT > = < CUENTA idCasa >

5. Parecida a la anterior. Primero creo una relacion que tenga el arren-


datario y telefono (notar que pueden haber varias tuplas con distintos
telefonos para un mismo arrendatario)

T A RUT, fono (T elef onos ? Arrienda)

Luego cuento agrupando por RUT

T C < RUT > = < CUENTA fono > (T A)

6. Primero limpio la relacion Arrienda

CA RUT, idCasa (Arrienda)

Luego agrupo por cada casa y cuento la cantidad de arrendatarios:

N AC(idCasa,numeroArrendatarios) < (idCasa) > = < CUENTA RUTCA >

Ahora guardo la cantidad de casas que hay:

CC(numeroCasas) = < CUENTA idCasa(Casa) >

Ahora sumo la cantidad de arrendatarios de NAC:

CT A(suma) = < SUMA numeroArrendatarios > (N AC)

Ahora creo una tabla que tenga el numero de casas totales y la suma
de los arrendatarios:

CCCT A CT A o
n CC

Ahora divido la suma de los arrendatarios por la cantidad de casas


que hay:

R = < suma/numeroCasas > (CCCT A)

7
7. Primero obtengo una relacion con arrendatarios y casas si es que el
arrendatario tiene casa

AC RUT, idCasa (Arrendatario n Casa)


o

Luego cuento la cantidad de casas de los arrendatarios agrupando por


arrendatarios:

CA(RU T, cuentaCasas) < RUT > = < CUENTA idCasa(AC) >

Luego me quedo con los que tienen mas de 3 casas

C3 (cuentaCasas3) (CA)

8. Veremos el problema al reves: duenos que tienen deudores en todas las


casas = duenos que no tienen casas sin deudores. Entonces primero
las tuplas de arrienda que no tienen deudas:

CSD(idCasa) idCasa (deuda=0 (Arrienda))

Ahora los duenos de dichas casas (duenos de casas que no tienen deu-
das):
DCSD RUT (CSD ? Casa)
Ahora, los duenos que no estan en este conjunto entonces son los que
tienen deudores en todas las casas o tambien quienes no tienen casas
sin deudores (sin deudas):

R D DCSD

Donde D viene dado por

D RUT (Duenos)

9.

8
3 Problema de transporte
Una empresa rural de transporte de pasajeros tiene una base de datos de in-
formacion acerca de los recorridos de sus buses. Un recorrido es una secuen-
cia de paradas que comienzan en un terminal. El numero de paradas varia de
un recorrido a otro pero hay al menos una parada. El modelo relacional con-
siste del siguiente diagrama:
Salida(NumRecorrido, idLocalidad)
Parada(NumRecorrido, idLocalidad, TiempoLlegada)
Donde NumRecorrido e idLocalidad identifican completamente un recor-
rido y una localidad. El atributo TiempoLlegada indica cuanto tarda en
promedio en llegar un bus a la localidad desde su salida. Ahora conteste:

1. ?Cual es el recorrido mas largo segun numero de localidades?. Cual es


el recorrido mas largo segun tiempo tomado?

2. Indique los recorridos con ciclos, ie, aquellos recorridos en que se visita
una localidad mas de una vez.

3. Indique la parada central de cada recorrido (si un recorrido tiene cinco


paradas, interesa la tercera parada. Y si tiene seis, tambien interesa
la tercera).
1

1
Los acentos han sido omitidos por un tema de tiempo/comodidad dado el contexto
Latex del documento. :P

You might also like