IL LINGUAGGIO SQL - di.unito.itpozzato/oldws/suiss/db-sql.pdf · IL LINGUAGGIO SQL (Standard Query...
Transcript of IL LINGUAGGIO SQL - di.unito.itpozzato/oldws/suiss/db-sql.pdf · IL LINGUAGGIO SQL (Standard Query...
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
giovedì 11 novembre 2010
SQL
• Struttura di una query:
SELECT [attributo1, attributo2, ..., attributon]FROM [tabella1, tabella2, ..., tabella m]{WHERE condizione}
giovedì 11 novembre 2010
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)
giovedì 11 novembre 2010
• 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
Corsiid descrizione CFU
INF1 informatica 1 6INF2 informatica 1I 5
FIS fisica matematica 2
studente corso voto1234 INF1 231234 FIS 305555 FIS 215555 INF1 245555 INF2 301121 INF1 301121 INF2 30
Esami
giovedì 11 novembre 2010
PROIEZIONE• Nome e cognome di tutti gli studenti:
SELECT nome, cognomeFROM 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
giovedì 11 novembre 2010
PROIEZIONE• Nome e cognome di tutti gli studenti:
SELECT nome, cognomeFROM Studenti
nome cognome
Paolo RossiLaura VerdiMario GialliLaura Blu
giovedì 11 novembre 2010
SELEZIONE• Elenco dei corsi che hanno almeno 4 CFU
SELECT *FROM CorsiWHERE CFU>=4
id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5
FIS fisica matematica 2
giovedì 11 novembre 2010
SELEZIONE• Elenco dei corsi che hanno almeno 4 CFU
SELECT *FROM CorsiWHERE CFU>=4
id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5
giovedì 11 novembre 2010
SELEZIONE + PROIEZIONE• Descrizione e CFU dei corsi che hanno almeno 4 CFU
SELECT descrizione, CFUFROM CorsiWHERE CFU>=4
id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5
FIS fisica matematica 2
giovedì 11 novembre 2010
SELEZIONE + PROIEZIONE• Descrizione e CFU dei corsi che hanno almeno 4 CFU
SELECT descrizione, CFUFROM CorsiWHERE CFU>=4
descrizione CFUinformatica 1 6informatica 1I 5
giovedì 11 novembre 2010
PRODOTTO CARTESIANOSELECT *FROM Esami,Corsi
id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5
FIS fisica matematica 2
studente corso voto1234 INF1 231234 FIS 305555 FIS 215555 INF1 245555 INF2 301121 INF1 301121 INF2 30
giovedì 11 novembre 2010
PRODOTTO CARTESIANOSELECT *FROM Esami,Corsi
id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5
FIS fisica matematica 2
INF1 informatica 1 6INF2 informatica 1I 5
FIS fisica matematica 2
INF1 informatica 1 6
studente corso voto1234 INF1 231234 INF1 231234 INF1 231234 FIS 301234 FIS 301234 FIS 305555 FIS 21
... e le altre tuple... (in totale,7 x 3 = 21 tuple)giovedì 11 novembre 2010
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)
• Operazione di JOIN=selezione di un prodotto cartesiano
giovedì 11 novembre 2010
JOIN• Elenco degli esami (nome per esteso e CFU)
SELECT *FROM Esami, CorsiWHERE id=corso
studente corso voto id descrizione CFU1234 INF1 23 INF1 informatica 1 6
1234 FIS 30 FIS fisica matematica 2
5555 FIS 21 FIS fisica matematica 2
5555 INF1 24 INF1 informatica 1 65555 INF2 30 INF2 informatica 1I 51121 INF1 30 INF1 informatica 1 61121 INF2 30 INF2 informatica 1I 5
giovedì 11 novembre 2010
JOIN (CON PROIEZIONE)• Matricola, nome del corso e voto degli esami superati:
SELECT studente,voto,descrizioneFROM Esami, CorsiWHERE id=corso
studente corso voto id descrizione CFU1234 INF1 23 INF1 informatica 1 6
1234 FIS 30 FIS fisica matematica 2
5555 FIS 21 FIS fisica matematica 2
5555 INF1 24 INF1 informatica 1 65555 INF2 30 INF2 informatica 1I 51121 INF1 30 INF1 informatica 1 61121 INF2 30 INF2 informatica 1I 5
giovedì 11 novembre 2010
JOIN (CON PROIEZIONE)• Matricola, nome del corso e voto degli esami superati:
SELECT studente,voto,descrizioneFROM Esami, CorsiWHERE id=corso
studente voto descrizione
1234 23 informatica 1
1234 30 fisica matematica
5555 21 fisica matematica
5555 24 informatica 1
5555 30 informatica 1I
1121 30 informatica 1
1121 30 informatica 1I
giovedì 11 novembre 2010
JOIN (CON PROIEZIONE)• Nome studente, nome del corso e voto degli esami superati:
SELECT nome,cognome,voto,descrizioneFROM Esami, Corsi, StudentiWHERE id=corso AND matricola=studente
nome cognome voto descrizione
Paolo Rossi 23 informatica 1
Paolo Rossi 30 fisica matematica
Laura Verdi 21 fisica matematica
Laura Verdi 24 informatica 1
Laura Verdi 30 informatica 1I
Laura Blu 30 informatica 1
Laura Blu 30 informatica 1I
giovedì 11 novembre 2010
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 *FROM Impiegati as I, Capi as CWHERE I.matricola=C.matricola
SELECT studente AS matricola_studenteFROM Esami
giovedì 11 novembre 2010
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 studFROM Studenti
MINUS
SELECT studente as studFROM Esami
giovedì 11 novembre 2010
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
giovedì 11 novembre 2010
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
giovedì 11 novembre 2010
LA QUERY PIU’ DIFFICILE (2)• Genitori_Figli Genitore Figlio EtaFiglio
Mario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23
Renato Elena 29
• Vogliamo i nomi dei genitori che hanno solo figli maggiorenni
giovedì 11 novembre 2010
LA QUERY PIU’ DIFFICILE (3)• Genitori_Figli
SELECT GenitoreFROM Genitori_FigliWHERE EtaFiglio >= 18
Genitore Figlio EtaFiglio
Mario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23
Renato Elena 29
giovedì 11 novembre 2010
LA QUERY PIU’ DIFFICILE (4)• Genitori_Figli
SELECT GenitoreFROM Genitori_FigliWHERE EtaFiglio >= 18
Genitore Figlio EtaFiglio
Mario Anna 21
Mario Paolo 15
Lucia Silvia 19
Salvo Luca 4
Renato Giada 23
Renato Elena 29
giovedì 11 novembre 2010
LA QUERY PIU’ DIFFICILE (5)• Soluzione: differenza insiemistica
• Sottraggo dall’insieme dei genitori l’insieme dei genitori che hanno almeno un figlio minorenne
SELECT GenitoreFROM Genitori_Figli
MINUS
SELECT GenitoreFROM Genitori_FigliWHERE EtaFiglio<18
giovedì 11 novembre 2010
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.
• MAX e MIN si possono evitare...
giovedì 11 novembre 2010
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)
• il risultato è il massimo
giovedì 11 novembre 2010
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 perchè esiste un altro valore (a2) che è più grande
giovedì 11 novembre 2010
UN GIOCHINO (4)• R A
23552
• R x R A232323555555222
A235522355223552
Insieme S dei “non-massimi”
• Differenza
A23552
A232
-
giovedì 11 novembre 2010