You are on page 1of 26

Departamento de Lenguajes y Sistemas Informticos

E.T.S. Ingeniera Informtica. Universidad de Sevilla



Avda Reina Mercedes s/n. 41012 Sevilla
Tlf/Fax 954 557 139 E-mail lsi@lsi.us.es Web www.lsi.us.es


E.T.S. Ingeniera
Informtica




























Bases de Datos

Problemas resueltos de lenguajes relacionales y SQL







Sevilla, mayo 2009
V 2009.5.1
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 2 de 26

1. Relaciones de la BD ejemplo
1.1. Esquema
Para la realizacin de los ejercicios se utilizar la base de datos compuesta por las relaciones
suministradores, piezas, proyectos y suministros.
La relacin S representa los suministradores, cada uno con un cdigo nico (s) y adems los
atributos nombre de proveedor (noms), estado (estado) y ciudad (ciudad).
La relacin P representa las piezas, con un cdigo de pieza nico (p), nombre de pieza (nomp),
color (color), peso (peso) y ciudad (ciudad).
La relacin J representa los proyectos, con un cdigo de proyecto nico (j), nombre del proyecto
(nomj) y ciudad (ciudad).
La relacin 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 relacin est formada por el
cdigo de suministradores, el cdigo de pieza y el cdigo 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. Extensin BD ejemplo.
s noms estado ciudad
'S1' 'Smith' 20 'Londres'
'S2' 'Jones' 10 'Pars'
'S3' 'Blake' 30 'Pars'
'S4' 'Clark' 20 'Londres'
'S5' 'Adams' 30 'Atenas'
Tabla 1: Relacin S de suministradores.

p nomp color peso ciudad
'P1' 'Mesa' 'rojo' 12 'Londres'
'P2' 'Silla' 'blanca' 17 'Pars'
'P3' 'Armario' 'gris' 17 'Roma'
'P4' 'Archivador' 'rojo' 14 'Londres'
'P5' 'Puerta' 'blanca' 12 'Pars'
'P6' 'Lmpara' 'amarilla' 19 'Londres'
Tabla 2: Relacin P de piezas.

j nomj ciudad
'J1' 'Edificio 1' 'Pars'
'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: Relacin J de proyectos.




s p j cant
'S1' 'P1' 'J1' 200
'S1' 'P1' 'J4' 200
'S1' 'P1' 'J5' 700
'S2' 'P3' 'J1' 400
'S2' 'P3' 'J2' 200
'S2' 'P3' 'J3' 200
'S2' 'P3' 'J4' 500
'S2' 'P3' 'J5' 600
'S1' 'P3' 'J6' 400
'S2' 'P3' 'J7' 800
'S2' 'P5' 'J2' 100
'S3' 'P3' 'J1' 200
'S3' 'P4' 'J2' 500
'S4' 'P6' 'J3' 300
'S4' 'P6' 'J7' 300
'S1' 'P3' 'J7' 70
'S1' 'P3' 'J5' 50
'S1' 'P3' 'J4' 40
'S1' 'P3' 'J3' 30
'S1' 'P3' 'J2' 20
Tabla 4: Relacin SPJ de suministros.
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 3 de 26

2. Ejercicios propuestos.
1. Obtener todos los atributos de todos los proyectos.
2. Obtener todos los atributos de todos los proyectos en Londres.
3. Obtener los cdigos de los suministradores del proyecto J1 ordenados.
4. Obtener los suministros cuya cantidad est entre 300 y 750 inclusive.
5. Obtener todas las ocurrencias de P.color y P.ciudad eliminando los pares duplicados.
6. Obtener todos los posibles tros de cdigo de suministrador, de pieza y de proyecto en los que el
suministrador, pieza y proyecto estn todos en la misma ciudad.
7. Obtener los cdigos de suministrador, de pieza y de proyecto de aquellos suministros en los que el
suministrador, pieza y proyecto estn todos en la misma ciudad.
8. Obtener todos los posibles tros de cdigo de suministrador, de pieza y de proyecto en los que el
suministrador, pieza y proyecto no estn todos en la misma ciudad.
9. Obtener todos los posibles tros de cdigo de suministrador, de pieza y de proyecto en los que el
suministrador, pieza y proyecto no estn ninguno en la misma ciudad.
10. Obtener las piezas suministradas por suministradores de Londres.
11. Obtener las piezas suministradas por suministradores de Londres a proyectos en Londres.
12. Obtener todos los pares de nombres de ciudades en las que el suministrador de la primera sirva a un
proyecto de la segunda.
13. Obtener cdigos de piezas que sean suministradas a un proyecto por un suministrador de la misma
ciudad del proyecto.
14. Obtener cdigos de proyectos que sean suministrados por un suministrador de una ciudad distinta a
la del proyecto.
15. Obtener todos los pares de cdigos de piezas suministradas por el mismo suministrador.
16. Obtener el nmero total de proyectos suministrados por el suministrador S1.
17. Obtener la cantidad total de piezas P1 suministradas por S1.
18. Obtener para cada pieza suministrada a un proyecto, el cdigo de pieza, el cdigo de proyecto y la
cantidad total correspondiente.
19. Obtener los cdigos de proyectos y los cdigos de piezas en los que la cantidad suministrada a algn
proyecto sea en una cantidad media superior a 320.
20. Obtener los cdigos de suministros en los que la cantidad no sea nula.
21. Obtener los cdigos de proyectos y ciudades en que la ciudad tenga una o en la segunda letra.
22. Obtener los nombres de los proyectos a los que suministra S1.
23. Obtener los colores de las piezas suministradas por S1.
24. Obtener los cdigos de las piezas suministradas a cualquier proyecto de Londres.
25. Obtener los cdigos de proyectos que usen al menos una pieza suministrada por S1.
26. Obtener los cdigos de suministradores que suministren al menos una pieza suministrada al menos
por un suministrador que suministren al menos una pieza de color rojo.
27. Obtener los cdigos de suministradores con estado menor que S1.
28. Obtener los cdigos 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.
29. Obtener los cdigos de suministradores que suministren a algn proyecto la pieza P1 en una cantidad
mayor que la cantidad media en la que se suministra la pieza P1 a dicho proyecto.
30. Obtener los cdigos de los proyectos que no reciben ninguna pieza roja suministrada por algn
suministrador de Londres.
31. Obtener los cdigos de los proyectos suministrados nicamente por S1.
32. Obtener los cdigos de piezas suministradas a todos los proyectos en Londres.
33. Obtener los cdigos de los suministradores que suministren al menos la misma pieza a todos los
proyectos.
34. Obtener los cdigos de los proyectos que reciban al menos todas las piezas que suministra S1.
35. Construir una lista ordenada de todas las ciudades en la que al menos resida un suministrador, una
pieza o un proyecto.
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 4 de 26

36. Mostrar los resultados de la siguiente consulta:
SELECT P.color FROM P UNION SELECT P.color FROM P
37. Cambiar el color de todas las piezas rojas a naranjas.
38. Borrar todos los proyectos para los que no haya suministros.
39. Borrar todos los proyectos en Roma y sus suministros correspondientes.
40. Insertar un nuevo suministro S10 en la tabla S. El nombre y la ciudad son White y New York. El
estado no se conoce todava.
41. Construir una tabla conteniendo una lista de los cdigos de las piezas suministradas a proyectos en
Londres o suministradas por un suministrador de Londres.
42. Construir una tabla conteniendo una lista de los cdigos de los proyectos de Londres o que tengan
algn 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'
J


{ } Jx J (Jx) Jx.ciudad = 'Londres'
{ }
Jx, Nx, Cx J(j:Jx, nomj:Nx, ciudad : Cx) Cx = 'Londres'
SELECT * FROM J WHERE ciudad = Londres;

3. ( )
j = 'J1'
s
SPJ
| |
|
|
\


{ } SPJx.s SPJ (SPJx) SPJx.j = 'J1'
{ }
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.
Color, ciudad
P


{ } Px.color, Px.ciudad P(Px)
{ }
Cox, Cx J(color:Cox, ciudad:Cx)
SELECT DISTINCT color, ciudad FROM P;
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 5 de 26



6. ( )
S.ciudad=P.ciudad P.ciudad=J.ciudad
s,p,j s, p, j
S P J O bien S P J

| |
| |
|
|
|
\
\




{ } Sx.s, Px.p, Jx.j S(Sx) P(Px) J(Jx) Sx.ciudad = Px.ciudad Px.ciudad = Jx.ciudad
( )
( )
{ }
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,SPJ.p,SPJ.j
SPJ S P J


{
( )( )( )
( ) ( ) ( ) S Sx P Px J Jx
Spjx.s, Spjx.p, Spjx.j SPJ(Spjx) 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.ciudad P.ciudad s, p, j
P.ciudad J.ciudad
J.ciudad S.ciudad
S P J



| |
|
|
|
|
\


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. ( )
J.ciudad S.ciudad S.ciudad P.ciudad S.ciudad P.ciudad P.ciudad J.ciudad s, p, j s, p, j
P.ciudad J.ciudad
J.ciudad S.ciudad
S P J O bien: S P J




| |
| |
|
| |
|
|
|
|
\ | |
| \
\




Sx.s, Px.p, Jx.j S(Sx) P(Px) J(Jx) Sx.ciudad Px.ciudad Px.ciudad Jx.ciudad
Sx.ciudad Jx.ciuda

d


`

)

( )( ) ( )
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;
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 6 de 26


10.
Ciudad='Londres'
p
SPJ S
| |

|
\



( )
( )
( ) { }
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.
S.Ciudad='Londres'
p
SPJ S J
| |

|
\



( )( )
S(Sx) J(Jx) SPJx.s=Sx.s SPJx.j = Jx.j
SPJx.p SPJ(SPJx) 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 = S.s
SPJ.s = S.s SPJ.j = J.j S.ciudad,J.ciudad S.ciudad,J.ciudad
SPJ.j = J.j
SPJ S J O bien: SPJ S J

| |
| |
|
|
|
\
\




( )
( )
( ) { }
Sx.ciudad, Jx.ciudad S(Sx) J(Jx) 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.
p
SPJ S J
| |

|
\



( )( )
( ) ( ) S Sx J Jx SPJx.s = Sx.s SPJx.j = Jx.j
SPJx.p SPJ(SPJx) Sx Jx
Sx.ciudad = Jx.ciudad
| | | |


| | `
|

\ \ )

( )( )( )
( )
{ }
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;


Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 7 de 26

14. ( )
SPJ.s=S.s SPJ.j = J.j
SPJ.j = J.j SPJ.s=S.s S.ciudad J.ciudad SPJ.j SPJ.j
S.ciudad J.ciudad
SPJ S J O bien: SPJ S J


| |
| |
| |
|
|
|
| |
\ |
\
\




( )( )
( ) ( ) S Sx J Jx SPJx.s = Sx.s SPJx.j = Jx.j
SPJx.j SPJ(SPJx) Sx Jx
Sx.ciudad Jx.ciudad
| | | |


| | `
|

\ \ )

( )( )( )
( )
{ }
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.s = SPJ2.s
SPJ1.s = SPJ2.s SPJ1.p, SPJ2.p SPJ1.p, SPJ2.p
SPJ1.p < SPJ2.p
SPJ1.p < SPJ2.p
SPJ,SPJ1 SPJ,SPJ2 O bien: SPJ,SPJ1 SPJ,SPJ2


| |
| |
|
|
|
|
|
\
\




{ }
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)
s 'S1'
SPJ


SELECT COUNT ( DISTINCT j ) FROM SPJ WHERE s = S1;

17. Este ejercicio no puede resolverse en CROT ni CROD.
( )
( )
sum(cant)
s='S1' p='P1'
SPJ


SELECT SUM ( cant ) FROM SPJ WHERE s = S1 AND p = P1;

18. Este ejercicio no puede resolverse en CROT ni CROD.
( )
p,j,sum(cantidad)
p,j
SPJ

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
p,j
SPJ

>
| |
|
\


SELECT p, j FROM SPJ GROUP BY p, j HAVING AVG( cant ) > 320;
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 8 de 26

20. ( )
( )
cant Null
S,P,J
SPJ

<> <> <> <>



{ } SPJx.s, SPJx.p, SPJx.j SPJ (SPJx) SPJx.cant <> null
( )
( ) ( )
{ }
Sx, Px, Jx Cantx SPJ s:Sx, p:Px, j:Jx, cant:Cantx Cantx<>null
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.
s='S1'
Color
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);


Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 9 de 26

24.
Ciudad = 'Londres'
p
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:
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.
( )
Color='Rojo'
s p s
SPJ SPJ SPJ P
| | | | | | | | | |
| | | | |
| |
\ \ \ \ \




( )
( )( )( )
SPJ(SPJy) SPJ(SPJz) P(Px) SPJx.p = SPJy.p
SPJx.s SPJ SPJx 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 ) ) );


Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 10 de 26

27.
( ) ( ) ( ) ( ) ( )
S1.s='S1'
S1.s='S1' S2.s S2.s
S1.estado S2.estado
S1.estado S2.estado
S,S1 S,S2 O bien: S,S1 S,S2
>
>
| |
| |
|
|
|
|
|
\
\




( )
( )
( )
( ) { }
Sx.s S Sx Sy Sy.s = 'S1' Sx.estado Sy.estado <
( )( )
( )
{ }
Sx Ex Ey S(s:'S1', estado:Ex) S(s:Sx, estado:Ey) Ey < Ex
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);

28. Este ejercicio no puede resolverse en CROT ni CROD.
( )
( )
( )
max(cant)
j='J1'
j
avg(cant) SPJ
j
p='P1'
SPJ

| | | |
| |
>
| |
\ \
| |
|
|
|
|
\


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.
( ) ( )
( ) SPJ2.p='P1'
SPJ2.j=SPJ1.j
SPJ1= SPJ SPJ2= SPJ
avg(cantidad)
p='P1' cant SPJ2
s
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);

Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 11 de 26

30.
SPJ.p=P.p SPJ.s=S.s
Color='Rojo' Ciudad='Londres
j j
J SPJ P S

| | | | | |
| | |
| | |
| | |
\ \ \





( )
( )
( )
( )
( )
( )
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);


31.
( )
s 'S1'
j j
SPJ 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);



Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 12 de 26

32.
( )
p, j
Ciudad = 'Londres'
j
SPJ
J


( )
Ciudad = 'Londres'
p p j p j,p
SPJ J SPJ SPJ
| | | |

| |
|
\ \



( )
( )
( ) ( )
( )
( ) ( )
J Jx Jx.ciudad = 'Londres'
SPJx.p SPJ SPJx 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
| |

|

`
|

|

\ )



( )
( )
( )
{ }
( ) ( ) ( )
( ) { }
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 ));
33.
s,p, j
s
j
SPJ
J
| |
|
|
|
\


s s,p s,p j s,p s,p,j
SPJ J SPJ SPJ
| | | | | |
| | |
| |
\ \ \



( )
( )
( ) ( )
( )
( ) ( )
( )
( )
( ) ( )
( )
( ) ( )
J Jx
SPJx.s SPJ SPJx Jx
SPJy SPJ SPJy SPJy.p = SPJx.p SPJy.s = SPJx.s SPJy.j = Jx.j
J Jx
SPJx.s SPJ SPJx 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 ));
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 13 de 26


34.
( )
p,j
s='S1'
p
SPJ
SPJ


( )
s= 's1'
j j p j p,j
SPJ SPJ SPJ SPJ
| | | |

| |
|
\ \



( )
( )
( ) ( )
( )
( ) ( )
( )
( )
( ) ( )
( )
( ) ( )
SPJ SPJy SPJy.s= 'S1'
SPJx.j SPJ SPJx SPJy
SPJz SPJ SPJy SPJz.p = SPJy.p SPJz.j = SPJx.j
SPJ SPJy SPJy.s= 'S1'
SPJx.j SPJ SPJx 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 ));

35.
Ciudad Ciudad Ciudad
S P J
| | | | | |
| | |
\ \ \



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 clusula ORDER BY en una sentencia SELECT que use el operador UNION debe identificar las
columnas por las que se quiere ordenar por su posicin, no por el nombre, ya que las columnas del
resultado de una UNION son annimas.

36.
'amarillo'
'gris'
'blanca'
'rojo'


Es equivalente a:
SELECT DISTINCT color FROM P;
Bases de Datos
Sevilla, octubre 2003, V 2003.01.1
Problemas de lenguajes relacionales y SQL

Pg. 14 de 26


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.);

41.
( ) ( )
ciudad='Londres' ciudad='Londres'
p p
SPJ J SPJ S
| | | |
| |
\ \




( )
( )
( )
( )
( ) J Jx Jx.j = SPJx.j S Sx Sx.s = SPJx.s
SPJx.p | SPJ SPJx Jx Sx
Jx.ciudad = 'Londres' Sx.ciudad = 'Londres'
| | | | | | | |

| | | | `
| |

\ \ \ \ )


( )
( ) ( )
( )
( )
Px | 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 ) ;




Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 15 de 26

42.
( )
ciudad='Londres' ciudad='Londres'
j j
J SPJ S
| | | |
| |
| |
|
\
\ \



( )
( )( )
( ) ( ) ( )
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 ) ) ;
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 16 de 26

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: Cdigos 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 cdigo de suministrador, cdigo de pieza y cdigo 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 cdigo de suministrador, cdigo de pieza y cdigo 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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: Cdigos de piezas suministradas por suministradores de 'Londres'
qAR10:=project p((select(ciudad='Londres')(s)) njoin (spj));

% Ejercicio 11: Cdigos 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;
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 17 de 26

qAR12:=project c_s, c_j(select (ss =s and jj=j) ((tAR12_spj product tAR12_s) product (tAR12_j))) ;

% Ejercicio 13: Cdigos 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: Cdigos 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 cdigos 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: Cdigos de piezas suministradas a cualquier proyecto de 'Londres'
qAR24:=project p((select(ciudad='Londres' ) ((spj) njoin (j)) ) );

% Ejercicio 25: Cdigos de proyectos que usen al menos una pieza suministrada por 'S1'
qAR25:=project j (select(s='S1')(spj));

% Ejercicio 26: Cdigos 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: Cdigos 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: Cdigos de proyectos que no reciban ninguna pieza roja suministrada por algn
% 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: Cdigos de proyectos suministrados nicamente por 'S1'
qAR31:=(project j (spj)) difference (project j (select (s<>'S1') (spj)));



Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 18 de 26


% Ejercicio 32: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos de proyectos en 'Londres' o con algn 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. Clculo 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: Cdigos 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) };

Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 19 de 26


% Ejercicio 6: Posibles trios de cdigo de suministrador cdigo de pieza y cdigo 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 cdigo de suministrador cdigo de pieza y cdigo 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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 cdigos 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};
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 20 de 26


% 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: Cdigos 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: Cdigos de proyectos que usen al menos una pieza suministrada por 'S1'
qCRT25:={Spjx.j | spj(Spjx) and Spjx.s='S1'};

% Ejercicio 26: Cdigos 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: Cdigos 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: Cdigos de proyectos que no reciban ninguna pieza roja suministrada por algn
% 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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)) ) };



Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 21 de 26


% 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: Cdigos 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: Cdigos de proyectos en 'Londres' o con algn 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. Clculo 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: Cdigos 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 cdigo de suministrador cdigo de pieza y cdigo 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 cdigo de suministrador cdigo de pieza y cdigo 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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)))) ;



Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 22 de 26

% Ejercicio 9: Posibles trios de cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos de proyectos que usen al menos una pieza suministrada por 'S1'
qCRD25(j:Jx ) <- spj(j:Jx,s:'S1') ;

% Ejercicio 26: Cdigos 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: Cdigos 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: Cdigos de proyectos que no reciban ninguna pieza roja suministrada por algn
%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));


Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 23 de 26

% Ejercicio 31: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos de proyectos en 'Londres' o con algn 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: Cdigos 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 cdigo de suministrador cdigo de pieza y cdigo 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;

Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 24 de 26

% Ejercicio 7: Trios de cdigo de suministrador cdigo de pieza y cdigo 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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 cdigo de suministrador, cdigo de pieza y cdigo de proyecto
% que no estn 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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 cdigos 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: Nmero 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 cdigo de pieza, proyecto y la cantidad total
qSQL18:=select p, j, sum(cant) from spj group by p,j;

% Ejercicio 19: Cdigos de proyectos y de piezas en los que la cantidad suministrada a algn 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: Cdigos de suministros en los que la cantidad no sea nula
qSQL20:=select s,j, p from spj where cant = 0;
Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 25 de 26


% Ejercicio 21: Cdigos 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: Cdigos 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: Cdigos de proyectos que usen al menos una pieza suministrada por 'S1'
qSQL25:=select distinct j from spj where spj.s='S1' ;

% Ejercicio 26: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos de suministradores que suministren a algn 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;


Bases de Datos
Sevilla, mayo 2009, V 2009.5.1
Problemas de lenguajes relacionales y SQL

Pg. 26 de 26

% Ejercicio 30: Cdigos de proyectos que no reciban ninguna pieza roja suministrada por algn
% 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos 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: Cdigos de proyectos en 'Londres' o con algn 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')))));

You might also like