Esercizi di Basi di dati - SQL

Похожие документы
Esercizi di SQL. Esercizio 1. È dato lo schema relazionale costituito dalle seguenti tabelle (le chiavi primarie sono sottolineate)

Eserciziario di SQL. Indice. 1 Interrogazioni base: proiezione, selezione e join 2. 2 Interrogazioni nidificate: IN, NOT IN, EXISTS, NOT EXISTS 5

Esercizi di SQL. È riportato di seguito un insieme di esercizi risolti in SQL. Per ogni esercizio una o più soluzioni equivalenti sono presentate.

Esercizi di SQL. Esercizio 1. È dato lo schema relazionale costituito dalle seguenti tabelle (le chiavi primarie sono sottolineate)

Basi di Dati Temi d esame svolti (SQL)

Basi di Dati. Esercizi di SQL (2) - Soluzioni

Laura Farinetti - DAUIN Politecnico di Torino. Sia dato lo schema relazionale costituito dalle tabelle (le chiavi primarie sono sottolineate)

Basi di Dati DBDMG - Politecnico di Torino Esercizi di SQL

Esempi SQL con Access. Orazio Battaglia

SELECT FROM ORDER BY SELECT FROM ORDER BY DESC DESC SELECT FROM ORDER BY DESC DESC SELECT FROM WHERE SELECT FROM WHERE AND SELECT FROM WHERE AND

Linguaggio SQL seconda parte

Basi di dati I Prova di autovalutazione 30 ottobre 2014

Basi di Dati. Esercitazione SQL. Paolo Papotti. 19 maggio 2005

ESERCITAZIONE 4 Giovedì 13 novembre 2014 (3 ore) SQL

Laura Farinetti - DAUIN Politecnico di Torino. Sia dato lo schema relazionale costituito dalle tabelle (le chiavi primarie sono sottolineate)

Data management a.a Il linguaggio SQL

2- Il titolo dei film di F. Fellini prodotti dopo il SELECT f.titolo FROM Film f WHERE f.regista = Fellini AND f.annoproduzione > 1960

Il linguaggio SQL: raggruppamenti. Versione elettronica: SQLb-gruppi.pdf

Basi di Dati Esempi di SQL

Basi di Dati Esempi di SQL

Basi di dati I 27 gennaio 2016 Esame Compito A Tempo a disposizione: un ora e quarantacinque minuti. Libri chiusi.

Compiti d Esame di Basi di Dati e Sistemi Informativi per il CdL in Scienze dei Beni Culturali

Basi di Dati. S Q L Lezione 4

1- Il nome di tutte le sale di Pisa SELECT s.nome FROM Sale s WHERE s.città = 'Pisa'

SQL - Funzioni di gruppo

Basi di dati I 19 settembre 2016 Tempo a disposizione: un ora e 45 minuti.

Data Management Software. Il linguaggio SQL. Raggruppamenti. Paolo Avallone Sr Consulting IT Specialist DB2, Data Management Marzo 2004

Concettuale. Giuseppe Amato

Basi di dati: appello 08/03/06

Basi di Dati: Corso di laboratorio

<Nome Tabella>.<attributo>

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Basi di Dati Corso di Laura in Informatica Umanistica

Interrogare una base di dati: algebra relazionale e SQL. Savino Castagnozzi Giorgio Macauda Michele Meomartino Salvatore Picerno Massimiliano Sartor

Esercitazione SQL. Università degli Studi del Sannio Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica

SQL Laboratorio di Basi di Dati a.a. 2002/2003

Esempio di database relazionale con l utilizzo del prodotto MySQL

Il sistema informativo deve essere di tipo centralizzato e accessibile mediante un computer server installato nella rete locale dell albergo.

Linguaggio SQL. studenti matricola nome cognome citta anno 11 marco bini bologna laura sicuro rimini 1984 esami codice

Modello concettuale dei dati. Paolo Brunasti - UniMiB 1 / 12

Interrogare una base di dati: Algebra relazionale e SQL. Alessandro Bardine Alessandro Ciaramella Vincenzo Galella Rudy Manganelli

SQL [2] Concetti avanzati di SQL. Esempi di interrogazioni

B a s i d i D a t i ( M o d u l o T e o r i a ) P r o v a s c r i t t a

Esprimere in algebra (ottimizzata), calcolo relazionale la seguente query:

Esercitazione 8 Mercoledì 21 gennaio 2015 (2 ore) DDL e progettazione

Esercizi SQL. Dato il seguente schema di una base di dati dove gli attributi che compongono la chiave sono scritti in grassetto

SQL: Structured Query Language. T. Catarci, M. Scannapieco, Corso di Basi di Dati, A.A. 2008/2009, Sapienza Università di Roma

Caratteristiche dei linguaggi per Database

Basi di dati: appello 21/09/12

UTENTE (Codice, Nome, Cognome, Indirizzo, Telefono) PRESTITO (Collocazione, CodUtente, DataPrestito, DataRest)

Basi di dati: appello 28/02/06

Structured. Language. Basi di Dati. Introduzione. DDL: Data Definition Language. Tipi di dato. Query. Modifica dei Dati

Esercizi di SQL 1- SELEZIONI SEMPLICI 1 2- SELEZIONI CON PROIEZIONI 1 3- FUNZIONI DI INSIEME 2 4- FUNZIONI DI AGGREGAZIONE 2 5- HAVING 3

Laboratorio di Basi di Dati prova totale 20 febbraio 2013

Interrogazioni complesse. SQL avanzato 1

Il linguaggio di Interrogazione SQL Esercizi

Interrogazioni nidificate

SQL e ACCESS. Modello relazionale PROBLEMA ENTITA STUDENTE

SELECT s.nome, e.data Studenti s, Esami e WHERE e.materia = 'BD' AND e.voto = 30 AND e.matricola = s.matricola

Trovare i nomi dei marinai che hanno un imbarco su almeno una nave

Università degli Studi di Milano. Esercizi Corso SIT. Basi di dati

Eserciziario SQL. Costantino, Luca, Santoro, Marchese. 29 aprile Utilizzando le relazioni Comune e Terremoto, risolvete le seguenti query SQL

CAPITOLO 4 ESERCIZI SU SQL

Basi di Dati: Corso di laboratorio

RISOLUZIONE APPELLI DI SISTEMI INFORMATIVI

2011 Politecnico di Torino 1

Basi di Dati Corso di Laura in Informatica Umanistica

Esercizi di SQL. 3) cognome e nome dei clienti che abitano a Rimini e guadagnano più di 3000;

Prova Scritta di Basi di Dati

ACCESS Esercitazione (query complesse) Ing. Cosimo Orlacchio

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

ESERCITAZIONE 5 Giovedì 20 novembre 2014 (3 ore) Esercizi tratti da temi d esame (SQL e linguaggi formali)

Eprogram ITIS V anno Unità 4 - Il linguaggio SQL

Elena Baralis 2007 Politecnico di Torino 1

Corso di Basi di Dati

SQL (STRUCTURED QUERY LANGUAGE)

SQL Laboratorio di Basi di Dati a.a. 2002/2003

Interrogazioni nidificate

DATABASE CLIENTIRAPPRESENTANTI

ESERCIZIO 1 (12 punti) Dato il seguente schema relazionale, che modella i dati di società di assicurazioni che erogano polizze sanitarie.

Microsoft Access. Microsoft Access. Maurizio Rebaudengo, Paolo Garza 1. Microsoft Access. Creazione base di dati. Apertura di una base dati

Join in SQL (primo modo) Informatica. Tabella Dipartimento. Interrogazione 4a. Interrogazione 4b. Interrogazione 4a

Basi di Dati. Esercitazione 2: Interrogazioni in SQL. K. Donno - Interrogazioni in SQL

SQL quick reference. piccolo manuale di riferimento dei principali comandi SQL (prof. Claudio Maccherani, Perugia, 2013)

Транскрипт:

Esercizi di Basi di dati - SQL August 28, 2008 1 SQL - Soluzioni Sono di seguito riportate un insieme di interrogazioni risolte in SQL. Ogni interrogazione è caratterizzata dalle tabelle sulle quali deve essere eseguita, dal testo in linguaggio naturale dell interrogazione e da una o più possibili soluzioni in SQL. In ogni tabella gli attributi sottolineati identificano la chiave primaria della tabella. 1.1 Interrogazioni base: proiezione, selezione e join Interrogazione 1. Selezionare il nome di tutte le riviste presenti nella base di dati. SELECT NomeR FROM RIVISTA; Interrogazione 2. Selezionare il codice e il nome di tutte le riviste presenti nella base di dati. SELECT CodR, NomeR FROM RIVISTA; 1

Interrogazione 3. Selezionare il nome di tutte le riviste pubblicate dall editore Editore1. SELECT NomeR FROM RIVISTA WHERE Editore= Editore1 ; Interrogazione 4. Selezionare il codice delle riviste che hanno pubblicato almeno 1 articolo. SELECT DISTINCT CodR FROM ARTICOLO; Interrogazione 5. Selezionare il codice e il nome delle riviste che hanno pubblicato almeno 1 articolo. SELECT DISTINCT CodR, NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR; Interrogazione 6. Selezionare il codice delle riviste che hanno pubblicato almeno 1 articolo di motociclismo (Argomento= motociclismo ). SELECT DISTINCT CodR FROM ARTICOLO WHERE Argomento= Motociclismo ; 2

Interrogazione 7. Selezionare il codice e il nome delle riviste che hanno pubblicato almeno 1 articolo di motociclismo. SELECT DISTINCT RIVISTA.CodR, NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND Argomento= Motociclismo ; Interrogazione 8. Selezionare il codice e il nome delle riviste che hanno pubblicato almeno 1 articolo di motociclismo oppure di automobilismo. SELECT DISTINCT RIVISTA.CodR, NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND (Argomento= Motociclismo OR Argomento= Automobilismo ); Interrogazione 9. GARA(CodG, Luogo, Data, Disciplina) ATLETA(CodA, Nome, Nazione, DataNascita) PARTECIPAZIONE(CodG, CodA,PosizioneArrivo, Tempo) Selezionare il codice e il nome degli atleti italiani che sono giunti primi in almeno una gara di lancio del peso. SELECT DISTINCT A.CodA, Nome FROM ATLETA A, PARTECIPAZIONE P, GARA G WHERE P.CodA=A.CodA AND P.CodG=G.CodG AND Disciplina= lancio del peso AND Nazione= Italia AND PosizioneArrivo=1; 3

Interrogazione 10. STABILIMENTO(CodS, Nome, Indirizzo, Stato) LINEA MONTAGGIO(CodS, NumL, DataInstallazioneLinea) TIPO AUTOVETTURA(CodTA, Nome, NumeroPosti) PRODUZIONE(CodS, NumL, CodTA, NumeroAutovetture) Selezionare i codici delle linee di montaggio presso le quali sono state prodotte almeno 10000 autovetture punto. SELECT DISTINCT LM.CodS, LM.NumL FROM LINEA_MONTAGGIO LM, PRODUZIONE P, TIPO_AUTOVETTURA TA WHERE P.CodS=LM.CodS AND P.NumL=LM.NumL AND P.CodTA=TA.CodTA AND P.NumeroAutovetture>=10000 AND TA.Nome= punto ; 4

1.2 Interrogazioni annidate: IN, NOT IN, EXISTS, NOT EXISTS Interrogazione 1. Selezionare il codice e il nome delle riviste che hanno pubblicato almeno 1 articolo di motociclismo. SELECT CodR, NomeR FROM RIVISTA WHERE CodR IN (SELECT CodR FROM ARTICOLO WHERE Argomento= Motociclismo ); Oppure SELECT CodR, NomeR FROM RIVISTA R WHERE EXISTS (SELECT * FROM ARTICOLO A WHERE A.CodR=R.CodR AND Argomento= Motociclismo ); Interrogazione 2. Selezionare il nome delle riviste che hanno pubblicato almeno un articolo di motociclismo e almeno un articolo di automobilismo. SELECT NomeR FROM RIVISTA WHERE CodR IN (SELECT CodR FROM ARTICOLO WHERE Argomento= motociclismo ) AND CodR IN (SELECT CodR FROM ARTICOLO WHERE Argomento= automobilismo ); Oppure SELECT DISTINCT NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND Argomento= motociclismo AND RIVISTA.CodR IN (SELECT CodR FROM ARTICOLO WHERE Argomento= automobilismo ); 5

Oppure SELECT NomeR FROM RIVISTA R WHERE EXISTS (SELECT * FROM ARTICOLO A1 WHERE A1.CodR=R.CodR AND Argomento= motociclismo ) AND EXISTS (SELECT * FROM ARTICOLO A2 WHERE A2.CodR=R.CodR AND Argomento= motociclismo ); Interrogazione 3. STABILIMENTO(CodS, Nome, Indirizzo, Stato) LINEA MONTAGGIO(CodS, NumL, DataInstallazioneLinea) TIPO AUTOVETTURA(CodTA, Nome, NumeroPosti) PRODUZIONE(CodS, NumL, CodTA, NumeroAutovetture) Selezionare i codici delle linee di montaggio presso le quali sono state prodotte almeno 10000 autovetture punto e almeno 20000 cinquecento. SELECT CodS, NumL FROM LINEA_MONTAGGIO LM WHERE EXISTS (SELECT * FROM PRODUZIONE P, TIPO_AUTOVETTURA TA WHERE P.CodTA=TA.CodTA AND P.NumeroAutovetture>=10000 AND TA.Nome= punto AND P.CodS=LM.CodS AND P.NumL=LM.NumL) AND EXISTS (SELECT * FROM PRODUZIONE P, TIPO_AUTOVETTURA TA WHERE P.CodTA=TA.CodTA AND P.NumeroAutovetture>=20000 AND TA.Nome= cinquecento AND P.CodS=LM.CodS AND P.NumL=LM.NumL); Oppure 6

SELECT CodS, NumL FROM LINEA_MONTAGGIO WHERE (CodS, NumL) IN (SELECT CodS, NumL FROM PRODUZIONE P, TIPO_AUTOVETTURA TA WHERE P.CodTA=TA.CodTA AND P.NumeroAutovetture>=10000 AND TA.Nome= punto ) AND (CodS, NumL) IN (SELECT CodS, NumL FROM PRODUZIONE P, TIPO_AUTOVETTURA TA WHERE P.CodTA=TA.CodTA AND P.NumeroAutovetture>=20000 AND TA.Nome= cinquecento ); Interrogazione 4. Selezionare il nome delle riviste che non hanno mai pubblicato articoli di motociclismo. SELECT NomeR FROM RIVISTA WHERE CodR NOT IN (SELECT CodR FROM ARTICOLO WHERE Argomento= motociclismo ); Oppure SELECT NomeR FROM RIVISTA R WHERE NOT EXISTS (SELECT * FROM ARTICOLO A WHERE Argomento= motociclismo AND A.CodR=R.CodR); Interrogazione 5. Selezionare gli editori che non hanno mai pubblicato articoli di motociclismo. SELECT Editore FROM RIVISTA WHERE Editore NOT IN (SELECT Editore FROM ARTICOLO A, RIVISTA R WHERE A.CodR=R.CodR AND Argomento= motociclismo ); 7

Interrogazione 6. Selezionare il nome delle riviste che hanno pubblicato solo articoli di motociclismo. SELECT DISTINCT NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND RIVISTA.CodR NOT IN (SELECT CodR FROM ARTICOLO WHERE Argomento<> motociclismo ); Interrogazione 7. ORCHESTRA(CodO, NomeO, NomrDirettore, numelementi) CONCERTI(CodC, Data, CodO, CodS, PrezzoBiglietto) SALE(CodS, NomeS, Città, Capienza) Selezionare il codice e il nome delle orchestre con più di 30 elementi che hanno tenuto concerti sia a Torino, sia a Milano e non hanno mai tenuto concerti a Bologna. SELECT CodO, NomeO FROM ORCHESTRA WHERE NumElementi>30 AND CodO IN (SELECT C1.CodO FROM CONCERTI C1, SALE S1 WHERE C1.CodS=S1.CodS AND S1.Citta= Torino ) AND CodO IN (SELECT C2.CodO FROM CONCERTI C2, SALE S2 WHERE C2.CodS=S2.CodS AND S2.Citta= Milano ) AND CodO NOT IN (SELECT C3.CodO FROM CONCERTI C3, SALE S3 WHERE C3.CodS=S3.CodS AND S3.Citta= Bologna ); 8

1.3 Funzioni aggregate e Group by: COUNT(), AVG(), SUM(), MAX() MIN() e GROUP BY Interrogazione 1. Selezionare il numero di articoli di motociclismo presenti nella base di dati. SELECT COUNT(*) FROM ARTICOLO WHERE Argomento= Motociclismo ; Interrogazione 2. Selezionare il numero di articoli pubblicati sulla rivista D100 (CodR= D100 ). SELECT COUNT(*) FROM ARTICOLO WHERE CodR= D100 ; Interrogazione 3. Selezionare il codice e il numero di articoli pubblicati su ogni rivista. SELECT CodR, COUNT(*) FROM ARTICOLO GROUP BY CodR; Interrogazione 4. Selezionare il codice, il nome e il numero di articoli pubblicati su ogni rivista. SELECT RIVISTA.NomeR, COUNT(*) FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR; GROUP BY RIVISTA.CodR, NomeR; 9

Interrogazione 5. Selezionare il nome e il numero di articoli pubblicati su ogni rivista. SELECT NomeR, COUNT(*) FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR; GROUP BY RIVISTA.CodR, NomeR; Interrogazione 6. Selezionare il codice delle riviste che hanno pubblicato almeno due articoli di motociclismo. SELECT CodR FROM ARTICOLO WHERE Argomento= motociclismo GROUP BY CodR HAVING COUNT(*)>1 Interrogazione 7. Selezionare il nome delle riviste che hanno pubblicato almeno due articoli di motociclismo. SELECT NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND Argomento= motociclismo GROUP BY RIVISTA.CodR, NomeR HAVING COUNT(*)>1 10

Interrogazione 8. Selezionare il codice e il nome delle riviste che hanno pubblicato un articolo, ed uno solo, di motociclismo (possono aver scritto quanti articoli desiderano relativamente ad altri argomenti). SELECT RIVISTA.CodR, NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND Argomento= motociclismo GROUP BY RIVISTA.CodR, NomeR HAVING COUNT(*)=1 Interrogazione 9. CORSO (CodCorso, NomeC, Anno, Semestre) ORARIO LEZIONI (CodCorso, GiornoSettimana, OraInizio, OraFine, Aula) Selezionare codice corso, nome corso e numero totale di ore di lezione settimanali per i corsi del terzo anno per cui il numero complessivo di ore di lezione settimanali è superiore a 10 e le lezioni sono in più di tre giorni diversi della settimana. SELECT C.CodCorso, C.NomeC, SUM(OraFine-OraInizio) FROM CORSO C, ORARIO_LEZIONI OL WHERE C.CodCorso=OL.CodCorso AND C.Anno = 3 GROUP BY C.Corso, C.NomeC HAVING SUM(OraFine-OraInizio)>10 AND COUNT(DISTINCT GiornoSettimana)>3; 11

Interrogazione 10. GARA(CodG, Luogo, Data, Disciplina) ATLETA(CodA, Nome, Nazione, DataNascita) PARTECIPAZIONE(CodG, CodA,PosizioneArrivo, Tempo) Selezionare le nazioni per cui concorrono almeno 5 atleti nati prima del 1980, ciascuno dei quali abbia partecipato ad almeno 10 gare di sci di fondo. SELECT Nazione FROM ATLETA WHERE DataNascita< 1/1/1980 AND CodA IN (SELECT CodA FROM PARTECIPAZIONE P,GARA G WHERE P.CodG=G.CodG AND Disciplina= fondo GROUP BY CodA HAVING COUNT(*)>=10) GROUP BY Nazione HAVING COUNT(*)>=5; Interrogazione 11. APPARTAMENTO(CodA, Superficie, Indirizzo, Città) CONTRATTO AFFITTO(CodA, DataInizio, DataFine, NomePersona, RettaMensile) Selezionare il nome delle persone che hanno stipulato più di due contratti di affitto per lo stesso appartamento. SELECT NomePersona FROM CONTRATTO_AFFITTO GROUP BY NomePersona,CodA HAVING COUNT(*)>2; Interrogazione 12. APPARTAMENTO(CodA, Superficie, Indirizzo, Città) CONTRATTO AFFITTO(CodA, DataInizio, DataFine, NomePersona, RettaMensile) Selezionare il nome delle persone che hanno stipulato più di due contratti di affitto nel corso della stessa data. SELECT NomePersona FROM CONTRATTO_AFFITTO GROUP BY NomePersona,DataInizio HAVING COUNT(*)>2; 12

Interrogazione 13. Selezionare il nome delle riviste che hanno pubblicato un numero di articoli di motociclimo compreso tra 10 e 25. SELECT NomeR FROM RIVISTA, ARTICOLO WHERE RIVISTA.CodR=ARTICOLO.CodR AND Argomento= motociclismo GROUP BY RIVISTA.CodR, NomeR HAVING COUNT(*)>=10 AND COUNT(*)<=25; Interrogazione 14. Selezionare il nome delle riviste che hanno pubblicato almeno 10 articoli di automobilismo e almeno 25 articoli di motociclimo. SELECT NomeR FROM RIVISTA WHERE CodR IN (SELECT CodR ARTICOLO WHERE Argomento= automibilismo GROUP BY CodR HAVING COUNT(*)>=10) AND CodR IN (SELECT CodR ARTICOLO WHERE Argomento= motociclismo GROUP BY CodR HAVING COUNT(*)>=25); Interrogazione 15. Selezionare il nome delle riviste che hanno pubblicato meno di 25 articoli di motociclimo. SELECT NomeR FROM RIVISTA WHERE CodR NOT IN (SELECT CodR ARTICOLO WHERE Argomento= motociclismo GROUP BY CodR HAVING COUNT(*)>=25); 13

Interrogazione 16. Selezionare il nome delle riviste che hanno pubblicato almeno 10 articoli di automobilismo e meno di 25 articoli di motociclimo. SELECT NomeR FROM RIVISTA WHERE CodR IN (SELECT CodR ARTICOLO WHERE Argomento= automibilismo GROUP BY CodR HAVING COUNT(*)>=10) AND CodR NOT IN (SELECT CodR ARTICOLO WHERE Argomento= motociclismo GROUP BY CodR HAVING COUNT(*)>=25); Interrogazione 17. QUIZ(CodQuiz, Argomento, Punteggio) STUDENTE(Matricola, Nome, Indirizzo, Città) RISULTATO TEST(Matricola, CodQuiz,RispostaCorretta) Selezionare il nome degli studenti di Torino che hanno conseguito il punteggio massimo possibile nei quiz di matematica. SELECT Nome FROM STUDENTE S, RISULTATO_TEST R, QUIZ Q WHERE Citta= Torino AND R.Matricola=S.Matricola AND R.CodQuiz=Q.CodQuiz AND RispostaCorretta= si AND Argomento= matematica GROUP BY S.Matricola, Nome HAVING SUM(Punteggio)=(SELECT SUM(Punteggio) FROM QUIZ WHERE Argomento= matematica ); 14

Interrogazione 18. RIUNIONE(CodR, Descrizione, DataRiunione) DIPENDENTE(CodD, Nome, Cognome, DataNascita, Città) PARTECIPA RIUNIONE(CodD, CodR) Visualizzare il codice dei dipendenti che hanno partecipato a tutte le riunioni che si sono svolte. SELECT CodD FROM PARTECIPA_RIUNIONE PR WHERE PR.CodR=R.CodR GROUP BY CodD HAVING COUNT(*)=(SELECT COUNT(*) FROM RIUNIONE); Interrogazione 19. RIUNIONE(CodR, Descrizione, DataRiunione) DIPENDENTE(CodD, Nome, Cognome, DataNascita, Città) PARTECIPA RIUNIONE(CodDip, CodR) Visualizzare il codice dei dipendenti che hanno partecipato almeno a tutte le riunioni alle quali ha partecipato il dipendente D100 (CodD= D100 ). SELECT CodD FROM PARTECIPA_RIUNIONE AND CodR IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD= D100 ) GROUP BY CodD HAVING COUNT(*)=(SELECT COUNT(*) FROM PARTECIPA_RIUNIONE WHERE CodD= D100 ) 15

Interrogazione 20. RIUNIONE(CodR, Descrizione, DataRiunione) DIPENDENTE(CodD, Nome, Cognome, DataNascita, Città) PARTECIPA RIUNIONE(CodDip, CodR) Visualizzare il codice dei dipendenti che hanno partecipato solamente alle riunioni alle quali ha partecipato il dipendente D100 (CodD= D100 ). SELECT CodD FROM DIPENDENTE D WHERE CodD NOT IN (SELECT CodD FROM PARTECIPA_RIUNIONE WHERE CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD= D100 )); Oppure SELECT CodD FROM DIPENDENTE D WHERE NOT EXISTS (SELECT * FROM PARTECIPA_RIUNIONE PR WHERE PR.CodD=D.CodD AND PR.CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD= D100 )); 16

Interrogazione 21. RIUNIONE(CodR, Descrizione, DataRiunione) DIPENDENTE(CodD, Nome, Cognome, DataNascita, Città) PARTECIPA RIUNIONE(CodDip, CodR) Visualizzare il codice dei dipendenti che hanno partecipato a tutte e sole le riunioni alle quali ha partecipato il dipendente D100 (CodD= D100 ). SELECT CodD FROM PARTECIPA_RIUNIONE AND CodR IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD= D100 ) AND CodD NOT IN (SELECT CodD FROM PARTECIPA_RIUNIONE WHERE CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD= D100 )) GROUP BY CodD HAVING COUNT(*)=(SELECT COUNT(*) FROM PARTECIPA_RIUNIONE WHERE CodD= D100 ) 17

1.4 Uso della correlazione Interrogazione 1. ALLOGGIO(CodA, Indirizzo,Città,Superficie,CostoAffittoMensile) CONTRATTO-AFFITTO(CodC, DataInizio,DataFine,NomePersona,CodA) Selezionare il codice, l indirizzo e la città degli alloggi che hanno una superficie superiore alla superficie media degli alloggi delle città in cui si trovano. SELECT CodA, Indirizzo, Citta FROM ALLOGGIO A1 WHERE Superficie>(SELECT AVG(Superficie) FROM ALLOGGIO A2 WHERE A2.Citta=A1.Citta); Interrogazione 2. SALA RIUNIONI(CodS, NomeSala, NumeroMaxPosti, Proiettore) PRENOTAZIONE SALA(CodS, Data, OraInizio, OraFine, CodDip) DIPENDENTE(CodDip, Nome, Cognome, DataNascita, Città) Visualizzare per ogni sala che è stata prenotata almeno una volta il codice della sala, il nome della sala e il numero di prenotazioni relativamente all ultima data in cui la sala è stata prenotata. SELECT S.CodS, NomeSala, COUNT(*) FROM SALA_RIUNIONI S, PRENOTAZIONE_SALA P WHERE S.CodS=P.CodS AND P.Data=(SELECT MAX(Data) FROM PRENOTAZIONE_SALA P2 WHERE P2.CodS=S.CodS) GROUP BY S.CodS, NomeSala; Oppure SELECT S.CodS, NomeSala, COUNT(*) FROM SALA_RIUNIONI S, PRENOTAZIONE_SALA P WHERE S.CodS=P.CodS AND NOT EXISTS (SELECT * FROM PRENOTAZIONE_SALA P2 WHERE P2.CodS=S.CodS AND P2.Data>P.Data) GROUP BY S.CodS, NomeSala; 18

Interrogazione 3. PERSONE(CodFisc, Nome, Cognome, Indirizzo, Città) MULTE(IdMulta, CodFisc, DataMulta, Somma) Selezionare il nome e il cognome delle persone per cui il numero di multe ricevute nel 2005 è superiore al numero di multe ricevute nel 2004 dalla persona stessa. SELECT Nome, Cognome FROM PERSONE P, MULTE M WHERE P.CodFisc=M.CodFisc AND DataMulta>= 1/1/2005 AND DataMulta<= 31/12/2005 GROUP BY P.CodFisc, Nome, Cognome HAVING COUNT(*)>(SELECT COUNT(*) FROM MULTE M2 WHERE M2.CodFisc=P.CodFisc AND DataMulta>= 1/1/2004 AND DataMulta<= 31/12/2004 ); 19