Post on 02-Dec-2018
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