7. ESERCITAZIONI: Algebra relazionale e QUERY E’ dato il seguente diagramma E/R di esempio: Dirige Descrizione CodRep Dirige E’Diretto N 1 N Dipendente Impiega E’Impiegato 1 Impiega Località Reparto CodDip Stipendio Nome Cognome Livello Si ricava il seguente SCHEMA RELAZIONALE (MAPPING DEL DIAGRAMMA ER) Reparto (CodRep, Descrizione, Localita) Dipendente (CodDip, Cognome, Nome, Livello, Stipendio, CodCapo, CodRep1) Con l’attributo “CodCapo” FK sull’attributo “CodDip” della relazione “Dipendente” Con l’attributo “CodRep1” FK sull’attributo “CodRep” della relazione “Reparto” VRCodRep (Reparto) VRCodRep1 (Dipendente) deriva dalla TOTALITA’ dell’associazione diretta “Impiega” Sia data, inoltre la seguente istanza di esempio della base di dati di riferimento in un certo istante di tempo t: Reparto CodRep R-01 R-02 R-03 R-04 Dipendente Descrizione MAGAZZINO PRODUZIONE AMMINISTRAZIONE DIREZIONE CodDip D-01 D-02 D-03 D-04 D-05 D-06 D-07 D-08 Localita AVELLINO NAPOLI ROMA ROMA Cognome Nome ROSSI MARIO VERDI GIANNI GIALLI MARTA BIANCHI ALFREDO NERI ETTORE ROCCHI ANNA VANNI ALFREDO SGARBI VITTORIO Livello 8 7 7 6 6 6 8 6 Stipendio 2010,50 1340,75 1230,15 1001,25 990,00 912,25 2130,45 930,25 CodCapo NULL D-07 D-07 D-03 D-03 D-02 D-01 D-03 CodRep1 R-04 R-02 R-01 R-01 R-01 R-03 R-02 NULL TESTO DELLE QUERY Risolvere le seguenti interrogazioni utilizzando, se possibile, l’algebra relazionale e tradurle in SQL: Q1. Elenco di tutti i dipendenti; Q2. Elenco di tutti i dipendenti di livello 6; Q3. Visualizzare Cognome e Nome di tutti i dipendenti che lavorano nel reparto con codice “R01”; Q4. Elencare tutti i possibili livelli dei dipendenti; Q5. Elencare tutti i dipendenti il cui cognome inizia con la lettera ‘R’; Q6. Elencare tutti i dipendenti che guadagnano tra 900 e 1300 euro; Q7. Mostrare solo il cognome, il nome e lo stipendio percepito dei dipendenti in ordine decrescente di livello e crescente per cognome e nome; Q8. Visualizzare la media degli stipendi, lo stipendio più alto e quello più basso tra tutti i dipendenti; Q9. Visualizzare il numero di dei dipendenti presenti per ciascun reparto; Q10. Visualizzare la somma complessiva degli stupendi di tutti i dipendenti di livello 8; Q11. Visualizzare il numero di dipendenti presenti per ciascun livello (solo se esso è maggiore o uguale a 2); Q12. Visualizzare la media degli stipendi percepiti dai dipendenti per ciascun livello; Q13. Visualizzare i dipendenti che guadagnano esattamente lo stipendio minimo/massimo (oppure che guadagnano uno stipendio strettamente minore oppure strettamente maggiore rispetto alla media complessiva degli stipendi); Q14. Visualizzare il codice ed il cognome e nome di tutti i dipendenti che lavorano ad Avellino; Q15. Per ogni reparto fornire le informazioni dei dipendenti che vi lavorano visualizzando anche i reparti privi al momento di dipendenti; Q16. Per ogni dipendente fornire le informazioni dei reparti nei quali lavorano visualizzando anche i dipendenti privi al momento di reparto; Q17. Per ogni dipendente fornire cognome e nome nonché cognome e nome del suo capo. SOLUZIONI Q1. Elenco di tutti i dipendenti SQL SELECT * FROM Dipendente; Q2. Elenco di tutti i dipendenti di livello 6 SQL SELECT * FROM Dipendente WHERE Livello = 6; Algebra relazionale Livello = 6 (Dipendente) Q3. Visualizzare Cognome e Nome di tutti i dipendenti che lavorano nel reparto con codice “R-01” SQL SELECT Cognome, Nome FROM Dipendente WHERE CodRep1 = “R-01”; Algebra relazionale Cognome, Nome (CodRep1 =”R-01” (Dipendente)) Q4. Elencare tutti i possibili livelli dei dipendenti SQL SELECT DISTINCT Livello FROM Dipendente; Algebra relazionale Livello (Dipendente) Q5. Elencare tutti i dipendenti il cui cognome inizia con la lettera ‘V’ SQL SELECT * FROM Dipendente WHERE Cognome LIKE “V*”; Algebra relazionale Cognome LIKE “V*” (Dipendente) Q6. Elencare tutti i dipendenti che guadagnano tra 900 e 1300 euro SQL SELECT * FROM Dipendente WHERE Stipendio BETWEEN 900 AND 1300; Algebra relazionale (Stipendio >= 900) AND (Stipendio <= 1300) (Dipendente) Q7. Mostrare solo il cognome, il nome e lo stipendio percepito dei dipendenti in ordine decrescente di livello e crescente per cognome e nome SQL SELECT Livello, Cognome, Nome, Stipendio FROM Dipendente ORDER BY Livello DESC, Cognome, Nome; Q8. Visualizzare la media degli stipendi, lo stipendio più alto e quello più basso tra tutti i dipendenti SQL SELECT AVG(Stipendio) AS media, MAX(Stipendio) AS Massimo, MIN(Stipendio) AS min FROM Dipendente; Q9. Visualizzare il numero di dei dipendenti presenti per ciascun reparto SQL SELECT CodRep1, COUNT(*) AS numdip FROM Dipendente [WHERE CodRep1 <> NULL] GROUP BY CodRep1; Q10. Visualizzare la somma complessiva degli stupendi di tutti i dipendenti di livello 8 SQL SELECT SUM(Stipendio) AS totale FROM Dipendente WHERE Livello = 8; Q11. Visualizzare il numero di dipendenti presenti per ciascun livello (solo se esso è maggiore o uguale a 2) SQL SELECT Livello, COUNT(*) AS numdip FROM Dipendente GROUP BY Livello HAVING COUNT(*) >= 2; Q12. Visualizzare la media degli stipendi percepiti dai dipendenti per ciascun livello SQL SELECT Livello, AVG(Stipendio) AS mediastip FROM Dipendente GROUP BY Livello; Q13. Visualizzare i dipendenti che guadagnano esattamente lo stipendio minimo/massimo (oppure che guadagnano uno stipendio strettamente minore oppure strettamente maggiore rispetto alla media complessiva degli stipendi) SQL SELECT Cognome, Nome FROM Dipendente WHERE Stipendio = (SELECT MIN(Stipendio) FROM Dipendente); Indirizzo Q14. Visualizzare il codice ed il cognome e nome di tutti i dipendenti che lavorano ad Avellino SQL SELECT CodDip, Cognome, Nome FROM Dipendente, Reparto WHERE (Dipendente.CodRep1=Reparto.CodRep) AND Reparto.Localita = “AVELLINO”; SELECT CodDip, Cognome, Nome FROM Dipendente INNER JOIN Reparto ON Dipendente.CodRep1=Reparto.CodRep WHERE Reparto.Localita = “AVELLINO”; Algebra relazionale CodDip,Cognome, Nome (Localita =”AVELLINO” (Dipendente Reparto)) Dipendente.CodRep1 = Reparto.CodRep CodDip,Cognome, Nome (Dipendente Localita =”AVELLINO” (Reparto)) Dipendente.CodRep1 = Reparto.CodRep Q15. Per ogni reparto fornire le informazioni dei dipendenti che vi lavorano visualizzando anche i reparti privi al momento di dipendenti SQL SELECT CodRep, Descrizione, Localita, CodDip, Cognome, Nome FROM Reparto LEFT JOIN Dipendente ON Reparto.CodRep = Dipendente.CodRep1; Algebra relazionale SX CodRep, Descrizione, Localita, CodDip, Cognome, Nome (Reparto Dipendente)) Reparto.CodRep = Dipendente.CodRep1 Q16. Per ogni dipendente fornire le informazioni dei reparti nei quali lavorano visualizzando anche i dipendenti privi al momento di reparto SQL SELECT CodDip, Cognome, Nome, CodRep, Descrizione, Localita FROM Dipendente LEFT JOIN Reparto ON Dipendente.CodRep1 = Reparto.CodRep; Algebra relazionale SX CodDip, Cognome, Nome CodRep, Descrizione, Localita, (Dipendente Reparto)) Dipendente.CodRep1 = Reparto.CodRep Q17. Per ogni dipendente fornire cognome e nome nonché cognome e nome del suo capo SQL SELECT t1.CodDip, t1.Cognome, t1.Nome, t2.CodDip, t2.Cognome, t2.Nome FROM Dipendente AS t1, Dipendente AS t2 WHERE t1.CodDip = t2.CodCapo; SELECT t1.CodDip, t1.Cognome, t1.Nome, t2.CodDip, t2.Cognome, t2.Nome FROM Dipendente AS t1 SELF JOIN Dipendente AS t2 ON t1.CodDip = t2.CodCapo; Algebra relazionale t1.CodDip, t1.Cognome, t1.Nome, t2.CodDip, t2.Cognome, t2.Nome (Dipendente Dipendente)) t1.CodDip = t2.CodDip