Il linguaggio SQLpozzato/informatica/SQL.pdf · 2019-10-03 · •Possibile istanza: matricola nome...

Preview:

Citation preview

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

Corsiid descrizione CFU

INF1 informatica 1 6INF2 informatica 1I 5FIS fisica

matematica 2

studente corso voto1234 INF1 231234 FIS 305555 FIS 215555 INF1 245555 INF2 301121 INF1 301121 INF2 30

Esami

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

PROIEZIONE• Nome e cognome di tutti gli studenti:

SELECT nome, cognomeFROM Studenti

nome cognome

Paolo RossiLaura VerdiMario GialliLaura Blu

SELEZIONE• Elenco dei corsi che hanno almeno 4 CFU

SELECT *FROM CorsiWHERE CFU>=4

id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5FIS fisica

matematica 2

SELEZIONE• Elenco dei corsi che hanno almeno 4 CFU

SELECT *FROM CorsiWHERE CFU>=4

id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5

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 5FIS fisica

matematica 2

SELEZIONE + proiezione• Descrizione e CFU dei corsi che hanno almeno 4 CFU

SELECT descrizione, CFUFROM CorsiWHERE CFU>=4

descrizione CFUinformatica 1 6informatica 1I 5

PRODOTTO CARTESIANOSELECT *FROM Esami,Corsi

id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5FIS fisica

matematica 2

studente corso voto1234 INF1 231234 FIS 305555 FIS 215555 INF1 245555 INF2 301121 INF1 301121 INF2 30

PRODOTTO CARTESIANOSELECT *FROM Esami,Corsi

id descrizione CFUINF1 informatica 1 6INF2 informatica 1I 5FIS fisica

matematica 2INF1 informatica 1 6INF2 informatica 1I 5FIS fisica

matematica 2INF1 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)

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

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 61234 FIS 30 FIS fisica

matematica 25555 FIS 21 FIS fisica

matematica 25555 INF1 24 INF1 informatica 1 65555 INF2 30 INF2 informatica 1I 51121 INF1 30 INF1 informatica 1 61121 INF2 30 INF2 informatica 1I 5

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 61234 FIS 30 FIS fisica

matematica 25555 FIS 21 FIS fisica

matematica 25555 INF1 24 INF1 informatica 1 65555 INF2 30 INF2 informatica 1I 51121 INF1 30 INF1 informatica 1 61121 INF2 30 INF2 informatica 1I 5

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

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

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

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

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 EtaFiglioMario Anna 21Mario Paolo 15Lucia Silvia 19Salvo Luca 4

Renato Giada 23Renato Elena 29

La QUERY PIU’ difficile (2)• Genitori_Figli Genitore Figlio EtaFiglio

Mario Anna 21Mario Paolo 15Lucia Silvia 19Salvo Luca 4

Renato Giada 23Renato Elena 29

• Vogliamo i nomi dei genitori che hanno solo figli maggiorenni

La QUERY PIU’ difficile (3)• Genitori_Figli

SELECT GenitoreFROM Genitori_FigliWHERE EtaFiglio >= 18

Genitore Figlio EtaFiglioMario Anna 21Mario Paolo 15Lucia Silvia 19Salvo Luca 4

Renato Giada 23Renato Elena 29

La QUERY PIU’ difficile (4)• Genitori_Figli

SELECT GenitoreFROM Genitori_FigliWHERE EtaFiglio >= 18

Genitore Figlio EtaFiglioMario Anna 21Mario Paolo 15Lucia Silvia 19Salvo Luca 4

Renato Giada 23Renato 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 GenitoreFROM Genitori_Figli

MINUS

SELECT GenitoreFROM Genitori_FigliWHERE EtaFiglio<18

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...

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

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

un giochino (4)• R A

23552

• R x R A232323555555222

A235522355223552

Insieme S dei “non-massimi”

• Differenza

A23552

A232

-

un giochino (5)

SELECT AFROM R

MINUS

SELECT R1.A as AFROM R as R1, R as R2WHERE R1.A<R2.A

Recommended