Boletín de problemas - Departamento de Lenguajes y Sistemas

Anuncio
Departamento de Lenguajes y Sistemas Informáticos
E.T.S. Ingeniería Informática. Universidad de Sevilla
Avda Reina Mercedes s/n. 41012 Sevilla
Tlf/Fax 954 557 139 E-mail [email protected] Web www.lsi.us.es
E.T.S. Ingeniería
Informática
Bases de Datos
Problemas resueltos de lenguajes relacionales y SQL
Sevilla, mayo 2007
V 2007.5.1
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
1.
Relaciones de la BD ejemplo
1.1.
Esquema
Para la realización de los ejercicios se utilizará la base de datos compuesta por las relaciones
suministradores, piezas, proyectos y suministros.
• La relación S representa los suministradores, cada uno con un código único (s) y además los
atributos nombre de proveedor (noms), estado (estado) y ciudad (ciudad).
• La relación P representa las piezas, con un código de pieza único (p), nombre de pieza (nomp),
color (color), peso (peso) y ciudad (ciudad).
• La relación J representa los proyectos, con un código de proyecto único (j), nombre del proyecto
(nomj) y ciudad (ciudad).
• La relación SPJ representa los suministros, es decir la cantidad (cant) de cada pieza (p) que cada
suministrador (s) suministra a cada proyecto (j). La clave primaria de la relación está formada por el
código de suministradores, el código de pieza y el código de proyecto.
El esquema relacional es:
S(s, noms, estado, ciudad)
Pk (s)
P(p, nomp, color, peso, ciudad)
Pk (p)
J(j, nomj, ciudad)
Pk (j)
SPJ(s, p, j, cant)
Pk (s, p, j), Fk1 (s)/S, Fk2 (p)/P, Fk3 (j)/J
1.2.
s
Extensión BD ejemplo.
noms
estado
ciudad
'S1'
'Smith'
20
'Londres'
'S2'
'Jones'
10
'París'
'S3'
'Blake'
30
'París'
'S4'
'Clark'
20
'Londres'
'S5'
'Adams'
30
'Atenas'
Tabla 1: Relación S de suministradores.
p
nomp
color
'P1'
'Mesa'
'rojo'
'P2'
'Silla'
'blanca'
'P3'
'Armario'
'gris'
'P4'
'Archivador'
'rojo'
'P5'
'Puerta'
'blanca'
'P6'
'Lámpara'
'amarilla'
Tabla 2: Relación P de piezas.
j
nomj
peso
12
'Edificio 1'
'París'
'J2'
'Edificio 2'
'Roma'
'J3'
'Edificio 3'
'Atenas'
J4'
'Edificio 4'
'Atenas'
'J5'
'Edificio 5'
'Londres'
'J6'
'Edificio 6'
'Madrid'
'J7'
'Edificio 7'
'Londres'
Tabla 3: Relación J de proyectos.
'Londres'
17
'París'
17
14
12
19
'Roma'
'Londres'
'París'
'Londres'
ciudad
'J1'
ciudad
s
p
j
'S1'
'S1'
'S1'
'S2'
'S2'
'S2'
'S2'
'S2'
'S1'
'S2'
'S2'
'S3'
'S3'
'S4'
'S4'
'S1'
'S1'
'S1'
'S1'
'S1'
'P1'
'P1'
'P1'
'P3'
'P3'
'P3'
'P3'
'P3'
'P3'
'P3'
'P5'
'P3'
'P4'
'P6'
'P6'
'P3'
'P3'
'P3'
'P3'
'P3'
'J1'
'J4'
'J5'
'J1'
'J2'
'J3'
'J4'
'J5'
'J6'
'J7'
'J2'
'J1'
'J2'
'J3'
'J7'
'J7'
'J5'
'J4'
'J3'
'J2'
cant
200
200
700
400
200
200
500
600
400
800
100
200
500
300
300
70
50
40
30
20
Tabla 4: Relación SPJ de suministros.
Pág. 2 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
2.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Ejercicios propuestos.
Obtener todos los atributos de todos los proyectos.
Obtener todos los atributos de todos los proyectos en Londres.
Obtener los códigos de los suministradores del proyecto J1 ordenados.
Obtener los suministros cuya cantidad esté entre 300 y 750 inclusive.
Obtener todas las ocurrencias de P.color y P.ciudad eliminando los pares duplicados.
Obtener todos los posibles tríos de código de suministrador, de pieza y de proyecto en los que el
suministrador, pieza y proyecto estén todos en la misma ciudad.
Obtener los códigos de suministrador, de pieza y de proyecto de aquellos suministros en los que el
suministrador, pieza y proyecto estén todos en la misma ciudad.
Obtener todos los posibles tríos de código de suministrador, de pieza y de proyecto en los que el
suministrador, pieza y proyecto no estén todos en la misma ciudad.
Obtener todos los posibles tríos de código de suministrador, de pieza y de proyecto en los que el
suministrador, pieza y proyecto no estén ninguno en la misma ciudad.
Obtener las piezas suministradas por suministradores de Londres.
Obtener las piezas suministradas por suministradores de Londres a proyectos en Londres.
Obtener todos los pares de nombres de ciudades en las que el suministrador de la primera sirva a un
proyecto de la segunda.
Obtener códigos de piezas que sean suministradas a un proyecto por un suministrador de la misma
ciudad del proyecto.
Obtener códigos de proyectos que sean suministrados por un suministrador de una ciudad distinta a
la del proyecto.
Obtener todos los pares de códigos de piezas suministradas por el mismo suministrador.
Obtener el número total de proyectos suministrados por el suministrador S1.
Obtener la cantidad total de piezas P1 suministradas por S1.
Obtener para cada pieza suministrada a un proyecto, el código de pieza, el código de proyecto y la
cantidad total correspondiente.
Obtener los códigos de proyectos y los códigos de piezas en los que la cantidad suministrada a algún
proyecto sea en una cantidad media superior a 320.
Obtener los códigos de suministros en los que la cantidad no sea nula.
Obtener los códigos de proyectos y ciudades en que la ciudad tenga una ‘o’ en la segunda letra.
Obtener los nombres de los proyectos a los que suministra S1.
Obtener los colores de las piezas suministradas por S1.
Obtener los códigos de las piezas suministradas a cualquier proyecto de Londres.
Obtener los códigos de proyectos que usen al menos una pieza suministrada por S1.
Obtener los códigos de suministradores que suministren al menos una pieza suministrada al menos
por un suministrador que suministren al menos una pieza de color rojo.
Obtener los códigos de suministradores con estado menor que S1.
Obtener los códigos de los proyectos que usen la pieza P1 en una cantidad media mayor que la mayor
cantidad en la que cualquier pieza sea suministrada al proyecto J1.
Obtener los códigos de suministradores que suministren a algún proyecto la pieza P1 en una cantidad
mayor que la cantidad media en la que se suministra la pieza P1 a dicho proyecto.
Obtener los códigos de los proyectos que no reciben ninguna pieza roja suministrada por algún
suministrador de Londres.
Obtener los códigos de los proyectos suministrados únicamente por S1.
Obtener los códigos de piezas suministradas a todos los proyectos en Londres.
Obtener los códigos de los suministradores que suministren al menos la misma pieza a todos los
proyectos.
Obtener los códigos de los proyectos que reciban al menos todas las piezas que suministra S1.
Construir una lista ordenada de todas las ciudades en la que al menos resida un suministrador, una
pieza o un proyecto.
Pág. 3 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
36.
37.
38.
39.
40.
41.
42.
Mostrar los resultados de la siguiente consulta:
SELECT P.color FROM P
UNION
SELECT P.color FROM P
Cambiar el color de todas las piezas rojas a naranjas.
Borrar todos los proyectos para los que no haya suministros.
Borrar todos los proyectos en Roma y sus suministros correspondientes.
Insertar un nuevo suministro ‘S10’ en la tabla S. El nombre y la ciudad son ‘White’ y ‘New York’. El
estado no se conoce todavía.
Construir una tabla conteniendo una lista de los códigos de las piezas suministradas a proyectos en
Londres o suministradas por un suministrador de Londres.
Construir una tabla conteniendo una lista de los códigos de los proyectos de Londres o que tengan
algún suministrador de Londres.
3.
Soluciones propuestas.
El orden de las respuestas es AR, CROT, CROD Y SQL
1. J
{Jx  J (Jx)}
{Jx, Nx, Cx  J(j:Jx, nomj:Nx, ciudad:Cx)}
SELECT * FROM J;
2.
σ
Ciudad = 'Londres'
{Jx  J (Jx)
J
∧ Jx.ciudad = 'Londres'}
{Jx, Nx, CxJ(j:Jx, nomj:Nx, ciudad : Cx) ∧ Cx = 'Londres'}
SELECT * FROM J WHERE ciudad = ‘Londres’;

3.

∏  σ ( SPJ ) 
j = 'J1'


{SPJx.s  SPJ (SPJx) ∧ SPJx.j = 'J1'}
s
{Sx SPJ(s:Sx, j:'J1')}
SELECT DISTINCT s FROM SPJ WHERE j = ‘J1’ ORDER BY s;
4.
σ
cant ≥ '300' ∧ cant ≤ '750'
( SPJ )
{SPJx  SPJ (SPJx) ∧ SPJx.cant ≥ '300'
∧ SPJx.cant ≤ '750'}
{Sx, Px, Jx, CantxSPJ(s:Sx, p:Px, j:Jx, cant:Cantx) ∧ Cantx ≥ '300' ∧ Cantx ≤ '750'}
SELECT * FROM SPJ WHERE cant BETWEEN 300 AND 750;
5.
∏
P
Color, ciudad
{Px.color, Px.ciudad  P(Px)}
{Cox, CxJ(color:Cox, ciudad:Cx)}
SELECT DISTINCT color, ciudad FROM P;
Pág. 4 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1

6.
∏ 

σ
( S × P × J ) 
S.ciudad=P.ciudad ∧ P.ciudad=J.ciudad


O bien ∏  S  P  J 

s, p, j 


{Sx.s, Px.p, Jx.j  S(Sx) ∧ P(Px) ∧ J(Jx) ∧ Sx.ciudad = Px.ciudad ∧ Px.ciudad = Jx.ciudad}
s,p,j
{Sx, Px, Jx(∃Cx ) (S(s:Sx, ciudad:Cx) ∧ P(p:Px, ciudad:Cx) ∧ J (j:Jx, ciudad:Cx) )}
SELECT s, p, j FROM S, P, J
WHERE S.ciudad = P.ciudad AND P.ciudad = J.ciudad;
7.
∏ (SPJ 
S  P  J)
SPJ.s,SPJ.p,SPJ.j


{Spjx.s, Spjx.p, Spjx.j SPJ(Spjx) ∧ 


(
 S ( Sx ) ∧ P ( Px ) ∧ J ( Jx )
 

  
∃Sx ∃Px ∃Jx  ∧Sx.s = SPJx.s ∧ Px.p = SPJx.p ∧ Jx.j = SPJx.j   
 ∧Sx.ciudad=Px.ciudad ∧ Px.ciudad = Jx.ciudad   

  
)(
)(
)

 SPJ(s:Sx, p:Px, j:x) ∧ S(s:Sx, ciudad:Cx)  
Sx, Px, Jx  ∃Cx 

 ∧ P(p:Px, ciudad:Cx) ∧ J(j:Jx, ciudad:Cx)  

SELECT SPJ.s, SPJ.p, SPJ.j FROM S, P, J, SPJ
WHERE S.ciudad = P.ciudad AND P.ciudad = J.ciudad
AND S.s = SPJ.s AND P.p = SPJ.p AND J.j = SPJ.j;
(
)




8. ∏ σ ( S × P × J ) 
s, p, j  S.ciudad ≠ P.ciudad

 ∨ P.ciudad ≠ J.ciudad 
∨
J.ciudad
≠
S.ciudad



 Sx.ciudad ≠ Px.ciudad ∨ Px.ciudad ≠ Jx.ciudad  
Sx.s, Px.p, Jx.j S(Sx) ∧ P(Px) ∧ J(Jx) ∧ 

 ∨ Sx.ciudad ≠ Jx.ciudad



 S(s:Sx, ciudad:Cx) ∧ P(p:Px, ciudad:Cy) ∧ J(j:Jx, ciudad:Cz)  

Sx, Px, Jx  ∃Cx ∃Cy ∃Cz 
 ∧ ( Cx ≠ Cy ∨ Cy ≠ Cz ∨ Cx ≠ Cz )
 

SELECT s, p, j FROM S, P, J
WHERE S.ciudad <> P.ciudad OR P.ciudad <> J.ciudad OR S.ciudad <> J.ciudad;
(
)(
)(
)









9. ∏ σ ( S × P × J )  O bien:∏
σ  S S.ciudad≠P.ciudad P P.ciudad≠J.ciudad J  

s, p, j  S.ciudad ≠ P.ciudad
s, p, j  J.ciudad ≠ S.ciudad 

 ∧ P.ciudad ≠ J.ciudad 


 ∧ J.ciudad ≠S.ciudad 
Sx.s, Px.p, Jx.j  S(Sx) ∧ P(Px) ∧ J(Jx) ∧ Sx.ciudad ≠ Px.ciudad ∧ Px.ciudad ≠ Jx.ciudad 


∧ Sx.ciudad ≠ Jx.ciudad 


 S(s:Sx,ciudad:Cx) ∧ P(p:Px,ciudad:Cy) ∧ J(j:Jx,ciudad:Cz)  
Sx,Px,Jx  ∃Cx ∃Cy ∃Cz 

 ∧ Cx ≠ Cy ∧ Cy ≠ Cz ∧ Cx ≠ Cz


SELECT s, p, j FROM S, P, J
WHERE
S.ciudad <> P.ciudad AND P.ciudad <> J.ciudad AND S.ciudad <> J.ciudad;
(
)(
)(
)
Pág. 5 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
10.

∏ 
p
σ

SPJ  S 
Ciudad='Londres'

{SPJx.p SPJ(SPJx) ∧ ((∃Sx ) (S(Sx) ∧ SPJx.s = Sx.s ∧ Sx.ciudad = 'Londres))}
{Px (∃Sx ) (SPJ(s:Sx, p:Px) ∧ S(s:Sx, ciudad:'Londres') )}
SELECT DISTINCT p FROM SPJ, S
WHERE SPJ.s = S.s AND S.ciudad = ‘Londres’;
11.

∏ 
p
σ
S.Ciudad='Londres'
SPJ  S


SPJx.p  SPJ(SPJx) ∧ 




J

S(Sx) ∧ J(Jx) ∧ SPJx.s=Sx.s ∧ SPJx.j = Jx.j

(∃Sx )(∃Jx )  ∧ Sx.ciudad = 'Londres' ∧ Jx.ciudad = 'Londres'  

{Px (∃Sx )(∃Jx ) (SPJ(s:Sx, p:Px, j:Jx) ∧ S(s:Sx, ciudad:'Londres') ∧ J(j:Jx, ciudad:'Londres'))}
SELECT DISTINCT p FROM SPJ, S, J
WHERE SPJ.s = S.s AND SPJ.j = J.j AND S.ciudad = ‘Londres’ AND J.ciudad = ‘Londres’;
12.






σ
SPJ
×
S
×
J
O bien: ∏
SPJ  S  J 
(
)

∏
SPJ.s = S.s

SPJ.s = S.s
SPJ.j = J.j 
S.ciudad,J.ciudad  ∧ SPJ.j = J.j
S.ciudad,J.ciudad 


{Sx.ciudad, Jx.ciudadS(Sx) ∧ ((∃SPJx ) (SPJ(SPJx) ∧ SPJx.s = Sx.s ∧ SPJx.j = Jx.j))}
{Cx,Cy(∃Sx )(∃Jx ) (SPJ(s:Sx, j:Jx) ∧ S(s:Sx, ciudad:Cx) ∧ J(j:Jx, ciudad:Cy) )}
SELECT DISTINCT S.ciudad , J.ciudad FROM SPJ, S, J
WHERE SPJ.s = S.s AND SPJ.j = J.j;
13.

∏  SPJ  S 
p

J



SPJx.p SPJ(SPJx) ∧ 


) ( )
(∃Sx )(∃Jx )  ∧(Sx.ciudad
= Jx.ciudad
 S Sx ∧ J Jx ∧ SPJx.s = Sx.s ∧ SPJx.j = Jx.j   
  

  
{Px(∃Sx )(∃Jx )(∃Cx ) (SPJ(s:Sx, p:Px, j:Jx) ∧ S(s:Sx, ciudad:Cx) ∧ J(j:Jx, ciudad:Cx) )}
SELECT DISTINCT SPJ.p FROM SPJ, S, J
WHERE SPJ.s = S.s AND SPJ.j = J.j AND S.ciudad = J.ciudad;
Pág. 6 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1





O bien: ∏ σ  SPJ  S
J



SPJ.s=S.s
S.ciudad ≠ J.ciudad  
SPJ.j  SPJ.j = J.j 


 S Sx ∧ J Jx ∧ SPJx.s = Sx.s ∧ SPJx.j = Jx.j   
∃Sx ∃Jx  ( ) ( )
  
 ∧ Sx.ciudad ≠ Jx.ciudad
  


14. ∏ 
σ
SPJ × S × J ) 
(
SPJ.s=S.s ∧ SPJ.j = J.j

SPJ.j  ∧ S.ciudad ≠ J.ciudad




SPJx.j SPJ(SPJx) ∧ 


(
)(
)
{Jx(∃Sx )(∃Cx )(∃Cy ) (SPJ(s:Sx,j:Jx) ∧ S(s:Sx,ciudad:Cx) ∧ J(j:Jx,ciudad:Cy) ∧ Cx ≠ Cy )}
SELECT DISTINCT SPJ.j FROM SPJ, S, J
WHERE SPJ.s = S.s AND SPJ.j = J.j AND S.ciudad <> J.ciudad;
15. SPJ1=ρ ( SPJ )
SPJ2=ρ ( SPJ )

( SPJ1× SPJ2
∏  SPJ1.s σ
= SPJ2.s
SPJ1.p, SPJ2.p  ∧ SPJ1.p < SPJ2.p


) 

O bien:
∏
SPJ1.p, SPJ2.p


 SPJ1

 SPJ2 

SPJ1.s = SPJ2.s
∧ SPJ1.p < SPJ2.p


{SPJx.p, SPJy.pSPJ(SPJx) ∧ SPJ(SPJy) ∧ SPJx.s = SPJy.s ∧ SPJx.p < SPJy.p}
{Px,Py(∃Sx ) (SPJ(s:Sx,p:Px) ∧ SPJ(s:Sx,p:Py) ∧ Px < Py )}
SELECT DISTINCT SPJ1.p, SPJ2.p FROM SPJ SPJ1, SPJ SPJ2
WHERE SPJ1.s = SPJ2.s AND SPJ1.p < SPJ2.p;
(σ )
16. Este ejercicio no puede resolverse en CROT ni CROD.
Ω
count(Distinct(j)
SPJ
s = 'S1'
SELECT COUNT ( DISTINCT j ) FROM SPJ WHERE s = ‘S1’;
(
)
17. Este ejercicio no puede resolverse en CROT ni CROD.
Ω(
sum(cant)
)
σ
SPJ
s='S1' ∧ p='P1'
SELECT SUM ( cant ) FROM SPJ WHERE s = ‘S1’ AND p = ‘P1’;
18. Este ejercicio no puede resolverse en CROT ni CROD.
Ω
( SPJ )
p,j,sum(cantidad)
p,j
SELECT p, j, SUM ( cant ) FROM SPJ GROUP BY p, j;
19. Este ejercicio no puede resolverse en CROT ni CROD.
Ω


(
)
p,j
 σ

avg(cant)
320
>

 ( SPJ )
p,j
SELECT p, j FROM SPJ GROUP BY p, j HAVING AVG( cant ) > 320;
Pág. 7 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
20. Este ejercicio no puede resolverse en AR, CROT ni CROD.
SELECT s, p, j FROM SPJ WHERE cant IS NOT NULL;
21. Este ejercicio no puede resolverse en AR, CROT ni CROD.
SELECT j, ciudad FROM J WHERE ciudad LIKE ‘_o%’;
22.
∏  σ

s='S1'
Nomj

SPJ  J 

{Jx.nomjJ(Jx) ∧ ((∃SPJx ) (SPJ(SPJx) ∧ SPJx.s = 'S1' ∧ SPJx.j = Jx.j))}
{Njx(∃Jx ) (SPJ(s:'S1', j:Jx) ∧ J(j:Jx, nomj:Njx) )}
SELECT DISTINCT nomj FROM SPJ, J
WHERE SPJ.j = J.j AND s = ‘S1’;
o bien:
SELECT DISTINCT nomj FROM J
WHERE J.j IN (SELECT SPJ.j FROM SPJ
WHERE s = ‘S1’);
o bien:
SELECT DISTINCT nomj FROM J
WHERE EXISTS (SELECT * FROM SPJ
WHERE SPJ.j = J.j AND s = ‘S1’);
23.
∏  σ

Color
s='S1'

SPJ  P 

{Px.colorP(Px) ∧ (∃SPJx ) (SPJ (SPJx ) ∧ SPJx.s = 'S1' ∧ SPJx.p = Px.p )}
{Cox(∃Px ) (SPJ(s:'S1',p:Px) ∧ P(p:Px,color:Cox) )}
SELECT DISTINCT color FROM SPJ, P
WHERE SPJ.p = P.p AND s = ‘S1’;
o bien:
SELECT DISTINCT color FROM P
WHERE P.p IN (SELECT SPJ.p FROM SPJ
WHERE s = ‘S1’);
o bien:
SELECT DISTINCT color FROM P
WHERE EXISTS (SELECT * FROM SPJ
WHERE SPJ.p = J.p AND s = ‘S1’);
24.

∏ 
p
σ
Ciudad = 'Londres'

SPJ  J 

{SPJx.pSPJ(SPJx) ∧ ((∃Jx ) ( J ( Jx ) ∧ SPJx.j = Jx.j ∧ Jx.ciudad = 'Londres' ))}
{Px (∃Jx ) (SPJ(p:Px, j:Jx) ∧ J( j:Jx, ciudad:'Londres ') )}
SELECT DISTINCT p FROM SPJ, J
WHERE SPJ.j = J.j AND ciudad = ‘Londres’;
o bien:
Pág. 8 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
SELECT DISTINCT p FROM SPJ
WHERE SPJ.j IN (SELECT J.j FROM J
WHERE ciudad = ‘Londres’);
o bien:
SELECT DISTINCT p FROM SPJ
WHERE EXISTS (SELECT * FROM J
WHERE SPJ.j = J.j AND ciudad = ‘Londres’);
25.
∏(σ
s='S1'
j
SPJ
)
{SPJx.jSPJ(SPJx) ∧ (SPJx.s = 'S1' )}
{Jx(SPJ(s:'S1', j:Jx )}
SELECT DISTINCT j FROM SPJ WHERE s = ‘S1’;
26.









∏  SPJ  ∏  SPJ  ∏  SPJ
s
p
s
(
)

P 
Color='Rojo'
    
σ

 SPJ(SPJy) ∧ SPJ(SPJz) ∧ P(Px) ∧ SPJx.p = SPJy.p  
SPJx.s  ∃SPJy ∃SPJz ∃Px 

 ∧ SPJy.s = SPJz.s ∧ SPJz.p = Px.p ∧ Px.color = 'Rojo'  


 SPJ(s:Sx, p:Px) ∧ SPJ(s:Sy, p:Px)

Sx  ∃Sy ∃Px ∃Py 


 ∧ SPJ(s:Sy, p:Py) ∧ P(p:Py, color:'Rojo')  

SELECT DISTINCT s FROM SPJ SPJ1
WHERE SPJ1.p IN
(SELECT p FROM SPJ SPJ2
WHERE SPJ2.s IN
(SELECT SPJ3.s FROM SPJ SPJ3
WHERE SPJ3.p IN
(SELECT P.p FROM P
WHERE color = ‘Rojo’ ) ) );
(
(
27.
)(
)(
S1=ρ ( S)
)(
)(
)
)
S2=ρ ( S )




σ
S1
×
S2
(
)
∏
S1.s='S1'

S2.s  ∧ S1.estado > S2.estado


O bien:
∏
S2.s


 S1

S2
 S1.s='S1' 

 ∧ S1.estado > S2.estado 
{Sx.s S (Sx ) ∧ ((∃Sy ) (Sy.s = 'S1' ∧ Sx.estado > Sy.estado ))}
{Sx(∃Ex )(∃Ey ) (S(s:'S1', estado:Ex) ∧ S(s:cod_sx, estado:Ey) ∧ Ex < Ey )}
SELECT Sx.s FROM S Sx, S Sy
WHERE Sy.s = ‘S1’ AND Sx.estado < Sy.estado;
o bien:
SELECT Sx.s FROM S
WHERE estado < (SELECT estado FROM S
WHERE s = ‘S1’);
Pág. 9 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
28. Este ejercicio no puede resolverse en CROT ni CROD.
Ω





( j) 
σ


 
( max(cant) ) 



avg(cant)
SPJ
>

σ
 
Ω
j='J1'



 

j
(σ )
SPJ
p='P1'
SELECT j FROM SPJ
WHERE p = ‘P1’
GROUP BY j HAVING AVG(cant) >
(SELECT MAX(cant) FROM SPJ
WHERE SPJ.j = ‘J1’);
29. Este ejercicio no puede resolverse en CROT ni CROD.
SPJ1=ρ( SPJ )
∏
s
SPJ2=ρ( SPJ )





 p='P1' ∧ cant >



Ω

σ
avg(cantidad) 




∅
SPJ2.p='P1'
∧ SPJ2.j=SPJ1.j
(SPJ2)









SPJ1






SELECT DISTINCT s FROM SPJ SPJ1
WHERE p = ‘P1’ AND cant >
(SELECT AVG (cant) FROM SPJ SPJ2
WHERE SPJ2.p = ‘P1’ AND SPJ1.j = SPJ2.j);
 


 


30. ∏ J   ∏  SPJ  P  
S 


SPJ.p=P.p
j
 SPJ.s=S.s

 j  
∧ Color='Rojo'
 ∧ Ciudad='Londres  
 

 SPJ(SPJx) ∧ SPJx.j = Jx.j

)

(




Jx.j J(Jx) ∧ ∃SPJx  ∧ ∃Px ( P(Px) ∧ Px.color = 'Rojo' ∧ SPJx.p = Px.p )





 ∧ ∃Sx ( S(Sx) ∧ Sx.ciudad = 'Londres' ∧ SPJx.s = Sx.s )  





 SPJ(s:Sx, p:Px, j:Jy)
 



 
∧ S(s:Sx, ciudad:'Londres'   


Jx SPJ(j:Jx) ∧ ∃Jy  ∃Sx ∃Px 

 ∧ P(p:Px, color:'Rojo'))   



  

 ∧ Jx = Jy
 


SELECT DISTINCT J1.j FROM J J1
WHERE J1.j NOT IN (
SELECT SPJ1.j FROM SPJ SPJ1, P, S
WHERE SPJ1.p = P.p AND P.color = ‘Rojo’
AND SPJ1.s = S.s AND S.ciudad = ‘Londres’);
(
) ( )
(
)
( ) ( )( )
Pág. 10 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
31.
∏ SPJ  ∏ ( σ
j
s ≠ 'S1'
j
SPJ
)
{SPJx.j SPJ (SPJx ) ∧ ( ∃SPJy ) (SPJ (SPJy ) ∧ SPJy.s<>'S1' ∧ SPJy.j = SPJx.j)}
∀ x(p) es equivalente a ∃ x(not ( p ))
{SPJx.j  SPJ (SPJx ) ∧ (∀ SPJy ) ( ¬ (SPJ(SPJy)
}
∧ SPJy.s <> 'S1' ) ∨ ¬ ( SPJy.j = SPJx.j ) )
{JxSPJ(j:Jx) ∧ ( ∃Sx ) (SPJ(s:Sx,j:Jx) ∧ Sx<> 'S1')}
{JxSPJ(j:Jx) ∧ (∀Sx ) ( ¬ (SPJ(s:Sx, j:Jx) ) ∨ ¬(Sx <> 'S1'))}
SELECT DISTINCT SPJ1.j FROM SPJ SPJ1
WHERE NOT EXISTS (
SELECT * FROM SPJ SPJ2
WHERE SPJ1.j = SPJ2.j AND SPJ2.s <> ‘S1’);
o bien:
SELECT DISTINCT SPJ1.j FROM SPJ SPJ1
WHERE SPJ1.j NOT IN (
SELECT SPJ2.j FROM SPJ SPJ2 WHERE SPJ2.s <> ‘S1’);
32.
∏ SPJ

∏(
j
σ
Ciudad = 'Londres'
J

∏ SPJ −  ∏  ∏ (
p, j
)
p

p

σ
J
Ciudad = 'Londres'
j


) × ∏ SPJ  − ∏ SPJ 
p

s,p

 ¬ ( J ( Jx ) ∧ Jx.ciudad = 'Londres' ) ∨




∀Jx 

∃
SPJy ( SPJ ( SPJy ) ∧ SPJy.j = Jx.j ∧ SPJy.p = SPJx.p )  



 ( J ( Jx ) ∧ Jx.ciudad = 'Londres' ) ∧





SPJx.p SPJ ( SPJx ) ∧ ∃Jx 

 ∃SPJy ( SPJ ( SPJy ) ∧ Jx.j = SPJy.j ∧ SPJy.p = SPJx.p )  






SPJx.p SPJ ( SPJx ) ∧

(
)(
)
( )(
)
{PxP ( p:Px ) ∧ (∀Jx ) ( not J(j:Jx, ciudad:'Londres') ∨ SPJ(p:Px, j:Jx) )}
{PxP ( p:Px ) ∧ ( ∃Jx ( J(j:Jx, ciudad:'Londres') ∧ ¬(SPJ(p:Px, j:Jx))))}
SELECT DISTINCT SPJ1.p FROM SPJ SPJ1
WHERE NOT EXISTS (
SELECT * FROM J
WHERE J.ciudad = ‘Londres’
AND NOT EXISTS (
SELECT * FROM SPJ SPJ2
WHERE SPJ2.j = J.j AND SPJ2.p = SPJ1.p ));
Pág. 11 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
33.
 ∏ SPJ 
 s,p, j

∏s  J 
∏

 j



SPJx.s SPJ ( SPJx ) ∧



SPJx.s SPJ ( SPJx ) ∧







∏  ∏ SPJ −  ∏  ∏ J × ∏ SPJ  − ∏ SPJ  
s

s,p

s,p

j

s,p
s,p,j

 ( ¬J ( Jx ) ) ∨

 
∃SPJy (SPJ (SPJy ) ∧ SPJy.p = SPJx.p ∧ SPJy.s = SPJx.s ∧ SPJy.j = Jx.j)  

(∀Jx ) 
(
)
 ( J ( Jx ) ) ∧



∃Jx 
 ∃SPJy ( SPJ ( SPJy ) ∧ SPJy.p = SPJx.p ∧ SPJy.s = SPJx.s ∧ SPJy.j = Jx.j) 


( )(
)
{SxSPJ(s:Sx) ∧ (∀Jx ) ( not J(j:Jx) ∨ (∃Px ) (SPJ(s:Sx, p:Px, j:Jx)) )}
{SxSPJ(s:Sx) ∧ ( ∃Jx ) ( J(j:Jx)) ∧ ( ∃Px ) (SPJ(s:Sx, p:Px, j:Jx))}
SELECT DISTINCT SPJ1.s FROM SPJ SPJ1
WHERE NOT EXISTS (
SELECT * FROM J
WHERE NOT EXISTS (
SELECT * FROM SPJ SPJ2
WHERE SPJ2.j = J.j AND SPJ2.p = SPJ1.p AND SPJ2.s = SPJ1.s ));
34.
∏ SPJ

∏(σ
p
s='S1'
SPJ
)


SPJx.j SPJ ( SPJx ) ∧



SPJx.j SPJ ( SPJx ) ∧





∏ SPJ −  ∏  ∏ ( σ SPJ ) × ∏ SPJ  − ∏ SPJ 
p,j

j
j

s= 's1'
p
j

p,j

(
 ( ¬SPJ ( SPJy ) ∧ SPJy.s= 'S1' )




∀SPJy 

∨
∃
SPJz ( SPJ ( SPJy ) ∧ SPJz.p = SPJy.p ∧ SPJz.j = SPJx.j)  


(
 ( SPJ ( SPJy ) ∧ SPJy.s= 'S1' )



∃SPJy 

 ∧ ∃SPJz ( SPJ ( SPJy ) ∧ SPJz.p = SPJy.p ∧ SPJz.j = SPJx.j)  


) (
) (
)
)
{JxSPJ(j:Jx) ∧ (∀Px ) ( ¬SPJ ( p:Px, s:'S1' ) ∨ SPJ ( p:Px, j:Jx ) )}
{JxSPJ(j:Jx) ∧ ( ∃Px ) (SPJ ( p:Px, s:'S1') ∧ ¬SPJ ( p:Px, j:Jx ))}
SELECT DISTINCT SPJ1.j FROM SPJ SPJ1
WHERE NOT EXISTS (
SELECT * FROM SPJ SPJ2
WHERE SPJ2.s = ‘S1’ AND NOT EXISTS (
SELECT * FROM SPJ SPJ3 WHERE SPJ3.j = SPJ1.j AND SPJ3.p = SPJ2.p ));
Pág. 12 de 25





Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1






35.  ∏ S  U  ∏ P  U  ∏ J 
 Ciudad 
 Ciudad 
 Ciudad 
sC(c):={X.ciudad | s(X) }
pC(c):={X.ciudad | p(X) }
jC(c):={X.ciudad | j(X) }
{X.c | sC(X) or pC(X) or jC(X)}
{CxS ( ciudad:Cx ) ∨ P ( ciudad:Cx ) ∨ J(ciudad:Cx)}
SELECT ciudad FROM S UNION
SELECT ciudad FROM P UNION
SELECT ciudad FROM J ORDER BY 1;
Una cláusula ORDER BY en una sentencia SELECT que use el operador UNION debe identificar las
columnas por las que se quiere ordenar por su posición, no por el nombre, ya que las columnas del
resultado de una UNION son anónimas.
36.
azul
verde
rojo
Es equivalente a:
SELECT DISTINCT color FROM P;
37. Este ejercicio no puede resolverse en AR, CROT ni CROD.
UPDATE P SET color = ‘naranja’ WHERE color = ‘rojo’ ;
38. Este ejercicio no puede resolverse en AR, CROT ni CROD.
DELETE FROM J
WHERE J.j NOT IN (
SELECT SPJ.j FROM SPJ ) ;
o bien:
DELETE FROM J
WHERE NOT EXISTS (
SELECT * FROM SPJ WHERE SPJ.j = J.j ) ;
39. Este ejercicio no puede resolverse en AR, CROT ni CROD.
DELETE FROM SPJ
WHERE SPJ.j IN (
SELECT J.j FROM J WHERE ciudad = ‘Roma’);
DELETE FROM J WHERE ciudad = ‘Roma’;
40. Este ejercicio no puede resolverse en AR, CROT ni CROD.
INSERT INTO S (s, noms, ciudad)
VALUES (‘S10’, ‘White’, ‘New York’.);
Pág. 13 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1

41.  ∏ SPJ
 p
(
)


J  U  ∏ SPJ
ciudad='Londres'

 p
σ


SPJx.p | SPJ ( SPJx ) ∧ 


Px |


 ∨

(
)

S 
ciudad='Londres'

σ
)
( )

 ∨  ( ∃Sx ) 
   
(∃Jx )  ∧( Jx.ciudad
∧ Sx.ciudad = 'Londres'
= 'Londres'
 J Jx ∧ Jx.j = SPJx.j


 S Sx ∧ Sx.s = SPJx.s    




   
(∃Jx ) ( J ( j:Jx, ciudad:'Londres ') ∧ SPJ(p:Px, j:Jx) ) 

(∃Sx ) (S(s:Sx, ciudad:'Londres') ∧ SPJ(s:Sx, p:Px) )
CREATE TABLE LP (p CHAR(2));
INSERT INTO LP (p)
SELECT DISTINCT p FROM SPJ
WHERE s IN ( SELECT s FROM S WHERE ciudad = ‘Londres’ )
OR j IN ( SELECT j FROM J WHERE ciudad = ‘Londres’ ) ;

42.  ∏
 j
(
)

J 
ciudad='Londres'

σ
 
U  ∏  σ

j

SPJ S  
ciudad='Londres'

Jx.j | J ( Jx ) ∧ Jx.ciudad = 'Londres' ∨


∃Sx ∃SPJx (S (Sx ) ∧ SPJ (SPJx ) ∧ SPJx.s = Sx.s ∧ Sx.ciudad = 'Londres')

(
)(
)
{Jx | J(j:Jx, ciudad:'Londres') ∨ (∃Sx ) (SPJ(s:Sx, j:Jx) ∧ S(s:Sx, ciudad:'Londres'))}
CREATE TABLE LJ (j CHAR(2));
INSERT INTO LJ (j)
SELECT j FROM J
WHERE ciudad = ‘Londres’
OR j IN ( SELECT j FROM SPJ WHERE s IN (
SELECT s FROM S WHERE ciudad = ‘Londres’ ) ) ;
Pág. 14 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
4.
Soluciones WinRDBI.
4.1.
Álgebra relacional
% Ejercicio 1: Todos los atributos de todos los proyectos
qAR1:=j;
% Ejercicio 2: Todos los atributos de todos los proyectos en 'Londres'
qAR2:=(select(ciudad='Londres')(j));
% Ejercicio 3: Códigos de suministradores del proyecto 'J1' ordenados
qAR3:=project s (select(j='J1')(spj));
% Ejercicio 4: Suministros cuya cantidad esté entre 300 y 750 inclusive
qAR4:=project s,p,j (select(cant>=300 and cant<=750)(spj));
% Ejercicio 5: Ocurrencias de P.color y P.ciudad eliminando los pares duplicados
qAR5:=project color,ciudad (p);
% Ejercicio 6: Posibles trios de código de suministrador, código de pieza y código de proyecto
% con suministrador, pieza y proyecto localizados en la misma ciudad
qAR6:=project s, p, j (((s) njoin (p)) njoin (j));
% Ejercicio 7: Trios de código de suministrador, código de pieza y código de proyecto de aquellos
% suministros con suministrador, pieza y proyecto localizados en la misma ciudad
qAR7:=project s, p, j ((((s) njoin (p)) njoin (j)) njoin spj);
% Ejercicio 8: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén todos localizados en la misma ciudad
tAR8_s(s,ns,es,c_s) := s;
tAR8_p(p,np,color,peso,c_p) := p;
tAR8_j(j,nj,c_j) := j;
qAR8:=project s,p,j(select(c_s<>c_p or c_p<>c_j or c_s<>c_j )
((tAR8_s product tAR8_p) product(tAR8_j))) ;
% Ejercicio 9: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén ninguno localizados en la misma ciudad
qAR9:=project s,p,j(select (c_s <>c_p and c_p<>c_j and c_s<>c_j)
((tAR8_s product tAR8_p) product (tAR8_j)))
;
% Ejercicio 10: Códigos de piezas suministradas por suministradores de 'Londres'
qAR10:=project p((select(ciudad='Londres')(s)) njoin (spj));
% Ejercicio 11: Códigos de piezas suministradas por suministradores de Londres a proyectos en Londres
qAR11:= project p (select ciudad='Londres' (spj njoin (s njoin j)));
% Ejercicio 12: Pares de ciudades en que un suministrador de la primera sirva a un proyecto de la segunda
tAR12_s(s,ns,es,c_s)
:= s;
tAR12_j(j,nj,c_j)
:= j;
tAR12_spj(ss,pp,jj,can)
:= spj;
Pág. 15 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
qAR12:=project c_s, c_j(select
(ss =s and jj=j) ((tAR12_spj product tAR12_s) product (tAR12_j))) ;
% Ejercicio 13: Códigos de piezas suministradas a un proyecto por un suministrador de la misma ciudad
% que el proyecto
qAR13:= project p((spj) njoin ((s) njoin (j)) );
% Ejercicio 14: Códigos de proyectos suministrados por un suministrador de una ciudad distinta a la del
% suministrador
tAR14_s(s,ns,es,c_s) := s;
tAR14_j(j,nj,c_j)
:= j;
qAR14:= project j (select (c_s<> c_j) ((spj) njoin ((tAR14_s) product (tAR14_j)))) ;
% Ejercicio 15: Pares de códigos de piezas suministradas por el mismo suministrador
tARa_spj(sa,pa,ja,ca) := spj;
tARb_spj(sb,pb,jb,cb) := spj;
qAR15:= project pa,pb (select (sa = sb and pa < pb) ((tARa_spj) product (tARb_spj)) ) ;
% Ejercicio 22: Nombre de los proyectos a los que suministra 'S1'
qAR22:=project nomj((select(s='S1' ) ((j) njoin (spj)) ) );
% Ejercicio 23: Colores de las piezas suministradas por 'S1'
qAR23:=project color((select(s='S1' ) ((spj) njoin (p)) ) );
% Ejercicio 24: Códigos de piezas suministradas a cualquier proyecto de 'Londres'
qAR24:=project p((select(ciudad='Londres' ) ((spj) njoin (j)) ) );
% Ejercicio 25: Códigos de proyectos que usen al menos una pieza suministrada por 'S1'
qAR25:=project j (select(s='S1')(spj));
% Ejercicio 26: Códigos de suministradores que suministren al menos una pieza suministrada al menos
% por un suministrador que suministre al menos una pieza de color 'rojo'
%sum_rojas:=project s((select(color='rojo' ) ((spj) njoin (p) ) ));
%piezas_sum_rojas:= project p (spj njoin (sum_rojas));
%sum_piezas_sum_rojas:= project s ((spj) njoin (piezas_sum_rojas));
qAR26:= project s((spj) njoin (project p (spj njoin (project s((select(color='rojo' ) ((spj) njoin (p) ) ))))));
% Ejercicio 27: Códigos de suministradores con estado menor que 'S1'
tAR27a_s(sa,na,esta,ca_s) := s;
tAR27b_s(sb,nb,estb,cb_s) := s;
qAR27:=project sa(select (sb = 'S1' and esta < estb ) (tAR27a_s product tAR27b_s));
% Ejercicio 30: Códigos de proyectos que no reciban ninguna pieza roja suministrada por algún
% suministrador de 'Londres'
tAR30:= project j (select (color ='rojo') ((project j, p(select(ciudad='Londres')((spj) njoin (s)) )) njoin (p))) ;
qAR30:=(project j (j)) difference (tAR30);
% Ejercicio 31: Códigos de proyectos suministrados únicamente por 'S1'
qAR31:=(project j (spj)) difference (project j (select (s<>'S1') (spj)));
Pág. 16 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 32: Códigos de piezas suministradas a todos los proyectos de Londres
% project p,j(spj) / (project j(select(ciudad='Londres')(j))); pero no existe el operador '/' en WinRDBI
tAR32d:=project j(select(ciudad='Londres')(j));
tAR32D:= project p,j(spj);
qAR32:=(project p(tAR32D)) difference (project p((tAR32d product (project p(tAR32D)))
difference tAR32D)) ;
% Ejercicio 33: Códigos de suministradores que suministren al menos la misma pieza a todos los proyectos
tAR33d:=project j(j);
tAR33D:= project s,p,j(spj);
qAR33:=project s((project s,p(tAR33D)) difference (project s,p((tAR33d product (project s,p(tAR33D)))
difference tAR33D)) );
% Ejercicio 34: Códigos de proyectos que reciben al menos las piezas suministradas por 'S1'
tAR34d:=project p(select(s='S1')(spj));
tAR34D:= project p,j(spj);
qAR34:=(project j(tAR34D)) difference (project j((tAR34d product (project j(tAR34D)))
difference tAR34D)) ;
% Ejercicio 35: Construir una lista ordenada de todas las ciudades en las que al menos resida un
% suministrador, una pieza o un proyecto
qAR35:=(project ciudad(s)) union ((project ciudad(p)) union (project ciudad(j)));
% Ejercicio 41: Códigos de piezas suministradas a proyectos en 'Londres' o suministradas por un
% suministrador de 'Londres'
t1AR41:= project p (spj njoin (project j(select(ciudad='Londres')(j))));
t2AR41:= project p (spj njoin (project s(select(ciudad='Londres')(s))));
qAR41:=t1AR41 union t2AR41;
% Ejercicio 42: Códigos de proyectos en 'Londres' o con algún suministrador en 'Londres'
t1AR42:= project j (select (ciudad='Londres') (spj njoin s));
t2AR42:= project j (select(ciudad='Londres')(j));
qAR42:=t1AR42 union t2AR42;
4.2.
Cálculo relacional orientado a tuplas
% Ejercicio 1: Todos los atributos de todos los proyectos
qCRT1:= {Jx | j(Jx)};
% Ejercicio 2: Todos los atributos de todos los proyectos en 'Londres'
qCRT2:={Jx | j(Jx) and Jx.ciudad='Londres'};
% Ejercicio 3: Códigos de suministradores del proyecto 'J1' ordenados
qCRT3:={Spjx.s | spj(Spjx) and Spjx.j='J1'};
% Ejercicio 4: Suministros cuya cantidad esté entre 300 y 750 inclusive
qCRT4:={Spjx | spj(Spjx) and Spjx.cant>=300 and Spjx.cant<=750};
% Ejercicio 5: Ocurrencias de P.color y P.ciudad eliminando los pares duplicados
qCRT5:={Px.color, Px.ciudad | p(Px) };
Pág. 17 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 6: Posibles trios de código de suministrador código de pieza y código de proyecto
% con suministrador, pieza y proyecto localizados en la misma ciudad
qCRT6:={Sx.s, Px.p, Jx.j | s(Sx) and p(Px) and j(Jx) and Sx.ciudad = Px.ciudad
and Px.ciudad = Jx.ciudad};
% Ejercicio 7: Trios de código de suministrador código de pieza y código de proyecto de aquellos
% suministros con suministrador, pieza y proyecto localizados en la misma ciudad
qCRT7:= {Spjx.s, Spjx.p, Spjx.j |spj(Spjx) and (exists Sx)((s(Sx) and Spjx.s=Sx.s)
and (exists Px)((p(Px) and Spjx.p=Px.p)and (exists Jx)((j(Jx) and Spjx.j=Jx.j
and Sx.ciudad=Px.ciudad and x.ciudad=Jx.ciudad)))) };
qCRT7b:= {Spjx.s, Spjx.p, Spjx.j | spj(Spjx) and (exists Sx,Px,Jx)(s(Sx) and p(Px) and j(Jx)
and Spjx.s=Sx.s and Spjx.p=Px.p and Spjx.j=Jx.j and Sx.ciudad = Px.ciudad and Px.ciudad = Jx.ciudad) };
qCRT7c:= {Spjx.s, Spjx.p, Spjx.j | spj(Spjx) and (exists Sx)(exists Px)(exists Jx)(s(Sx) and p(Px) and j(Jx)
and Spjx.s=Sx.s and Spjx.p=Px.p and Spjx.j=Jx.j and Sx.ciudad = Px.ciudad and Px.ciudad = Jx.ciudad) };
% Ejercicio 8: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén todos localizados en la misma ciudad
qCRT8:={Sx.s, Px.p, Jx.j | s(Sx) and p(Px) and j(Jx) and (Sx.ciudad <> Px.ciudad
or Px.ciudad <> Jx.ciudad or Sx.ciudad <> Jx.ciudad)};
% Ejercicio 9: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén ninguno localizados en la misma ciudad
qCRT9:={Sx.s, Px.p, Jx.j | s(Sx) and p(Px) and j(Jx) and (Sx.ciudad <> Px.ciudad
and Px.ciudad <> Jx.ciudad and Sx.ciudad <> Jx.ciudad)};
% Ejercicio 10: Códigos de piezas suministradas por suministradores de 'Londres'
qCRT10:= {Spjx.p | spj(Spjx) and (exists Sx)(s(Sx) and Sx.ciudad='Londres' and Sx.s=Spjx.s )};
% Ejercicio 11: Códigos de piezas suministradas por suministradores de 'Londres' a proyectos en 'Londres'
qCRT11:= {Spjx.p | spj(Spjx) and (exists Jx)((j(Jx) and Jx.ciudad='Londres') and ((exists Sx)(s(Sx)
and Sx.ciudad='Londres' and Sx.s=Spjx.s and Jx.j=Spjx.j)))};
% Ejercicio 12: Pares de ciudades en que un suministrador de la primera sirva a un proyecto de la segunda
qCRT12:= {Sx.ciudad, Jx.ciudad | s(Sx) and j(Jx) and (exists Spjx)(spj(Spjx) and Spjx.s=Sx.s
and Spjx.j=Jx.j )};
% Ejercicio 13: Códigos de piezas suministradas a un proyecto por un suministrador de la misma ciudad
% que el proyecto
qCRT13:= {Spjx.p | spj(Spjx) and (exists Sx,Jx)(s(Sx) and j(Jx) and Spjx.s=Sx.s and Spjx.j=Jx.j
and Sx.ciudad = Jx.ciudad) } ;
% Ejercicio 14: Códigos de proyectos suministrados por un suministrador de una ciudad distinta a la del
%suministrador
qCRT14:= {Jx.j | j(Jx) and (exists Sx,Spjx)(s(Sx) and spj(Spjx) and Spjx.s=Sx.s and Spjx.j=Jx.j
and Sx.ciudad <> Jx.ciudad) } ;
% Ejercicio 15: Pares de códigos de piezas suministradas por el mismo suministrador
qCRT15:= {Spjx.p, Spjy.p | spj(Spjx) and spj(Spjy) and Spjx.s = Spjy.s and Spjx.p <> Spjy.p};
Pág. 18 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 22: Nombre de los proyectos a los que suministra 'S1'
qCRT22:= {Jx.nomj | j(Jx) and (exists Spjx)(spj(Spjx) and Spjx.j=Jx.j and Spjx.s='S1' )};
% Ejercicio 23: Colores de las piezas suministradas por 'S1'
qCRT23:= {Px.color | p(Px) and (exists Spjx)(spj(Spjx) and Spjx.p=Px.p and Spjx.s='S1' )};
% Ejercicio 24: Códigos de piezas suministradas a cualquier proyecto de 'Londres'
qCRT24:= {Spjx.p | spj(Spjx) and (exists Jx)(j(Jx) and Spjx.j=Jx.j and Jx.ciudad='Londres' )};
% Ejercicio 25: Códigos de proyectos que usen al menos una pieza suministrada por 'S1'
qCRT25:={Spjx.j | spj(Spjx) and Spjx.s='S1'};
% Ejercicio 26: Códigos de suministradores que suministren al menos una pieza suministrada al menos
% por un suministrador que suministre al menos una pieza de color 'rojo'
qCRT26:= {Spjz.s | spj(Spjz) and (exists Spjx,Spjy,Px)(spj(Spjx) and spj(Spjy) and p(Px)
and Spjx.p=Px.p and Spjx.s=Spjy.s and Spjy.p=Spjz.p and Px.color = 'rojo') };
% Ejercicio 27: Códigos de suministradores con estado menor que 'S1'
qCRT27:= {Sx.s | s(Sx) and (exists Sy)(s(Sy) and Sy.s='S1' and Sx.estado < Sy.estado )};
% Ejercicio 30: Códigos de proyectos que no reciban ninguna pieza roja suministrada por algún
% suministrador de 'Londres'
qCRT30:= {Jx.j | j(Jx) and not (exists Spjx)((spj(Spjx) and Spjx.j=Jx.j)
and (exists Px)(p(Px) and Px.color='rojo' and Px.p =Spjx.p)
and (exists Sx)(s(Sx) and Sx.ciudad='Londres' and Sx.s=Spjx.s))};
% Ejercicio 31: Códigos de proyectos suministrados únicamente por 'S1'
qCRT31a:= {Spjx.j | spj(Spjx) and not (exists Spjy)(spj(Spjy) and Spjy.s <> 'S1' and Spjy.j=Spjx.j) };
qCRT31b:= {Spjx.j | spj(Spjx) and (forall Spjy)( not (spj(Spjy) and Spjy.s <> 'S1') or not(Spjy.j=Spjx.j))};
% Ejercicio 32: Códigos de piezas suministradas a todos los proyectos de 'Londres'
qCRT32a := {Spjx.p | spj(Spjx) and (forall Jx) (not (j(Jx) and Jx.ciudad = 'Londres')
or (exists Spjy) (spj(Spjy) and Spjy.j = Jx.j and Spjy.p =Spjx.p)) };
qCRT32b := {Spjx.p | spj(Spjx) and not(exists Jx) ( (j(Jx) and Jx.ciudad = 'Londres')
and not (exists Spjy) (spj(Spjy) and Spjy.j = Jx.j and Spjy.p =Spjx.p)) };
% Ejercicio 33: Códigos de suministradores que suministren al menos la misma pieza a todos los proyectos
qCRT33a := {Spjx.s | spj(Spjx) and (forall Jx) (not (j(Jx) ) or (exists Spjy) (spj(Spjy)
and Spjy.p = Spjx.p and Spjy.s =Spjx.s and Spjy.j = Jx.j)) };
qCRT33b := {Spjx.s | spj(Spjx) and not (exists Jx) ((j(Jx) ) and not ((exists Spjy) (spj(Spjy)
and Spjy.p = Spjx.p and Spjy.s =Spjx.s and Spjy.j = Jx.j)) ) };
% Ejercicio 34: Códigos de proyectos que reciben al menos las piezas suministradas por 'S1'
qCRT34a := {Spjx.j | spj(Spjx) and (forall Spjy) (not (spj(Spjy) and Spjy.s='S1')
or (exists Spjz) (spj(Spjz) and Spjz.p = Spjy.p and Spjz.j =Spjx.j)) };
qCRT34b := {Spjx.j | spj(Spjx) and not (exists Spjy) (((spj(Spjy) and Spjy.s='S1'))
and not ((exists Spjz) (spj(Spjz) and Spjz.p = Spjy.p and Spjz.j =Spjx.j)) ) };
Pág. 19 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 35: Construir una lista ordenada de todas las ciudades en las que al menos resida un
% suministrador, una pieza o un proyecto
sC(c):={X.ciudad | s(X) };
pC(c):={X.ciudad | p(X) };
jC(c):={X.ciudad | j(X) };
qCRT35 :={X.c | sC(X) or pC(X) or jC(X)};
% Ejercicio 41: Códigos de piezas suministradas a proyectos en 'Londres' o suministradas por un
% suministrador de 'Londres'
qCRT41 := {Spjx.p | spj(Spjx) and ( (exists Jx)(j(Jx) and Jx.j=Spjx.j and Jx.ciudad= 'Londres' )
or (exists Sx)(s(Sx) and Sx.s=Spjx.s and Sx.ciudad= 'Londres' ) )};
% Ejercicio 42: Códigos de proyectos en 'Londres' o con algún suministrador en 'Londres'
qCRT42 := {Jx.j | j(Jx) and (Jx.ciudad= 'Londres'
or (exists Sx,Spjx)(s(Sx) and spj(Spjx) and Sx.s=Spjx.s and Sx.ciudad='Londres' ))};
4.3.
Cálculo relacional orientado a dominios
% Ejercicio 1: Todos los atributos de todos los proyectos
qCRD1(j:Jx, nomj:Nx, ciudad:Cx) <- j(j:Jx, nomj:Nx, ciudad:Cx) ;
% Ejercicio 2: Todos los atributos de todos los proyectos en 'Londres'
qCRD2(j:Jx, nomj:Nx,ciudad:Cx ) <- j(j:Jx, nomj:Nx, ciudad:Cx) and Cx='Londres';
% Ejercicio 3: Códigos de suministradores del proyecto 'J1' ordenados
qCRD3(s:Sx ) <- spj(s:Sx,j:'J1') ;
% Ejercicio 4: Suministros cuya cantidad esté entre 300 y 750 inclusive
qCRD4(s:Sx , p:Px, j:Jx) <- (exists Ctx) (spj(s:Sx, p:Px, j:Jx, cant:Ctx)) and Ctx>=300 and Ctx<=750 ;
% Ejercicio 5: Ocurrencias de P.color y P.ciudad eliminando los pares duplicados
qCRD5(color:Cox, ciudad:Cx ) <- p(color:Cox, ciudad:Cx) ;
% Ejercicio 6: Posibles trios de código de suministrador código de pieza y código de proyecto
% con suministrador, pieza y proyecto localizados en la misma ciudad
qCRD6(s:Sx,p:Px,j:Jx)<- (exists Cx) ((s(s:Sx, ciudad:Cx)) and (p(p:Px, ciudad:Cx))
and (j(j:Jx, ciudad:Cx)));
% Ejercicio 7: Trios de código de suministrador código de pieza y código de proyecto de aquellos
% suministros con suministrador, pieza y proyecto localizados en la misma ciudad
qCRD7(s:Sx,p:Px,j:Jx) <- (exists Cx) ((spj(s:Sx, p:Px,j:Jx) ) and(s(s:Sx, ciudad:Cx) )
and (p(p:Px, ciudad:Cx))and (j(j:Jx, ciudad:Cx))) ;
% Ejercicio 8: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén todos localizados en la misma ciudad
qCRD8(s:Sx,p:Px,j:Jx) <- (exists Cx) ((exists Cy) ((exists Cz)((s(s:Sx, ciudad:Cx) )
and (p(p:Px, ciudad:Cy))and (j(j:Jx, ciudad:Cz) ) and (Cx<>Cy or Cy<>Cz or Cx<>Cz)))) ;
Pág. 20 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 9: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén ninguno localizados en la misma ciudad
qCRD9(s:Sx,p:Px,j:Jx) <- (exists Cx) ((exists Cy) ((exists Cz)((s(s:Sx, ciudad:Cx) )
and (p(p:Px, ciudad:Cy))and (j(j:Jx, ciudad:Cz) ) and (Cx<>Cy and Cy<>Cz and Cx<>Cz) ) )) ;
% Ejercicio 10: Códigos de piezas suministradas por suministradores de 'Londres'
qCRD10(p:Px) <- (exists Sx) ((s(s:Sx, ciudad:'Londres') ) and (spj(s:Sx, p:Px))) ;
% Ejercicio 11: Códigos de piezas suministradas por suministradores de 'Londres' a proyectos en 'Londres'
qCRD11(p:Px) <- (exists Jx) (j(j:Jx,ciudad:'Londres') and (exists Sx) ((s(s:Sx, ciudad:'Londres') )
and (spj(s:Sx, p:Px, j:Jx))) );
% Ejercicio 12: Pares de ciudades en que un suministrador de la primera sirva a un proyecto de la segunda
qCRD12(ciudad:Cx,ciudad:Cy ) <- (exists Sx, Jx)((s(s:Sx, ciudad:Cx)) and (j(j:Jx,ciudad:Cy))
and (spj(s:Sx, j:Jx) )) ;
% Ejercicio 13: Códigos de piezas suministradas a un proyecto por un suministrador de la misma ciudad
%que el proyecto
qCRD13(p:Px) <- (exists Sx, Jx,Cx)(spj(s:Sx, p:Px, j:Jx) and s(s:Sx, ciudad:Cx) and j(j:Jx, ciudad:Cx));
% Ejercicio 14: Códigos de proyectos suministrados por un suministrador de una ciudad distinta a la del
%suministrador
qCRD14(j:Jx)<-(exists Sx, Cx, Cy)(spj(s:Sx, j:Jx) and s(s:Sx, ciudad:Cx) and j(j:Jx,ciudad:Cy)
and Cx<>Cy);
% Ejercicio 22: Nombre de los proyectos a los que suministra 'S1'
qCRD22(nomj:Njx) <- (exists Jx)( j(j:Jx, nomj:Njx) and spj(j:Jx, s:'S1'));
% Ejercicio 23: Colores de las piezas suministradas por 'S1'
qCRD23(color:Cox) <- (exists Px)( p(p:Px, color:Cox) and spj(p:Px, s:'S1'));
% Ejercicio 24: Códigos de piezas suministradas a cualquier proyecto de 'Londres'
qCRD24(p:Px) <- (exists Jx)( j(j:Jx, ciudad:'Londres') and spj(p:Px, j:Jx));
% Ejercicio 25: Códigos de proyectos que usen al menos una pieza suministrada por 'S1'
qCRD25(j:Jx ) <- spj(j:Jx,s:'S1') ;
% Ejercicio 26: Códigos de suministradores que suministren al menos una pieza suministrada al menos
% por un suministrador que suministre al menos una pieza de color 'rojo'
qCRD26(s:Sx) <- (exists Px, Sy,Py) (p(p:Px,color:'rojo') and spj(s:Sy, p:Px) and spj(s:Sy, p:Py)
and spj(p:Py, s:Sx));
% Ejercicio 27: Códigos de suministradores con estado menor que 'S1'
qCRD27(s:Sx) <- (exists Ex, Ey) (s(s:'S1', estado:Ey) and s(s:Sx, estado:Ex) and Ex<Ey ) ;
% Ejercicio 30: Códigos de proyectos que no reciban ninguna pieza roja suministrada por algún
%suministrador de 'Londres'
qCRD30(j:Jx) <-spj(j:Jx) and not (exists Jy)((exists Sx)( exists Px) (spj(s:Sx,p:Px,j:Jy)
and s(s:Sx, ciudad:'Londres') and p(p:Px, color:'rojo') and Jx=Jy));
Pág. 21 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 31: Códigos de proyectos suministrados únicamente por 'S1'
qCRD31a(j:Jx) <- spj(j:Jx) and not (exists Sx) (spj(s:Sx,j:Jx) and Sx<>'S1') ;
qCRD31b(j:Jx) <- spj(j:Jx) and (forall Sx) (not spj(s:Sx,j:Jx) or not Sx<>'S1') ;
% Ejercicio 32: Códigos de piezas suministradas a todos los proyectos de Londres
qCRD32a(p:Px) <- p(p:Px) and (forall Jx) (not j(j:Jx,ciudad:'Londres') or (spj(p:Px,j:Jx) )) ;
qCRD32b(p:Px) <- p(p:Px) and not (exists Jx) (j(j:Jx,ciudad:'Londres') and not (spj(p:Px,j:Jx) )) ;
% Ejercicio 33: Códigos de suministradores que suministren al menos la misma pieza a todos los proyectos
qCRD33a(s:Sx)<- spj(s:Sx) and (forall Jx)(not j(j:Jx) or (exists Px)(spj(s:Sx,p:Px,j:Jx)) );
qCRD33b(s:Sx)<- spj(s:Sx) and not (exists Jx) ( j(j:Jx) and not (exists Px)(spj(s:Sx,p:Px,j:Jx)) );
% Ejercicio 34: Códigos de proyectos que reciben al menos las piezas suministradas por 'S1'
qCRD34a(j:Jx) <- spj(j:Jx) and (forall Px) (not spj(p:Px,s:'S1') or (spj(p:Px,j:Jx) )) ;
qCRD34b(j:Jx) <- spj(j:Jx) and not (exists Px) (spj(p:Px,s:'S1') and not (spj(p:Px,j:Jx) )) ;
% Ejercicio 35: Construir una lista ordenada de todas las ciudades en las que al menos resida un
% suministrador, una pieza o un proyecto
qCRD35(ciudad:Cx) <- s(ciudad:Cx) or p(ciudad:Cx) or j(ciudad:Cx);
% Ejercicio 41: Códigos de piezas suministradas a proyectos en 'Londres' o suministradas por un
suministrador de 'Londres'
qCRD41(p:Px) <- (exists Jx) (j (j:Jx,ciudad:'Londres') and spj(p:Px, j:Jx) )
or (exists Sx) (s(s:Sx,ciudad:'Londres') and spj(p:Px,s:Sx) ) ;
% Ejercicio 42: Códigos de proyectos en 'Londres' o con algún suministrador en 'Londres'
qCRD42(j:Jx) <- (j (j:Jx,ciudad:'Londres') )
or (exists Sx) (s(s:Sx,ciudad:'Londres') and spj(j:Jx,s:Sx) ) ;
4.4.
SQL
% Ejercicio 1: Todos los atributos de todos los proyectos
qSQL1 := select * from j;
% Ejercicio 2: Todos los atributos de todos los proyectos en 'Londres'
qSQL2 := select * from j where ciudad= 'Londres' ;
% Ejercicio 3: Códigos de suministradores del proyecto 'J1' ordenados
qSQL3 := select s from spj where j ='J1'order by s ;
% Ejercicio 4: Suministros cuya cantidad esté entre 300 y 750 inclusive
qSQL4 := select s,p,j from spj where cant>= 300 and cant<= 750 ;
% Ejercicio 5: Ocurrencias de P.color y P.ciudad eliminando los pares duplicados
qSQL5 := select distinct color, ciudad from p;
% Ejercicio 6: Posibles trios de código de suministrador código de pieza y código de proyecto
% con suministrador, pieza y proyecto localizados en la misma ciudad
qSQL6:=select s, p, j from s,p,j where s.ciudad =p.ciudad and p.ciudad =j.ciudad;
Pág. 22 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 7: Trios de código de suministrador código de pieza y código de proyecto de aquellos
% suministros con suministrador, pieza y proyecto localizados en la misma ciudad
qSQL7:=select spj.s, spj.p, spj.j from spj,s,p,j where s.ciudad =p.ciudad and p.ciudad =j.ciudad
and spj.s=s.s and spj.p=p.p and spj.j=j.j;
% Ejercicio 8: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén todos localizados en la misma ciudad
qSQL8:=select s, p, j from s,p,j where (s.ciudad <> p.ciudad or p.ciudad <>j.ciudad
or s.ciudad <> j.ciudad);
% Ejercicio 9: Posibles trios de código de suministrador, código de pieza y código de proyecto
% que no estén ninguno localizados en la misma ciudad
qSQL9:=select s, p, j from s,p,j
where (s.ciudad <> p.ciudad and p.ciudad <>j.ciudad and s.ciudad <> j.ciudad);
% Ejercicio 10: Códigos de piezas suministradas por suministradores de 'Londres'
qSQL10:=select distinct p from spj,s where spj.s=s.s and s.ciudad= 'Londres' ;
% Ejercicio 11: Códigos de piezas suministradas por suministradores de 'Londres' a proyectos en 'Londres'
qSQL11:=select distinct p from spj,s, j
where spj.s=s.s and spj.j=j.j and s.ciudad= 'Londres' and j.ciudad= 'Londres' ;
% Ejercicio 12: Pares de ciudades en que un suministrador de la primera sirva a un proyecto de la segunda
qSQL12:=select distinct s.ciudad, j.ciudad from s, j, spj where spj.s=s.s and spj.j=j.j;
% Ejercicio 13: Códigos de piezas suministradas a un proyecto por un suministrador de la misma ciudad
% que el proyecto
qSQL13:=select distinct p from s, j, spj where spj.s=s.s and spj.j=j.j and s.ciudad= j.ciudad;
% Ejercicio 14: Códigos de proyectos suministrados por un suministrador de una ciudad distinta a la del
%suministrador
qSQL14:=select distinct j.j from s, j, spj where spj.s=s.s and spj.j=j.j and s.ciudad <> j.ciudad;
% Ejercicio 15: Pares de códigos de piezas suministradas por el mismo suministrador
qSQL15:=select distinct spj1.p, spj2.j from spj spj1, spj spj2 where spj1.s=spj2.s and spj1.p <>spj2.j;
% Ejercicio 16: Número total de proyectos suministrados por 'S1'
qSQL16:=select count(distinct j) from spj where s='S1';
% Ejercicio 17: Cantidad total de piezas 'P1' suministradas por 'S1'
qSQL17:=select sum(cant) from spj where s='S1';
% Ejercicio 18: Para cada pieza suministrada a un proyecto el código de pieza, proyecto y la cantidad total
qSQL18:=select p, j, sum(cant) from spj group by p,j;
% Ejercicio 19: Códigos de proyectos y de piezas en los que la cantidad suministrada a algún proyecto sea
en % una cantidad media superior a 320
qSQL19:=select j,p, avg(cant) as cmedia from spj group by j,p having cmedia>320;
% Ejercicio 20: Códigos de suministros en los que la cantidad no sea nula
qSQL20:=select s,j, p from spj where cant = 0;
Pág. 23 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 21: Códigos de proyectos y ciudades en que la ciudad tenga una 'o' en la segunda letra
%qSQL21:=select j, ciudad from j where ciudad like '_o%';
% Ejercicio 22: Nombre de los proyectos a los que suministra 'S1'
qSQL22:=select nomj from j,spj where spj.j=j.j and spj.s='S1' ;
% Ejercicio 23: Colores de las piezas suministradas por 'S1'
qSQL23:=select distinct color from spj,p where spj.p=p.p and spj.s='S1' ;
% Ejercicio 24: Códigos de piezas suministradas a cualquier proyecto de 'Londres'
qSQL24a:=select distinct p from spj,j where spj.j=j.j and j.ciudad='Londres' ;
qSQL24b:=select distinct p from spj where spj.j in (select j from j where j.ciudad='Londres' );
qSQL24c:=select distinct p from spj where exists (select * from j where spj.j=j.j and j.ciudad='Londres' );
% Ejercicio 25: Códigos de proyectos que usen al menos una pieza suministrada por 'S1'
qSQL25:=select distinct j from spj where spj.s='S1' ;
% Ejercicio 26: Códigos de suministradores que suministren al menos una pieza suministrada
%al menos por un suministrador que suministre al menos una pieza de color 'Rojo'
%suministradores_piezas_rojas := (select s from spj spj3 where spj3.p in
%
(select p from p where color ='rojo'));
%piezas_que_suministran := select p from spj spj2 where spj2.s
%
in (select s from spj spj3 where spj3.p in ( select p from p where color ='rojo'));
qSQL26:=select distinct s from spj spj1
where spj1.p in (select p from spj spj2
where spj2.s in (select s from spj spj3
where spj3.p in (select p from p
where color ='rojo')));
% Ejercicio 27: Códigos de suministradores con estado menor que 'S1'
qSQL27a:=select sx.s from s sx, s sy where sy.s='S1' and sx.estado < sy.estado;
qSQL27b:=select s from s where estado < (select estado from s where s='S1');
% Ejercicio 28: Códigos de proyectos que usen la pieza 'P1' en una cantidad media mayor que la mayor
% cantidad en la que cualquier pieza sea suministrada al proyecto 'J1'
t_MAX_cant_J1:=select max(cant) as max_cant from spj where j='J1';
qSQL28:=select j,max_cant,avg(cant) as cmedia from spj,t_MAX_cant_J1
where p='P1'
group by j,max_cant
having cmedia>max_cant;
% Ejercicio 29: Códigos de suministradores que suministren a algún proyecto la pieza 'P1' en
% una cantidad mayor que la cantidad media en la que se suministra la pieza 'P1' a dicho proyecto
t_AVG_cant_P1:=select j,avg(cant) as cmedia from spj where p='P1' group by j;
qSQL29:=select distinct s from spj,t_AVG_cant_P1 t
where p='P1' and t.j=spj.j and cant >cmedia;
Pág. 24 de 25
Bases de Datos
Problemas de lenguajes relacionales y SQL
Sevilla, mayo 2007, V 2007.5.1
% Ejercicio 30: Códigos de proyectos que no reciban ninguna pieza roja suministrada por algún
% suministrador de 'Londres'
qSQL30:=select distinct j from j where j not in
(select j from spj, p, s where spj.p = p.p and spj.s=s.s and p.color='rojo' and s.ciudad='Londres');
% Ejercicio 31: Códigos de proyectos suministrados únicamente por 'S1'
qSQL31a:=select distinct j from spj spj1 where not exists
(select * from spj spj2 where spj1.j = spj2.j and spj2.s<>'S1');
qSQL31b:=select distinct j from spj spj1 where j not in
(select j from spj spj2 where spj2.s<>'S1');
% Ejercicio 32: Códigos de piezas suministradas a todos los proyectos de Londres
qSQL32 := select distinct p from p
where not exists (select * from j where j.ciudad= 'Londres'
and not exists (select * from spj where spj.j = j.j and spj.p =p.p)) ;
% Ejercicio 33: Códigos de suministradores que suministren al menos la misma pieza a todos los proyectos
qSQL33 := select distinct spj1.s from spj spj1
where not exists (select * from j
where not exists (select * from spj spj2
where spj2.j = j.j and spj2.p =spj1.p and spj2.s =spj1.s)) ;
% Ejercicio 34: Códigos de proyectos que reciben al menos las piezas suministradas por 'S1'
qSQL34 := select distinct spj1.j from spj spj1
where not exists (select * from spj spj2 where s='S1'
and not exists (select * from spj spj3
where spj1.j = spj3.j and spj3.p =spj2.p)) ;
% Ejercicio 35: Construir una lista ordenada de todas las ciudades en las que al menos resida un
%suministrador, una pieza o un proyecto
qSQL35 := select ciudad from s union select ciudad from p union select ciudad from j;
% Ejercicio 41: Códigos de piezas suministradas a proyectos en 'Londres' o suministradas por un
% suministrador de 'Londres'
qSQL41 := select distinct p from spj where ((j in (select j from j where ciudad= 'Londres' ))
or (s in (select s from s where ciudad= 'Londres' )));
% Ejercicio 42: Códigos de proyectos en 'Londres' o con algún suministrador en 'Londres'
qSQL42 := select distinct j from j where (ciudad= 'Londres'
or (j in (select j from spj where (s in (select s from j where ciudad= 'Londres')))));
Pág. 25 de 25
Descargar