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, CxJ(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, CantxSPJ(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, CxJ(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.ciudadS(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.pSPJ(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.nomjJ(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.colorP(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.pSPJ(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.jSPJ(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 ) ) {JxSPJ(j:Jx) ∧ ( ∃Sx ) (SPJ(s:Sx,j:Jx) ∧ Sx<> 'S1')} {JxSPJ(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 ) ∧ ( )( ) ( )( ) {PxP ( p:Px ) ∧ (∀Jx ) ( not J(j:Jx, ciudad:'Londres') ∨ SPJ(p:Px, j:Jx) )} {PxP ( 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) ( )( ) {SxSPJ(s:Sx) ∧ (∀Jx ) ( not J(j:Jx) ∨ (∃Px ) (SPJ(s:Sx, p:Px, j:Jx)) )} {SxSPJ(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) ) ( ) ( ) ) {JxSPJ(j:Jx) ∧ (∀Px ) ( ¬SPJ ( p:Px, s:'S1' ) ∨ SPJ ( p:Px, j:Jx ) )} {JxSPJ(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)} {CxS ( 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