Advertisement
Luisa_Lorenzini

Untitled

Feb 26th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 5.11 KB | None | 0 0
  1. --
  2. -- Create schema azienda
  3. --
  4.  
  5. CREATE DATABASE IF NOT EXISTS azienda;
  6. USE azienda;
  7.  
  8. --
  9. -- Definition of table dipendente
  10. --
  11.  
  12. CREATE TABLE dipendente (
  13.   cf char(16) NOT NULL,
  14.   nome varchar(75) NOT NULL,
  15.   citta varchar(30) NOT NULL,
  16.   PRIMARY KEY (cf)
  17. );
  18.  
  19.  
  20. --
  21. -- Definition of table progetto
  22. --
  23.  
  24. CREATE TABLE progetto (
  25.   cod_p char(5) NOT NULL,
  26.   nome_progetto varchar(45) NOT NULL,
  27.   anno int(4),
  28.   durata int(2),
  29.   PRIMARY KEY (cod_p)
  30. );
  31.  
  32. --
  33. -- Definition of table lavora
  34. --
  35.  
  36. CREATE TABLE lavora (
  37.   cod_p_l char(5) NOT NULL,
  38.   cf_l char(16) NOT NULL,
  39.   mesi int(2) NOT NULL,
  40.   ruolo varchar (30) NOT NULL,
  41.   PRIMARY KEY (cod_p_l, cf_l),
  42.   FOREIGN KEY (cod_p_l) REFERENCES progetto(cod_p),
  43.   FOREIGN KEY (cf_l) REFERENCES dipendente(cf) 
  44. );
  45.  
  46. -- nel progetto cod_p il dipendente cf lavora per un certo numero di mesi, svolgendo un certo ruolo
  47.  
  48. --
  49. -- populating the DB
  50. --
  51. INSERT INTO dipendente (cf, nome, citta)
  52. VALUES ('RSSMRA72R30G273X', 'Mario Rossi', 'Milano'),
  53. ('BNCPLA85A21T101R', 'Paolo Bianchi', 'Torino'),
  54. ('NREFNS83B11C341O', 'Francesco Neri', 'Genova'),
  55. ('GLLGSI76S26L011E', 'Giusto Gialli', 'Modena'),
  56. ('VREGNM54R11B244A', 'Gianmaria Verdi', 'Modena');
  57.  
  58. INSERT INTO progetto (cod_p, nome_progetto, anno, durata)
  59. VALUES ('ABCDE', 'Prog1', 1995, 12),
  60. ('BCDEF', 'Prog2', 1996, 10),
  61. ('CDEFG', 'Prog3', 1995, 11),
  62. ('DEFGH', 'Prog4', 1997, 18),
  63. ('EFGHI', 'Prog5', 1994, 24);
  64.  
  65. INSERT INTO lavora (cod_p_l, cf_l, mesi, ruolo)
  66. VALUES ('ABCDE', 'RSSMRA72R30G273X', 6, 'Assistente'),
  67. ('ABCDE', 'BNCPLA85A21T101R', 4, 'Amministratore'),
  68. ('BCDEF', 'BNCPLA85A21T101R', 6, 'Amministratore'),
  69. ('BCDEF', 'NREFNS83B11C341O', 5, 'Dirigente'),
  70. ('BCDEF', 'VREGNM54R11B244A', 1, 'Operaio'),
  71. ('CDEFG', 'VREGNM54R11B244A', 3, 'Autista'),
  72. ('CDEFG', 'NREFNS83B11C341O', 11, 'Supervisore'),
  73. ('DEFGH', 'VREGNM54R11B244A', 18, 'Dirigente'),
  74. ('EFGHI', 'VREGNM54R11B244A', 12, 'Presidente'),
  75. ('EFGHI', 'GLLGSI76S26L011E', 12, 'Amministratore'),
  76. ('EFGHI', 'BNCPLA85A21T101R', 12, 'Impiegato'),
  77. ('EFGHI', 'NREFNS83B11C341O', 12, 'Uomo dei Panini');
  78.  
  79. --
  80. -- QUERY (ALGEBRA RELAZIONALE a), b))
  81. --
  82.  
  83. -- a) selezionare i dati dei dipendenti di Modena che non hanno lavorato
  84. -- in alcun progetto dell'anno 1995
  85.  
  86. SELECT d.*
  87. FROM dipendente d
  88. WHERE d.citta='Modena' AND NOT EXISTS (
  89.                                        SELECT *
  90.                                        FROM progetto p, lavora l
  91.                                        WHERE p.cod_p=l.cod_p_l AND l.cf_l=d.cf AND p.anno=1995
  92.                                        );
  93.  
  94. -- prof
  95. SELECT
  96.     *
  97. FROM
  98.     DIPENDENTE d
  99. WHERE
  100.     d.citta = 'Modena'
  101.         AND d.cf NOT IN (SELECT
  102.             l.cf_l
  103.         FROM
  104.             lavora l,
  105.             progetto p
  106.         WHERE
  107.             l.cod_p_l = p.cod_p AND p.anno = 1995);
  108.  
  109. -- b) selezionare i dati dei dipendenti che non hanno mai lavorato insieme
  110. -- ad un dipendente di Modena, cioè nello stesso progetto in cui lavorava
  111. -- anche un dipendente di Modena
  112.  
  113. SELECT d.*
  114. FROM dipendente d
  115. WHERE NOT EXISTS (
  116.                   SELECT *
  117.                   FROM dipendente d2, lavora l, lavora l2
  118.                   WHERE  d2.cf=l2.cf_l AND d.cf=l.cf_l AND l.cod_p_l=l2.cod_p_l AND d2.citta='Modena'
  119.                   );
  120.  
  121. -- prof
  122. SELECT
  123.     *
  124. FROM
  125.     dipendente d
  126. WHERE
  127.     d.cf NOT IN (SELECT
  128.             l1.cf_l
  129.         FROM
  130.             lavora l1,
  131.             lavora l2,
  132.             dipendente d
  133.         WHERE
  134.             l1.cod_p_l = l2.cod_p_l
  135.                 AND l2.cf_l = d.cf
  136.                 AND d.citta = 'Modena');
  137.  
  138. -- c) selezionare le coppie (cf1, cf2) tali che i dipendenti con codice fiscale
  139. -- cf1 e cf2 hanno lavorato nello stesso progetto
  140.  
  141. SELECT l1.cf_l AS cf1, l2.cf_l AS cf2, l1.cod_p_l AS Progetto
  142. FROM lavora l1, lavora l2
  143. WHERE l1.cod_p_l=l2.cod_p_l AND l1.cf_l<l2.cf_l;
  144.  
  145. -- prof (non va bene il <> perchè così vengono selezionate anche le coppie 'simmetriche')
  146. -- (Inoltre servirebbe un distinct o l'attributo cod_p_l per evitare la ripetizione di tuple)
  147. SELECT
  148.     l1.cf_l AS CF1, l2.cf_l AS CF2
  149. FROM
  150.     lavora l1,
  151.     lavora l2
  152. WHERE
  153.     l1.cod_p_l = l2.cod_p_l
  154.         AND l1.cf_l <> l2.cf_l;
  155.  
  156. -- d) selezionare i dipendenti che hanno lavorato in almeno 3 ruoli distinti
  157.  
  158. SELECT l.cf_l AS CodDipendente
  159. FROM lavora l
  160. GROUP BY l.cf_l
  161. HAVING count(distinct l.ruolo)>=3;
  162.  
  163. -- prof
  164. SELECT
  165.     *
  166. FROM
  167.     dipendente d
  168. WHERE
  169.     3 <= (SELECT
  170.             COUNT(DISTINCT l.ruolo)
  171.         FROM
  172.             lavora l
  173.         WHERE
  174.             l.cf_l = d.cf);
  175.  
  176. -- e) selezionare, per ogni dipendente, il progetto in cui esso ha lavorato
  177. -- il maggior numero di mesi
  178.  
  179. -- Non valida se un dipendente occupa più ruoli in uno stesso progetto
  180. SELECT l.cf_l AS Dipendente, l.cod_p_l AS Progetto
  181. FROM lavora l
  182. WHERE l.mesi = (
  183.                 SELECT max(l2.mesi)
  184.                 FROM lavora l2
  185.                 WHERE l.cf_l=l2.cf_l
  186.                 );
  187.  
  188. -- prof
  189. SELECT
  190.     l1.cf_l, l1_cod_p_l
  191. FROM
  192.     lavora l1
  193. GROUP BY l1.cf_l , l1_cod_p_l
  194. HAVING SUM(l1.mesi) >= ALL (SELECT
  195.         SUM(l2.mesi)
  196.     FROM
  197.         lavora l2
  198.     WHERE
  199.         l1.cf_l = l2.cf_l
  200.     GROUP BY l2.cod_p_l);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement