Soluzioni 1 1.1 1.2 1.3 1.4 1.5 SELECT cognome ; SELECT nome ; ;, citta ; ; 2 2.1 2.2 2.3 2.4 SELECT nome, cognome WHERE stipendio>3000; WHERE citta= rimini ; WHERE citta= rimini AND stipendio>3000;, salario WHERE eta>=20 AND eta<=35; 1
2.5, salario WHERE citta= rimini AND (eta<20 OR eta>30); 3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 SELECT MIN(salario) ; SELECT AVG(eta) ; SELECT SUM(salario) ; SELECT MAX(salario) WHERE citta= rimini ; SELECT MAX(salario) WHERE eta>25 AND eta<40; SELECT MAX(salario) WHERE citta= rimini AND eta>=25 AND eta<=40; SELECT COUNT(*) WHERE eta<25 OR eta>35; 2
4 4.1 4.2 4.3 SELECT AVG(eta) as età_media ; SELECT citta,avg(eta) as età_media ; SELECT citta, MAX(salario) as salario_massimo WHERE citta= rimini 4.4 4.5 4.6 SELECT citta, COUNT(*) as num_abitanti, AVG(eta) as età_media ; SELECT citta, COUNT(*) as num_dipendenti ORDER BY num_dipendenti; SELECT citta, COUNT(*) as num_dipendenti ORDER BY num_dipendenti DESC; 5 5.1 5.2 SELECT citta, AVG(eta) as età_media HAVING AVG(eta)>30; SELECT citta, MAX(salario) as salario_massimo HAVING AVG(eta)<35; 3
5.3 SELECT citta, AVG(salario) salario_medio, AVG(eta) as età_media WHERE eta > 20 AND eta < 40 HAVING COUNT(*)>=2; 6 6.1 6.2 6.3 6.4 SELECT MIN(eta) ; WHERE eta = A; SELECT AVG(salario) ; WHERE salario > A; SELECT citta HAVING COUNT(*) >= 2; WHERE citta IN A; SELECT AVG(eta) ; SELECT citta WHERE eta = (SELECT MIN(eta) ); WHERE salario > (SELECT AVG(salario) ); WHERE citta IN (SELECT citta HAVING COUNT(*) >= 2); WHERE citta IN (SELECT citta HAVING AVG(eta) <(SELECT AVG(eta) )); 4
HAVING AVG(eta) <A; C: WHERE citta IN B; 6.5 6.6 SELECT cod_cli WHERE camera= 25 OR camera= 18 ; WHERE codice IN A AND eta>=30; SELECT AVG(acconto) ; SELECT cod_cli WHERE acconto > A; WHERE eta >= 30 AND codice IN (SELECT cod_cli WHERE camera="25" OR camera="18"); WHERE codice IN (SELECT cod_cli WHERE acconto > (SELECT AVG(acconto) )); C: WHERE codice IN B; 5
7 Per ognuno dei problemi posti vengono fornite 2 soluzioni: 1. La prima utilizza la congiunzione delle tabelle 2. La seconda ove possibile fa ricorso ad una query nidificata Il fine è quello di dimostrare che è possibile pervenire al risultato desiderato seguendo strade diverse. 7.1 SELECT dipendenti.*,prenot WHERE dipendenti.cod_dip=prenot.cod_dip AND camera='25'; SELECT cod_dip WHERE camera='25'; WHERE cod_dip IN A; 7.2, prenot WHERE dipendenti.cod_dip=prenot.cod_dip AND eta>25 AND eta<40; 7.3 SELECT prenot.*, prenot WHERE dipendenti.cod_dip=prenot.cod_dip AND citta='milano'; SELECT cod_dip WHERE citta='milano'; 6
7.4, acconto, camera, prenot WHERE dipendenti.cod_dip=prenot.cod_dip AND prenot.acconto>100000 AND dipendenti.eta>25; WHERE cod_dip IN A; SELECT dipendenti.cod_dip, prenot WHERE dipendenti.cod_dip=prenot.cod_dip AND prenot.acconto>100000 AND dipendenti.eta>25;, acconto, camera, prenot WHERE dipendenti.cod_dip=prenot.cod_dip AND codice IN A; 7.5 Per la soluzione non è possibile utilizzare group by ed having perchè non vi sono funzioni di aggregazione nella select principale ovvero non devo estrarre dati riguardanti gruppi di utenti, ma quelli riguardanti singoli utenti. La funzione di aggregazione compare solamente nella condizione sull'acconto dei dipendenti. Si può risolvere tutto utilizzando un'interrogazione nidificata. SELECT AVG(acconto) ; SELECT alberghi.nome, dipendenti.cognome, dipendenti.nome, dipendenti.citta, prenot, alberghi WHERE dipendenti.cod_dip = prenot.cod_dip AND prenot.cod_alb = alberghi.cod_alb AND prenot.acconto>a; 7
7.6 Devo ordinare i risultati in base ai giorni di prenotazione in ordine decrescente, ovvero dal valore più grande al più piccolo e poi limito l'elenco di risultati restituiti, grazie alla clausola LIMIT, ai primi 5. SELECT alberghi.nome, dipendenti.cognome, dipendenti.nome, dipendenti.citta,prenot.giorni, prenot, alberghi WHERE dipendenti.cod_dip = prenot.cod_dip AND prenot.cod_alb = alberghi.cod_alb ORDER BY prenot.giorni DESC LIMIT 5; 7.7 CREAZIONE TABELLA ACCONTI: CREATE TABLE Acconti ( SELECT cod_alb, AVG(acconto) AS media GROUP BY cod_alb ); INTERROGAZIONE: SELECT alberghi.nome, dipendenti.cognome, dipendenti.nome, dipendenti.citta, acconti, prenot, alberghi WHERE dipendenti.cod_dip=prenot.cod_dip AND prenot.cod_alb=acconti.cod_alb AND prenot.cod_alb=alberghi.cod_alb AND prenot.acconto >= acconti.media; 8
7.8 PERIODI MEDI DI SOGGIORNO PER OGNI ALBERGO: SELECT cod_alb, AVG(giorni) AS periodo_medio GROUP BY cod_alb A QUESTO PUNTO POSSIAMO SCRIVERE LA QUERY DESIDERAT SELECT dipendenti.cognome, dipendenti.nome, alberghi.nome as albergo, alberghi.citta as città_albergo, periodo_medio,giorni, prenot, alberghi, (SELECT cod_alb, AVG(giorni) AS periodo_medio GROUP BY cod_alb) AS periodi_medi WHERE dipendenti.cod_dip = prenot.cod_dip AND prenot.cod_alb = alberghi.cod_alb AND alberghi.cod_alb = periodi_medi.cod_alb AND prenot.giorni > periodi_medi.periodo_medio; 9