IL LINGUAGGIO SQL
(Standard Query Language)
SQL
•
Linguaggio standard per interrogare (=consultare) una base di dati relazionale
•
Linguaggio dichiarativo
•
il programmatore esprime QUALI dati recuperare, e non COME FARE per recuperarli
•
Non vedremo tutti i dettagli, ma abbastanza per fare le
interrogazioni più frequenti
SQL
•
Struttura di una query:
SELECT [attributo1, attributo2, ..., attributon]
FROM [tabella1, tabella2, ..., tabella m]
{WHERE condizione}
SQL
•
Consideriamo il “solito” db con le informazioni su studenti, corsi ed esami
•
Schema:
Studenti(matricola,nome,cognome,data_di_nascita) Corsi(id,descrizione,CFU)
Esami(studente,corso,voto)
•
Possibile istanza:
matricola nome cognome data_di_nascita
1234 Paolo Rossi 12/07/1989 5555 Laura Verdi 02/04/1990 3322 Mario Gialli 22/05/1988 1121 Laura Blu 22/05/1988
Studenti
Corsi
id descrizione CFU
INF1 informatica 1 6
studente corso voto
1234 INF1 23
1234 FIS 30
5555 FIS 21
5555 INF1 24
5555 INF2 30
1121 INF1 30
1121 INF2 30
Esami
PROIEZIONE
•
Nome e cognome di tutti gli studenti:
SELECT nome, cognome FROM Studenti
matricola nome cognome data_di_nascita
1234 Paolo Rossi 12/07/1989 5555 Laura Verdi 02/04/1990 3322 Mario Gialli 22/05/1988 1121 Laura Blu 22/05/1988
PROIEZIONE
•
Nome e cognome di tutti gli studenti:
SELECT nome, cognome FROM Studenti
nome cognome Paolo Rossi Laura Verdi Mario Gialli
Laura Blu
SELEZIONE
•
Elenco dei corsi che hanno almeno 4 CFU SELECT *
FROM Corsi
WHERE CFU>=4
id descrizione CFU
INF1 informatica 1 6
INF2 informatica 1I 5
FIS matematicafisica 2
SELEZIONE
•
Elenco dei corsi che hanno almeno 4 CFU SELECT *
FROM Corsi
WHERE CFU>=4
id descrizione CFU
INF1 informatica 1 6
INF2 informatica 1I 5
SELEZIONE + PROIEZIONE
•
Descrizione e CFU dei corsi che hanno almeno 4 CFU SELECT descrizione, CFU
FROM Corsi
WHERE CFU>=4
id descrizione CFU
INF1 informatica 1 6
INF2 informatica 1I 5
FIS matematicafisica 2
SELEZIONE + PROIEZIONE
•
Descrizione e CFU dei corsi che hanno almeno 4 CFU SELECT descrizione, CFU
FROM Corsi
WHERE CFU>=4
descrizione CFU
informatica 1 6
informatica 1I 5
PRODOTTO CARTESIANO
SELECT *
FROM Esami,Corsi
id descrizione CFU
INF1 informatica 1 6
INF2 informatica 1I 5
FIS matematicafisica 2 studente corso voto
1234 INF1 23
1234 FIS 30
5555 FIS 21
5555 INF1 24
5555 INF2 30
1121 INF1 30
PRODOTTO CARTESIANO
SELECT *
FROM Esami,Corsi
id descrizione CFU
INF1 informatica 1 6
INF2 informatica 1I 5
FIS matematicafisica 2
INF1 informatica 1 6
INF2 informatica 1I 5
FIS matematicafisica 2 studente corso voto
1234 INF1 23
1234 INF1 23
1234 INF1 23
1234 FIS 30
1234 FIS 30
1234 FIS 30
RIFLESSIONE
•
Elencare più tabelle nella clausola FROM corrisponde ad eseguire il prodotto cartesiano
•
Con il prodotto cartesiano “unisco” anche informazioni che, nella realtà, sono scorrelate
•
Necessità di un prodotto cartesiano “intelligente”, che leghi le sole informazioni correlate (= stesso valore per gli attributi
corrispondenti)
JOIN
•
Elenco degli esami (nome per esteso e CFU) SELECT *
FROM Esami, Corsi WHERE id=corso
studente corso voto id descrizione CFU
1234 INF1 23 INF1 informatica 1 6
1234 FIS 30 FIS matematicafisica 2
5555 FIS 21 FIS matematicafisica 2
5555 INF1 24 INF1 informatica 1 6
5555 INF2 30 INF2 5
JOIN (CON PROIEZIONE)
•
Matricola, nome del corso e voto degli esami superati:
SELECT studente,voto,descrizione FROM Esami, Corsi
WHERE id=corso
studente corso voto id descrizione CFU
1234 INF1 23 INF1 informatica 1 6
1234 FIS 30 FIS matematicafisica 2
5555 FIS 21 FIS matematicafisica 2
5555 INF1 24 INF1 informatica 1 6
5555 INF2 30 INF2 informatica 1I 5
JOIN (CON PROIEZIONE)
•
Matricola, nome del corso e voto degli esami superati:
SELECT studente,voto,descrizione FROM Esami, Corsi
WHERE id=corso
studente voto descrizione
1234 23 informatica 1
1234 30 matematicafisica
5555 21 matematicafisica
5555 24 informatica 1
5555 30 informatica 1I
JOIN (CON PROIEZIONE)
•
Nome studente, nome del corso e voto degli esami superati:
SELECT nome,cognome,voto,descrizione FROM Esami, Corsi, Studenti
WHERE id=corso AND matricola=studente
nome cognome voto descrizione
Paolo Rossi 23 informatica 1
Paolo Rossi 30 matematicafisica Laura Verdi 21 matematicafisica
Laura Verdi 24 informatica 1
Laura Verdi 30 informatica 1I
RIDENOMINAZIONE
•
Posso rinominare tabelle e campi:
•
Se ho campi con lo stesso nome in tabelle diverse, uso la notazione con il punto:
SELECT *
FROM Esami as E
SELECT *
SELECT studente AS matricola_studente
FROM Esami
DIFFERENZA INSIEMISTICA
•
Eseguibile solo tra tabelle (o risultati di query) aventi lo stesso schema=stessi campi
•
Matricole degli studenti che non hanno sostenuto esami:
SELECT matricola as stud FROM Studenti
MINUS
SELECT studente as stud
FROM Esami
LA QUERY PIÙ SEMPLICE
•
Elenco degli studenti:
SELECT *
FROM Studenti
matricola nome cognome data_di_nascita
1234 Paolo Rossi 12/07/1989 5555 Laura Verdi 02/04/1990 3322 Mario Gialli 22/05/1988 1121 Laura Blu 22/05/1988
LA QUERY PIU’ DIFFICILE (1)
•
Genitori_Figli
•
Vogliamo i nomi dei genitori che hanno solo figli maggiorenni
Genitore Figlio EtaFiglio
Mario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23 Renato Elena 29
LA QUERY PIU’ DIFFICILE (2)
•
Genitori_Figli
Genitore Figlio EtaFiglioMario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23 Renato Elena 29
LA QUERY PIU’ DIFFICILE (3)
•
Genitori_Figli
SELECT Genitore
FROM Genitori_Figli
Genitore Figlio EtaFiglio
Mario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23 Renato Elena 29
LA QUERY PIU’ DIFFICILE (4)
•
Genitori_Figli
SELECT Genitore
Genitore Figlio EtaFiglio
Mario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23 Renato Elena 29
LA QUERY PIU’ DIFFICILE (5)
•
Soluzione: differenza insiemistica
•
Sottraggo dall’insieme dei genitori l’insieme dei genitori che hanno almeno un figlio minorenne
SELECT Genitore
FROM Genitori_Figli MINUS
SELECT Genitore
FROM Genitori_Figli
UN GIOCHINO (1)
•
Con l’SQL si può “fare tutto”?
•
Risposta: con l’SQL “di base” (visto finora) NO
•
Esempio query banale: contare il numero di studenti in archivio
•
L’SQL è esteso con funzioni di aggregazione tipo COUNT,
MAX, MIN, AVG, ecc.
UN GIOCHINO (2)
• Tabella R con un solo attributo A
• voglio trovare il valore massimo dell’attributo A nella tabella R
• Posso procedere come segue:
• individuo l’insieme S dei valori di A che NON sono massimi
• dall’insieme di tutti i valori di A in R sottraggo S (differenza insiemistica)
UN GIOCHINO (3)
•
Come faccio ad individuare l’insieme S dei “non-massimi”?
•
Faccio il prodotto cartesiano di R con sé stessa
•
Ottengo delle coppie (a1,a2) dove a1 e a2 sono valori assunti dal campo A in R
•
Seleziono a1 nel caso sia a1<a2, ossia a1 non è massimo
UN GIOCHINO (4)
•
R
A23 55
2
•
R x R
A23 23 23 55 55 55
2 2 2
A 23 55
2 23 55
2 23 55
2
Insieme S dei “non-massimi”
•
Differenza
A 23 55
2
A 23
2