Interrogare una base di dati: Algebra relazionale e...

32
Interrogare una base di dati: Algebra relazionale e SQL Gaetano Anastasi Davide Barcelli Massimo Emiliano Ciaramello Giacoma Monreale

Transcript of Interrogare una base di dati: Algebra relazionale e...

Interrogare una base di dati: Algebra relazionale e SQL

Gaetano AnastasiDavide Barcelli

Massimo Emiliano CiaramelloGiacoma Monreale

Prerequisiti

● Importanza della modellazione● Concetti fondamentali dell'analisi dei requisiti● Derivazione del modello concettuale dalla

descrizione verbale del problema● Concetto di relazione come tabella● Trasformazione schema ad oggetti in schema

relazionale● Concetto di chiave primaria e esterna

Contesto

● Classe V del Liceo scientifico tecnologico (pre-riforma), secondo quadrimestre

● Ore settimanali: 1 ora di teoria in classe e 2 ore di laboratorio in co-presenza con ITP (insegnante tecnico-pratico)

● Ore totali: 50 ore (di cui 35 di laboratorio) + verifiche

SchedulingArgomenti Ore

Motivazione dell'uso dell'Algebra Relazionale 2

Esempi di interrogazioni (JRS) 2

Proiezione e Restrizione: teoria 2

Proiezione e Restrizione: laboratorio 6

Altri operatori base: unione, differenza e ridenominazione: teoria 2

Altri operatori base: unione, differenza e ridenominazione: laboratorio 2

Prodotto e cenni join: teoria 2

Prodotto e cenni join: laboratorio 6

Raggruppamento e funzioni di aggregazione: teoria 3

Raggruppamento e funzioni di aggregazione: laboratorio 9

Esercizi di complessità incrementale 4

Dall'algebra all'SQL: teoria 2

Dall'algebra all'SQL: laboratorio 8

Piano verifiche

Verifiche: 1) scritta dopo Prodotto; 2) orale durante il laboratorio sul raggruppamento; 3) scritto dopo SQL; 4) orale durante il laboratorio su SQL 5) prova pratica in laboratorio su problemi complessi usando JRS e SQL

Schema Relazionale: Esempio

Giocatori (CodiceG, Nome, AnnoNascita, CodiceS*)

Squadre (CodiceS, Nome, Presidente, Allenatore, Citta)

Partite (CodiceP , Data, SquadraVincitrice∗, SquadraPerdente∗)

Partecipazioni(CodiceGiocatore∗, CodicePartita∗, GoalSegnati)

CodiceG Nome AnnoNasc

CodiceS

1 Marco 1986 1

2 Paolo 1988 1

3 Franco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

CodiceS Nome Presidente Allenatore Citta

1 S1 Aldo Valerio Pisa

2 S2 Giovanni Luigi Livorno

3 S3 Giacomo Lorenzo Firenze

CodiceP Data SquadraV. SquadraP

1 1/4/2013 1 2

2 11/4/2013 1 3

3 18/4/2013 2 3

CodiceGioc

CodicePartita

GoalSegnati

1 1 1

2 1 1

3 1 1

4 1 0

1 2 1

2 2 0

5 2 0

3 3 2

4 3 0

Le relazioni

Giocatori

Squadre

Partecipacioni

Partite

Abbiamo bisogno di interrogare i dati...

● Algebra relazionale: insieme di operatori su relazioni che danno come risultato relazioni.

– Non si usa per interrogare dei DBMS ma come rappresentazione interna delle interrogazioni

– Molto utile per imparare a formulare query (composizionalità)

● SQL: Structured Query Language– linguaggio universale dei sistemi relazionali

Operatore di proiezione π

● La proiezione estrae un sottoinsieme “verticale” della relazione (decomposizione verticale)

● Risultato: una relazione con tutte le ennuple di partenza con solo gli attributi proiettati

Esempio π

Vogliamo sapere il nome e l'anno di nascita di tutti i giocatori

CodiceG Nome AnnoNasc CodiceS

1 Marco 1982 1

2 Paolo 1982 1

3 Francesco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

Nome AnnoNasc

Marco 1986

Paolo 1988

Francesco 1983

Giorgio 1982

Fabio 1981 Giocatori

Giocatori

πNome,AnnNascita

Operatore di restrizione σ

● La restrizione estrae un sottoinsieme “orizzontale” della relazione (decomposizione orizzontale)

● Risultato: una relazione con le ennuple di partenza che soddisfano una certa condizione e tutti i loro attributi

Esempio σ

Vogliamo trovare i dati dei giocatori nati nel 1982

● Esempi di possibili condizioni con vari operatori

CodiceG

Nome AnnoNasc

CodiceS

1 Marco 1982 1

2 Paolo 1982 1

3 Francesco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

Giocatori

CodiceG

Nome AnnoNasc

CodiceS

1 Marco 1982 1

2 Paolo 1982 1

4 Giorgio 1982 2

σ AnnoNascita=1982

Giocatori

Componiamo gli operatori

CodiceG

Nome AnnoNasc

CodiceS

1 Marco 1982 1

2 Paolo 1982 1

3 Francesco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

CodiceG

Nome AnnoNasc

CodiceS

1 Marco 1982 1

2 Paolo 1982 1

4 Giorgio 1982 2

Nome

Marco

Paolo

Giorgio

Giocatori

●Trovare il nome dei giocatori nati nel 1982

Giocatori

σ AnnoNascita=1982

πNome

Possiamo comporli come ci pare?

CodiceG

Nome AnnoNasc

CodiceS

1 Marco 1982 1

2 Paolo 1982 1

3 Francesco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

Giocatori

?

Giocatori

σ AnnoNascita=1982

πNome

Nome

Marco

Paolo

Francesco

Giorgio

Fabio

Possiamo comporli come ci pare? (cont.)

Giocatori

E' equivalente precedente?No, qui otteniamo 2 attributi

Giocatori

Questa lo è...

Unione● Le relazioni devono essere dello stesso tipo

● L’unione di due relazioni A e B seleziona tutte le tuple presenti in almeno una delle due relazioni

● Es: Trovare tutti i giocatori di serie A e B

● Nota che i duplicati sono eliminati

Differenza -

● Le relazioni devono essere dello stesso tipo

● La differenza di due relazioni A e B seleziona tutte le tuple presenti esclusivamente in A

A

A

B

B● Es: Trovare i giocatori

che giocano solo in seri A

Prodotto

● Il prodotto cartesiano di due relazioni A e B genera tutte le coppie formate da una ennupla di A e una ennupla di B

ProdottoGiocatori G Squadre S

CodiceG

Nome AnnoNasc

CodiceS

1 Marco 1982 1

2 Paolo 1982 1

3 Francesco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

Giocatori

CodiceS Nome Presidente Allenatore Citta

1 S1 Aldo Valerio Pisa

2 S2 Giovanni Luigi Livorno

3 S3 Giacomo Lorenzo Firenze

Squadre

CodiceG Nome AnnoNasc CodiceS CodiceS Nome Presidente

Allenatore Citta

1 Marco 1982 1 1 S1 Aldo Valerio Pisa

1 Marco 1982 1 2 S2 Giovanni Luigi Livorno

1 Marco 1982 1 3 S3 Giacomo Lorenzo Firenze

2 Paolo 1982 1 1 S1 Aldo Valerio Pisa

2 Paolo 1982 1 2 S2 Giovanni Luigi Livorno

2 Paolo 1982 1 3 S3 Giacomo Lorenzo Firenze

Componiamo diversi operatori

CodiceG Nome AnnoNasc CodiceS CodiceS Nome Presidente

Allenatore Citta

1 Marco 1982 1 1 S1 Aldo Valerio Pisa

1 Marco 1982 1 2 S2 Giovanni Luigi Livorno

1 Marco 1982 1 3 S3 Giacomo Lorenzo Firenze

2 Paolo 1982 1 1 S1 Aldo Valerio Pisa

2 Paolo 1982 1 2 S2 Giovanni Luigi Livorno

2 Paolo 1982 1 3 S3 Giacomo Lorenzo Firenze

3 Francesco 1983 2 1 S1 Aldo Valerio Pisa

3 Francesco 1983 2 2 S2 Giovanni Luigi Livorno

3 Francesco 1983 2 3 S3 Giacomo Lorenzo Firenze

● Trovare il nome dei giocatori che giocano nella squadra S1

Introduciamo la giunzione● Trovare il nome dei giocatori che giocano nella squadra S1

Giocatori G Squadre S Giocatori G Squadre S

Altri operatori ...

● Ridenominazione: modifica lo schema di una relazione, cambiando i nomi di uno o più attributi

● Intersezione (relazioni stesso tipo)

● Giunzione Naturale contenente tutte le coppie costituite da una tupla di A e una tupla di B per cui il valore degli attributi comuni è uguale

CodiceG Nome AnnoNasc CodiceS Nome Presidente

Allenatore Citta

1 Marco 1982 1 S1 Aldo Valerio Pisa

2 Paolo 1982 1 S1 Aldo Valerio Pisa

Motivazione per raggruppamento: Funzioni di aggregazione

● Limitazioni degli operatori base

● Es. Trovare per ogni giocatore il numero di partite giocate

● Se raggruppiamo le partite per giocatore poi basta contarle

?

Raggruppamento ϒ

A B C

A B f1 f2 R

A B C

Si raggruppano le ennuple in base a valori uguali di A e B

Si calcolano f1 e f2 e si restituisce una ennupla per ogni gruppo con A, B, f1, f2

C non esiste più quindi non lo puoi proiettare

Raggruppamento

● Trovare per ogni giocatore il numero di partite giocate e il numero totale di goal

CodiceGioc

CodicePartita

GoalSegnati

1 1 1

2 1 1

3 1 1

4 1 0

1 2 1

2 2 0

5 2 0

3 3 2

4 3 0

CodiceGioc

CodicePartita

GoalSegnati

1 1 1

1 2 1

2 1 1

2 2 0

3 1 1

3 3 2

4 1 0

4 3 0

5 2 0

CodiceGioc

Count(*) SUM(GoalSegnati)

1 2 2

2 2 1

3 2 3

4 2 0

5 1 0

Raggruppamento● Trovare i codici dei giocatori e il numero di partite da loro giocate

se sono almeno 2 partite

CodiceGioc

CodicePartita

GoalSegnati

1 1 1

1 2 1

2 1 1

2 2 0

3 1 1

3 3 2

4 1 0

4 3 0

5 2 0

CodiceGioc

Count(*) As NP

1 2

2 2

3 2

4 2

5 1

CodiceGioc

NP

1 2

2 2

3 2

4 2

CodiceGioc

ϒCount(*) AS NP

σ NP>=2

Qui non esiste più GoalSegnati quindi non lo posso proiettare

Proiezione con duplicati πb

CodiceG Nome AnnoNasc CodiceS

1 Marco 1982 1

2 Paolo 1982 1

3 Francesco 1983 2

4 Giorgio 1982 2

5 Fabio 1981 3

1982

1982

1983

1982

1981

Giocatori

πAnnoNascita

1982

1982

1981

πbAnnoNascita

Introduzione ordinamento

Giochiamo con le equivalenze

● Mostrare che si possono ottenere gli stessi risultati con diversi ordini di join, anticipando proiezioni e restrizioni e mostrando gli effetti

SQL

● Introduciamo il linguaggio universale dei sistemi relazionali con esempi partendo dall'algebra relazionale

● Opera su multiinsiemi

● SELECT Nome

FROM Giocatori

WHERE AnnoNascita=1982 ��������

SQL e Algebra relazionale

Giocatori

SELECT NomeFROM GiocatoriWHERE AnnoNascita=1982 �

SELECT NomeFROM Giocatori G,Partite PWHERE G.CodiceS = P.CodiceS AND

S.Nome='S1' �

Giocatori G Squadre S

SQL e Algebra relazionale

SELECT CodiceGioc, Count(*) AS NPFROM Partite GROUP BY CodiceGiocHAVING Count(*) >= 2

Partite

● Trovare i codici dei giocatori e il numero di partite da loro giocate se sono almeno 2 partite

SQL e Algebra relazionale

SELECT CodiceGioc, Count(*) AS NPFROM PartiteWHERE CodiceGioc > 2 GROUP BY CodiceGiocHAVING Count(*) >= 2

Partite

● Trovare i giocatori con codice superiore a 2 e il numero di partite da loro giocate se sono almeno 2 partite