Laboratorio Di Basi Di Dati 02 Il D B M S My S Q L
S Q L
1. Corso di Basi di Dati e Laboratorio
Esercitazione di SQL
Alfio Ferrara - Stefano Montanelli
A.A. 2005/2006 Basi di Dati e Laboratorio 1
Schema Relazionale
– RUOLO(id, nome, descrizione)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
– GRUPPO(id, nome, finanziamento)
A.A. 2005/2006 Basi di Dati e Laboratorio 2
Istanza della BD
GRUPPO RUOLO
id nome finanz. id nome descrizione
1 coordinatori 9000 1 professore descr1
2 laboratorio 16000 2 ricercatore descr2
3 corso BD 13000 3 tesista NULL
4 progetto H 12000 4 studente descr4
5 corso OSW 10000
A.A. 2005/2006 Basi di Dati e Laboratorio 3
2. Istanza della BD
PERSONA APPARTENENZA
id_persona id_gruppo
id nome cognome ruolo
1 2
1 Carlo Bianchi 2
1 4
2 Paola Borroni 2
2 2
3 Marco Franchi 1
3 1
4 Lorenzo Lanzi 2
3 2
5 Franco Rossi NULL
3 4
6 Sandra Neri 3
4 2
7 Elena Ferrari 1
5 4
8 Andrea Verdi 2
8 2
8 5
A.A. 2005/2006 Basi di Dati e Laboratorio 4
Esercizio 1
• Formulare in SQL i comandi di creazione delle relazioni
RUOLO, PERSONA, APPARTENENZA, GRUPPO,
tenendo presente che:
– Nome e cognome di una persona non possono contenere valori
nulli
– Il finanziamento assegnato ad un gruppo non può superare i
20.000 euro
• Si richiede di esprimere:
– le opportune clausole PRIMARY KEY e FOREIGN KEY,
eventuali vincoli di integrita’ sui valori degli attributi e eventuali
valori di default per gli attributi;
– i seguenti vincoli di integrita’ referenziale:
• Non è possibile cancellare una persona se appartiene ad almeno un
gruppo
• Le variazioni agli identificatori dei gruppi vanno riportate anche nelle
registrazioni relative all’appartenenza
A.A. 2005/2006 Basi di Dati e Laboratorio 5
Soluzione esercizio 1
CREATE TABLE ruolo (
id serial PRIMARY KEY,
nome character varying(20),
descrizione character varying(50)
);
CREATE TABLE persona (
id serial PRIMARY KEY,
nome character varying(20) NOT NULL,
cognome character varying(20) NOT NULL,
ruolo integer REFERENCES ruolo(id)
);
A.A. 2005/2006 Basi di Dati e Laboratorio 6
3. Soluzione esercizio 1
CREATE TABLE gruppo (
id serial PRIMARY KEY,
nome character varying(20),
finanziamento integer CHECK (finanziamento < 20000)
);
CREATE TABLE appartenenza (
id_persona integer REFERENCES persona(id)
ON DELETE NO ACTION,
id_gruppo integer REFERENCES gruppo(id)
ON UPDATE CASCADE,
PRIMARY KEY (id_persona, id_gruppo)
);
A.A. 2005/2006 Basi di Dati e Laboratorio 7
Query 1
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare nome, cognome, ruolo delle
persone che sono professori o tesisti
A.A. 2005/2006 Basi di Dati e Laboratorio 8
Prima soluzione query 1
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Determinare nome, cognome, ruolo delle persone che sono
professori o tesisti
SELECT persona.nome, persona.cognome,
ruolo.nome AS ruolo
FROM persona, ruolo
WHERE (persona.ruolo=ruolo.id) AND
((ruolo.nome= ‘professore’) OR
(ruolo.nome= ‘tesista’));
A.A. 2005/2006 Basi di Dati e Laboratorio 9
4. Seconda soluzione query 1
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Determinare nome, cognome, ruolo delle persone che sono
professori o tesisti
SELECT persona.nome, persona.cognome,
ruolo.nome AS ruolo
FROM persona INNER JOIN ruolo ON
persona.ruolo=ruolo.id
WHERE (ruolo.nome= ‘professore’) OR
(ruolo.nome= ‘tesista’);
A.A. 2005/2006 Basi di Dati e Laboratorio 10
Query 2
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare nome, cognome, ruolo di ogni
persona presente nella base di dati
A.A. 2005/2006 Basi di Dati e Laboratorio 11
Soluzione query 2
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Determinare nome, cognome, ruolo di ogni persona
presente nella base di dati
SELECT persona.nome, persona.cognome,
ruolo.nome AS ruolo
FROM persona LEFT [OUTER] JOIN ruolo ON
persona.ruolo = ruolo.id;
A.A. 2005/2006 Basi di Dati e Laboratorio 12
5. Query 3
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare identificatore, nome, cognome,
ruolo delle persone che appartengono sia al
gruppo “laboratorio” che al gruppo “progetto H”
A.A. 2005/2006 Basi di Dati e Laboratorio 13
Soluzione query 3
Estrazione delle persone appartenenti al
gruppo laboratorio (preparatoria alla query):
SELECT persona.id, persona.nome,
persona.cognome, ruolo.nome AS ruolo
FROM persona LEFT JOIN ruolo ON
persona.ruolo = ruolo.id, appartenenza, gruppo
WHERE (persona.id = appartenenza.id_persona)
AND (appartenenza.id_gruppo = gruppo.id)
AND (gruppo.nome = 'laboratorio')
A.A. 2005/2006 Basi di Dati e Laboratorio 14
Soluzione query 3
SELECT persona.id, persona.nome, persona.cognome,
ruolo.nome AS ruolo
FROM persona LEFT JOIN ruolo ON
persona.ruolo = ruolo.id, appartenenza, gruppo
WHERE (persona.id = appartenenza.id_persona)
AND (appartenenza.id_gruppo = gruppo.id)
AND (gruppo.nome = 'laboratorio')
INTERSECT
(SELECT persona.id, persona.nome, persona.cognome,
ruolo.nome AS ruolo
FROM persona LEFT JOIN ruolo ON
persona.ruolo = ruolo.id, appartenenza, gruppo
WHERE (persona.id = appartenenza.id_persona)
AND (appartenenza.id_gruppo = gruppo.id)
AND (gruppo.nome = 'progetto H'));
A.A. 2005/2006 Basi di Dati e Laboratorio 15
6. Query 4
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare identificatore e nome dei gruppi
che dispongono di un finanziamento
superiore ai finanziamenti destinati ai gruppi
dei corsi
A.A. 2005/2006 Basi di Dati e Laboratorio 16
Soluzione query 4
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Determinare identificatore e nome dei gruppi che
dispongono di un finanziamento superiore ai
finanziamenti destinati ai gruppi dei corsi
SELECT id, nome
FROM gruppo
WHERE finanziamento > ALL
(SELECT finanziamento FROM gruppo
WHERE nome LIKE ‘%corso%');
A.A. 2005/2006 Basi di Dati e Laboratorio 17
Query 5
– RUOLO(id, nome, descrizione)
– GRUPPO(id, nome, finanziamento)
– PERSONA(id, nome, cognome, ruolo)
– APPARTENENZA(id_persona, id_gruppo)
Formulare in SQL la seguente interrogazione:
Determinare identificatore, nome, cognome e
numero di gruppi di appartenenza di ogni
persona presente nella base di dati
A.A. 2005/2006 Basi di Dati e Laboratorio 18
7. Soluzione query 5
L’utilizzo dell’operatore COUNT(id_gruppo)
permette di contare correttamente le occorrenze
delle persone nella relazione appartenenza
SELECT persona.id, persona.nome, cognome,
COUNT(id_gruppo) AS numerogruppi
FROM persona LEFT JOIN appartenenza
ON persona.id=appartenenza.id_persona
GROUP BY persona.id, cognome, persona.nome;
A.A. 2005/2006 Basi di Dati e Laboratorio 19