IL LINGUAGGIO SQL - di.unito.itpozzato/oldws/suiss/db-sql.pdf · IL LINGUAGGIO SQL (Standard Query...

31
IL LINGUAGGIO SQL (Standard Query Language) giovedì 11 novembre 2010

Transcript of IL LINGUAGGIO SQL - di.unito.itpozzato/oldws/suiss/db-sql.pdf · IL LINGUAGGIO SQL (Standard Query...

IL LINGUAGGIO SQL(Standard Query Language)

giovedì 11 novembre 2010

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

UN GIOCHINO (5)

SELECT AFROM R

MINUS

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

giovedì 11 novembre 2010