Advertisement
alexusgracia

BD SQL i Àlgebra Relacional

Dec 26th, 2017
1,030
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. REPÀS:selects, inserts, deletes, updates, creates, Àlgebra
  2.  
  3. --------------------------------------------------------
  4. Donar una sentència SQL per obtenir els professors que tenen alguna assignació finalitzada (instantFi diferent de null) a un despatx amb superfície superior a 15 i que cobren un sou inferior o igual a la mitjana del sou de tots els professors. En el resultat de la consulta ha de sortir el dni del professor, el nom del professor, i el darrer instant en què el professor ha estat assignat a un despatx amb superfície superior a 15.
  5.  
  6. Pel joc de proves que trobareu al fitxer adjunt, la sortida ha de ser:
  7.  
  8. DNI NomProf Darrer_instant
  9. 111 toni    344
  10. ---------------------
  11. SELECT p.dni, p.NomProf, MAX(a.instantFi)AS Darrer_instant
  12.     FROM professors p, despatxos d, assignacions a
  13.     WHERE (a.instantFi IS NOT NULL AND d.superficie>15 AND p.dni = a.dni AND a.modul = d.modul AND a.numero = d.numero AND p.sou <= (SELECT AVG(p1.sou) FROM professors p1))
  14. GROUP BY p.dni;
  15. --------------------------------------------------------
  16. Doneu una sentència SQL per obtenir el nom dels professors que o bé se sap el seu número de telèfon (valor diferent de null) i tenen un sou superior a 2500, o bé no se sap el seu número de telèfon (valor null) i no tenen cap assignació a un despatx amb superfície inferior a 20.
  17.  
  18. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  19.  
  20. NomProf
  21. toni
  22. ---------------------
  23. SELECT DISTINCT p.NomProf
  24. FROM professors p
  25. WHERE (p.telefon IS NOT NULL AND p.sou> 2500) OR
  26.         (p.telefon IS NULL AND NOT EXISTS
  27.                 (SELECT * FROM assignacions a , despatxos d
  28.                     WHERE p.dni = a.dni AND a.numero = d.numero AND a.modul = d.modul AND d.superficie <=20))
  29. --------------------------------------------------------
  30. Doneu una sentència SQL per obtenir el número i nom dels departaments que tenen 2 o més empleats que viuen a la mateixa ciutat.
  31.  
  32. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  33.  
  34. NUM_DPT     NOM_DPT
  35. 3       MARKETING
  36.  
  37. ---------------------
  38. SELECT DISTINCT d.num_dpt, d.nom_dpt
  39. FROM departaments d, empleats e
  40. WHERE(d.num_dpt = e.num_dpt)
  41. GROUP BY d.num_dpt, e.ciutat_empl
  42. HAVING COUNT (*) >=2
  43. --------------------------------------------------------
  44. Doneu una sentència SQL per obtenir el número i nom dels departaments tals que tots els seus empleats viuen a MADRID. El resultat no ha d'incloure aquells departaments que no tenen cap empleat.
  45.  
  46. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  47.  
  48. Num_dpt     Nom_dpt
  49. 3       MARKETING
  50.  
  51. ---------------------
  52. SELECT DISTINCT d.num_dpt, d.nom_dpt
  53. FROM departaments d NATURAL INNER JOIN empleats e
  54. WHERE NOT EXISTS (SELECT *
  55.             FROM empleats e
  56.             WHERE e.ciutat_empl <> 'MADRID' AND
  57.                     d.num_dpt = e.num_dpt);
  58.  
  59. --------------------------------------------------------
  60. Doneu una sentència SQL per obtenir el número i nom dels departaments que tenen dos o més empleats que viuen a ciutats diferents.
  61.  
  62. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  63.  
  64. NUM_DPT     NOM_DPT
  65. 3       MARKETING
  66.  
  67. ---------------------
  68. SELECT DISTINCT d.num_dpt, d.nom_dpt
  69. FROM departaments d NATURAL INNER JOIN empleats e
  70. GROUP BY (num_dpt)
  71. HAVING COUNT(DISTINCT e.ciutat_empl)>=2
  72. --------------------------------------------------------
  73. Doneu una sentència SQL per obtenir les ciutats on hi viuen empleats però no hi ha cap departament.
  74.  
  75. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  76.  
  77. CIUTAT_EMPL
  78. GIRONA
  79.  
  80. ---------------------
  81. SELECT DISTINCT ciutat_empl
  82. FROM empleats e
  83. WHERE   NOT EXISTS(SELECT *
  84. FROM departaments d
  85. WHERE e.ciutat_empl = d.ciutat_dpt)
  86. --------------------------------------------------------
  87. Doneu una sentència SQL per obtenir el número i el nom dels departaments que no tenen cap empleat que visqui a MADRID.
  88.  
  89. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  90.  
  91. NUM_DPT     NOM_DPT
  92. 3       MARKETING
  93.  
  94. ---------------------
  95. SELECT DISTINCT d.num_dpt, d.nom_dpt
  96. FROM departaments d
  97. WHERE NOT EXISTS(SELECT *
  98. FROM empleats e
  99. WHERE e.ciutat_empl = 'MADRID' AND d.num_dpt = e.num_dpt);
  100. --------------------------------------------------------
  101. Doneu una sentència SQL per obtenir els números i els noms dels projectes que tenen assignats dos o més empleats.
  102. Cal ordenar el resultat descendement per número de projecte.
  103.  
  104. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  105.  
  106. NUM_PROJ        NOM_PROJ
  107. 1       IBDTEL
  108. ---------------------
  109. SELECT DISTINCT p.num_proj, p.nom_proj
  110. FROM projectes p, empleats e, empleats e2
  111. WHERE (e.num_empl <> e2.num_empl and e.num_proj = e2.num_proj and e.num_proj = p.num_proj)
  112. ORDER BY p.num_proj DESC;
  113. --------------------------------------------------------
  114. Doneu una sentència SQL per obtenir el nom dels empleats que guanyen el sou més alt. Cal ordenar el resultat descendenment per nom de l'empleat.
  115.  
  116. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  117.  
  118. NOM_EMPL
  119. JOAN
  120.  
  121. ---------------------
  122. SELECT DISTINCT e.nom_empl
  123. FROM empleats e
  124. WHERE(e.sou = (SELECT MAX(e1.sou)
  125. FROM empleats e1))
  126. ORDER BY e.nom_empl DESC;
  127. --------------------------------------------------------
  128. Obtenir per cada departament situat a MADRID la mitjana dels sous dels seus empleats. Concretament, cal donar el número de departament, el nom de departament i la mitjana del sou.
  129.  
  130. Pel joc de proves que trobareu al fitxer adjunt, la sortida ha de ser:
  131.  
  132. NUM_DPT     NOM_DPT     SOU
  133. 5       VENDES      250000.00
  134.  
  135. ---------------------
  136. SELECT d.num_dpt, d.nom_dpt, AVG(e.sou)
  137. FROM departaments d, empleats e
  138. WHERE (e.num_dpt = d.num_dpt and d.ciutat_dpt = 'MADRID')
  139. GROUP BY(d.num_dpt)
  140. --------------------------------------------------------
  141. Doneu una sentència SQL per obtenir els números i els noms dels departament situats a MADRID, que tenen empleats que guanyen més de 200000.
  142. Pel joc de proves que trobareu al fitxer adjunt, la sortida ha de ser:
  143.  
  144. NUM_DPT     NOM_DPT
  145. 5       VENDES
  146.  
  147. ---------------------
  148. SELECT DISTINCT d.num_dpt, d.nom_dpt
  149. FROM departaments d, empleats e
  150. WHERE (d.ciutat_dpt = 'MADRID' and d.num_dpt = e.num_dpt and e.sou > 200000)
  151. --------------------------------------------------------
  152. Doneu una sentència SQL per incrementar en 500000 el pressupost dels projectes que tenen algun empleat que treballa a BARCELONA.
  153. Pel joc de proves que trobareu al fitxer adjunt, el pressupost del projecte que hi ha d'haver després de l'execució de la sentència és 1100000
  154. ---------------------
  155. UPDATE PROJECTES p
  156. SET pressupost= pressupost + 500000 WHERE EXISTS(
  157. SELECT p.num_proj
  158. FROM departaments d, empleats e
  159. WHERE (d.num_dpt = e.num_dpt and d.ciutat_dpt = 'BARCELONA' and e.num_proj = p.num_proj));
  160. --------------------------------------------------------
  161. Doneu una sentència d'inserció de files a la taula cost_ciutat que l'ompli a partir del contingut de la resta de taules de la base de dades. Tingueu en compte el següent:
  162.  
  163. Hi haurà una fila de la taula per cada ciutat on hi ha un departament. El valor de l'atribut cost serà la suma del sou dels empleats dels departaments situats a la ciutat.
  164.  
  165. Només han de sortir les ciutats on hi ha departament que tinguin empleats.
  166.  
  167. Pel joc de proves públic del fitxer adjunt, un cop executada la sentència d'inserció, a la taula cost_ciutat hi haurà les tuples següents:
  168.  
  169. CIUTAT_DPT      COST
  170. BARCELONA       100
  171.  
  172. ---------------------
  173. INSERT INTO cost_ciutat (SELECT d.ciutat_dpt, SUM(e.sou)
  174. FROM departaments d, empleats e
  175. WHERE d.num_dpt = e.num_dpt
  176. GROUP BY d.ciutat_dpt);
  177. --------------------------------------------------------
  178. Suposem la base de dades que podeu trobar al fitxer adjunt.
  179. Suposem que aquesta base de dades està en un estat on no hi ha cap fila.
  180. Doneu una seqüència de sentències SQL d'actualització (INSERTs i/o UPDATEs) que violi la integritat referencial de la clau forana de la taula Assignacions que referencia la taula Despatxos (la violació l'ha de causar una tupla de la taula Assignacions amb mòdul C1 i numero de despatx 119).
  181. Les sentències NOMÉS han de violar aquesta restricció.
  182. ---------------------
  183. INSERT INTO PROFESSORS VALUES(123, 'Pere', '611611611', 250000);
  184. INSERT INTO DESPATXOS VALUES('C1', '120', 13);
  185. INSERT INTO ASSIGNACIONS VALUES(123, 'C1', '119', 12, 14);
  186. --------------------------------------------------------
  187. Suposeu la base de dades que podeu trobar al fitxer adjunt.
  188. Doneu una seqüència de sentències SQL d'actualització (INSERTs i/o UPDATEs) de tal manera que, un cop executades, el resultat de la consulta següent sigui el que s'indica. El nombre de files de cada taula ha de ser el més petit possible, i hi ha d'haver com a màxim un professor.
  189.  
  190. Per a la consulta:
  191.  
  192. Select count(*) as quant
  193. From assignacions ass
  194. Where ass.instantInici>50
  195. Group by ass.instantInici
  196. order by quant;
  197.  
  198. El resultat haurà de ser:
  199.  
  200. quant
  201. 1
  202. 2
  203.  
  204. ---------------------
  205. INSERT INTO PROFESSORS VALUES(123, 'Marta Sacher', '611611611', 250000);
  206. INSERT INTO DESPATXOS VALUES('C1', '119', 20);
  207. INSERT INTO DESPATXOS VALUES('C1', '120', 20);
  208. INSERT INTO ASSIGNACIONS VALUES(123, 'C1', '119', 51, 53);
  209. INSERT INTO ASSIGNACIONS VALUES(123, 'C1', '119', 52, 54);
  210. INSERT INTO ASSIGNACIONS VALUES(123, 'C1', '120', 52, 55);
  211. --------------------------------------------------------
  212. Tenint en compte l'esquema de la BD que s'adjunta, proposeu una sentència de creació de les taules següents:
  213. FRANGES_HORARIES(INSTANT_INICI, INSTANT_FI, NUM_EMPL)
  214. TASQUES_REALITZADES(NUM_TASCA, INSTANT_INICI, INSTANT_FI, NUM_EMPL, DESCRIPCIO)
  215.  
  216. Cada fila de la taula franges_horaries representa un periode d'hores seguides què ha treballat un empleat.
  217. Cada fila de la taula tasques_realitzades representa una tasca que un empleat ha realitzat en una franja horaria.
  218.  
  219. En la creació de les taules cal que tingueu en compte que:
  220. - No hi poden haver dues franges d'un mateix empleat que comencin i acabin en uns mateixos instants.
  221. - L'instant fi d'una franja ha de ser més gran que l'instant d'inici més 180.
  222. - Una franja horària ha de ser d'un empleat que existeixi a la base de dades
  223. - No hi pot haver dues tasques amb el mateix número de tasca.
  224. - Una tasca es fa sempre en una franja horària que existeixi a la base de dades
  225. - La descripció d'una tasca ha de tenir un valor definit (valor diferent de null).
  226. - Els atributs instant_inici, instant_fi, num_tasca són enters.
  227. - L'atribut descripció ha de ser un char(50).
  228.  
  229. Respecteu els noms i l'ordre en què apareixen les columnes (fins i tot dins la clau o claus que calgui definir). Tots els noms s'han de posar en majúscules com surt a l'enunciat.
  230. ---------------------
  231. CREATE TABLE FRANGES_HORARIES
  232.        (INSTANT_INICI INTEGER ,
  233.        INSTANT_FI  INTEGER CHECK (INSTANT_INICI - INSTANT_FI > 180),
  234.        NUM_EMPL INTEGER,
  235.        PRIMARY KEY(INSTANT_INICI, INSTANT_FI, NUM_EMPL),
  236.        FOREIGN KEY(NUM_EMPL) REFERENCES EMPLEATS(NUM_EMPL)
  237.        );
  238.  
  239. CREATE TABLE TASQUES_REALITZADES
  240.        (NUM_TASCA INTEGER,
  241.        INSTANT_INICI INTEGER NOT NULL,
  242.        INSTANT_FI INTEGER NOT NULL,
  243.        NUM_EMPL INTEGER NOT NULL,
  244.        DESCRIPCIO CHAR(50) NOT NULL,
  245.        PRIMARY KEY(NUM_TASCA),
  246.        FOREIGN KEY(INSTANT_INICI, INSTANT_FI, NUM_EMPL)
  247.                REFERENCES FRANGES_HORARIES (INSTANT_INICI, INSTANT_FI,NUM_EMPL)
  248.        );
  249. --------------------------------------------------------
  250. Tenint en compte l'esquema de la BD que s'adjunta, proposeu una sentència de creació de les taules següents:
  251. VENDES(NUM_VENDA, NUM_EMPL, CLIENT)
  252. PRODUCTES_VENUTS(NUM_VENDA, PRODUCTE, QUANTITAT, IMPORT)
  253.  
  254. Cada fila de la taula vendes representa una venda que ha fet un empleat a un client.
  255. Cada fila de la taula productes_venuts representa una quantitat de producte venut en una venda, amb un cert import.
  256.  
  257. En la creació de les taules cal que tingueu en compte que:
  258. - No hi poden haver dues vendes amb un mateix número de venda.
  259. - Un empleat només li pot fer una única venda a un mateix client.
  260. - Una venda l'ha de fer un empleat que existeixi a la base de dades
  261. - No hi pot haver dues vegades un mateix producte en una mateixa venda.
  262. - La venda d'un producte venut ha d'existir a la base de dades.
  263. - La quantitat de producte venut no pot ser nul, i té com a valor per defecte 1.
  264. - Els atributs num_venda, quantitat, import són enters.
  265. - Els atributs client, producte són char(30), i char(20) respectivament.
  266.  
  267. Respecteu els noms i l'ordre en què apareixen les columnes (fins i tot dins la clau o claus que calgui definir). Tots els noms s'han de posar en majúscues com surt a l'enunciat.
  268. ---------------------
  269. CREATE TABLE VENDES
  270.        ( NUM_VENDA INTEGER,
  271.        NUM_EMPL INTEGER NOT NULL,
  272.        CLIENT CHAR(30),
  273.        PRIMARY KEY(NUM_VENDA),
  274.        FOREIGN KEY (NUM_EMPL) REFERENCES EMPLEATS (NUM_EMPL),
  275.        UNIQUE (NUM_EMPL, CLIENT));
  276.  
  277. CREATE TABLE PRODUCTES_VENUTS
  278.        ( NUM_VENDA INTEGER,
  279.        PRODUCTE CHAR(20),
  280.        QUANTITAT INTEGER DEFAULT 1 NOT NULL,
  281.        IMPORT INTEGER,
  282.        PRIMARY KEY(NUM_VENDA,PRODUCTE),
  283.        FOREIGN KEY (NUM_VENDA) REFERENCES VENDES (NUM_VENDA));
  284. --------------------------------------------------------
  285. Suposem la base de dades que podeu trobar al fitxer adjunt.
  286. Suposem que aquesta base de dades està en un estat on no hi ha cap fila.
  287. Doneu una seqüència de sentències SQL d'actualització (INSERTs i/o UPDATEs) que violi la integritat d'entitat de la taula Empleats al'intentar duplicar la primary key d'aquesta taula de l'empleat 21.
  288. Les sentències NOMÉS han de violar aquesta restricció.
  289. ---------------------
  290. INSERT INTO DEPARTAMENTS VALUES(1, 'TPZARAGOZA', 0, 'INDEPENDENCIA', 'ZARAGOZA');
  291. INSERT INTO PROJECTES VALUES(2, 'TTPP', 'VODAFONE', 2500000);
  292. INSERT INTO EMPLEATS VALUES(21, 'ALEXANDRE', 25000, 'ZARAGOZA', 1, 2);
  293. INSERT INTO EMPLEATS VALUES(21, 'MARTA', 45000, 'BARCELONA', 1,2);
  294. --------------------------------------------------------
  295. Doneu una seqüència d'operacions d'algebra relacional per obtenir el nom del departament on treballa i el nom del projecte on està assignat l'empleat número 2.
  296.  
  297. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  298.  
  299. Nom_dpt     Nom_proj
  300. MARKETING       IBDVID
  301. ---------------------
  302. A = EMPLEATS(num_empl = 2)
  303. B = A*DEPARTAMENTS
  304. C = B*PROJECTES
  305. Z = C[Nom_dpt, Nom_proj]
  306. --------------------------------------------------------
  307. Doneu una seqüència d'operacions de l'àlgebra relacional per obtenir el número i nom dels departaments que tenen dos o més empleats que viuen a ciutats diferents.
  308.  
  309. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  310.  
  311. Num_dpt     Nom_dpt
  312. 3       MARKETING
  313.  
  314. ---------------------
  315. A = EMPLEATS[NUM_DPT, CIUTAT_EMPL, NUM_EMPL]
  316. B = A{NUM_DPT->NUM_DPTA, CIUTAT_EMPL->CIUTAT_EMPLEA, NUM_EMPL->NUM_EMPLEA}
  317. C = B[NUM_DPTA = NUM_DPT, CIUTAT_EMPLEA <> CIUTAT_EMPL, NUM_EMPLEA <> NUM_EMPL]A
  318. D = C[NUM_DPT]
  319. E = D*DEPARTAMENTS
  320. Z = E[NUM_DPT, NOM_DPT]
  321. --------------------------------------------------------
  322. Doneu una seqüència d'operacions d'algebra relacional per obtenir el número i nom dels departaments tals que tots els seus empleats viuen a MADRID. El resultat no ha d'incloure aquells departaments que no tenen cap empleat.
  323.  
  324. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  325.  
  326. Num_dpt     Nom_dpt
  327. 3       MARKETING
  328.  
  329. ---------------------
  330. A = EMPLEATS(CIUTAT_EMPL <> 'MADRID')
  331. B = A[NUM_DPT]
  332. C = DEPARTAMENTS[NUM_DPT]
  333. D = C-B
  334. E = D*EMPLEATS
  335. F = E*DEPARTAMENTS
  336. Z = F[NUM_DPT, NOM_DPT]
  337. --------------------------------------------------------
  338. Doneu una seqüència d'operacions d'algebra relacional per obtenir els números i els noms dels departament situats a MADRID, que tenen algun empleat que guanya més de 200000.
  339.  
  340. Pel joc de proves que trobareu al fitxer adjunt, la sortida ha de ser:
  341.  
  342. Num_dpt     Nom_dpt
  343. 5       VENDES
  344.  
  345. ---------------------
  346. A = DEPARTAMENTS(CIUTAT_DPT = 'MADRID')
  347. B = EMPLEATS(SOU > 200000)
  348. C = A*B
  349. Z = C[NUM_DPT, NOM_DPT]
  350. --------------------------------------------------------
  351. Doneu una seqüència d'operacions d'àlgebra relacional per obtenir els noms i números dels projectes que no tenen cap empleat assignat.
  352.  
  353. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  354.  
  355. Nom_proj        Num_proj
  356. IBDTEL      1
  357.  
  358. ---------------------
  359. A = EMPLEATS[NUM_PROJ]
  360. B = PROJECTES[NUM_PROJ]
  361. C = B-A
  362. D = C*PROJECTES
  363. Z = D[NOM_PROJ, NUM_PROJ]
  364. --------------------------------------------------------
  365. Doneu una seqüència d'operacions d'algebra relacional per obtenir el número i el nom dels empleats que viuen a la mateixa ciutat on està situat el departament on treballen.
  366.  
  367. Pel joc de proves que trobareu al fitxer adjunt, la sortida seria:
  368.  
  369. NOM_empl        NUM_empl
  370. ROBERTO     3
  371.  
  372. ---------------------
  373. A = EMPLEATS{NUM_DPT-> NUM_DPTA}
  374. B = A[NUM_DPTA = NUM_DPT, CIUTAT_EMPL = CIUTAT_DPT]DEPARTAMENTS
  375. Z = B[NOM_EMPL, NUM_EMPL]
  376. --------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement