Sei sulla pagina 1di 188

Sistemi per il recupero delle informazioni

RIASSUNTO
PROGETTAZIONE

 Ricordiamo le fasi della progettazione di una Base di Dati


ESEMPIO
ESEMPIO

VIENE TRADOTTO NELLO SCHEMA

MUSEI (NomeM, Città, Indirizzo, Direttore)


ARTISTI (NomeA, Nazionalità, DataN, DataM)
OPERE (Codice, Anno, Titolo, NomeM*, NomeA*)
PERSONAGGI (Personaggio, Codice*)
DIPINTI (Codice*, Tipo, Larghezza, Altezza)
SCULTURE (Codice*, Materiale, Altezza, Peso)
ENNUPLA E RELAZIONE
I meccanismi per definire una base di dati con il modello relazionale
sono solo due:

• l’ennupla
• la relazione.

Ennupla. È un insieme finito di coppie (Attributo, valore atomico)

Relazione. È un insieme finito (eventualmente vuoto) di ennuple con la


stessa struttura.

I campi di un’ennupla sono atomici (numeri, stringhe o il valore NULL).

Un’ennupla si usa per rappresentare entità e la relazione si usa per


rappresentare classi di entità.
TERMINOLOGIA - I

 attributo: corrisponde (non sempre) ad un attributo del modello E-R.


Diversamente dal modello E-R, gli attributi sono sempre univoci (ad un sol
valore) ed atomici (non composti)

 L’ordine degli attributi non è significativo

 dominio (di un attributo): è l’insieme dei valori che può assumere un


attributo.

 chiave primaria di una relazione: un attributo che identifica


univocamente le ennuple della relazione. Gli attributi della chiave primaria
vengono sottolineati
TERMINOLOGIA - II

 Una relazione si definisce dandole un nome ed elencando fra parentesi


tonde il tipo delle sue ennuple. La definizione di una relazione è detta
schema della relazione

R(A1:T1, A2:T2,..., An:Tn)

 R è il nome della relazione


 A1, A2,... sono gli attributi della relazione
 T1, T2,... sono i tipi degli attributi (interi, reali, booleani, stringhe)

 Per semplicità omettiamo la specifica dei tipi, per cui lo schema di relazione è
R(A1, A2,...,An)
RELAZIONE E TABELLA
Orario
Insegnamento Docente Aula Ora
Analisi matem. I Luigi Neri N1 8:00
Basi di dati Piero Rossi N2 9:45
Chimica Nicola Mori N1 9:45
Fisica I Mario Bruni N1 11:45
Fisica II Mario Bruni N3 9:45
Sistemi inform. Piero Rossi N3 8:00

ORARIO (Insegnamento, Docente, Aula, Ora)


Relazione e tabella sono sinonimi
SCHEMA
Orario
Insegnamento Docente Aula Ora
Analisi matem. I Luigi Neri N1 8:00
Basi di dati Piero Rossi N2 9:45
Chimica Nicola Mori N1 9:45
Fisica I Mario Bruni N1 11:45
Fisica II Mario Bruni N3 9:45
Sistemi inform. Piero Rossi N3 8:00

ORARIO (Insegnamento, Docente, Aula, Ora)


Le colonne della tabella formano
lo schema della relazione

Lo schema della relazione è la descrizione della struttura di una relazione


ISTANZE
Orario
Insegnamento Docente Aula Ora
Analisi matem. I Luigi Neri N1 8:00
Basi di dati Piero Rossi N2 9:45
Chimica Nicola Mori N1 9:45
Fisica I Mario Bruni N1 11:45
Fisica II Mario Bruni N3 9:45
Sistemi inform. Piero Rossi N3 8:00

ORARIO (Insegnamento, Docente, Aula, Ora)

I contenuti delle righe della tabella formano


le istanze della relazione

Un’istanza di uno schema di relazione è un insieme finito di ennuple.


 osserviamo che tutte le ennuple di una relazione hanno la stessa struttura
DATABASE
Corsi
Aule
Corso Docente Aula
Nome Edificio Piano
Basi di dati Rossi DS3
DS3 OMI Terra
Sistemi Neri N3
N3 OMI Terra
Reti Bruni N3
G Pincherle Primo
Controlli Bruni G

CorsiSedi Corso Aula Edificio Piano

Sistemi N3 OMI Terra


Reti N3 OMI Terra

Controlli G Pincherle Primo

Un database e’ un insieme di tabelle


Lo schema relazionale è la descrizione della struttura di una base di dati
 insieme di schemi di relazione e insieme di vincoli
DA MODELLO A OGGETTI A MODELLO
RELAZIONALE

La trasformazione di uno schema a oggetti in uno schema relazionale avviene


eseguendo i seguenti passi:

1. rappresentazione delle classi


2. rappresentazione delle associazioni uno a uno e uno a molti;
3. rappresentazione delle associazioni molti a molti o non binarie;
4. rappresentazione delle gerarchie di inclusione;
5. rappresentazione degli attributi multivalore;
6. appiattimento gli attributi composti
1. Rappresentazione delle classi

Una classe C è rappresentata da una relazione R i cui attributi sono quelli


di C

si traduce in

Studenti(Matricola, Nome, AnnoImmatric)


2. Rappresentazione delle associazioni uno a uno e uno a
molti

Studenti(Matricola, Nome, AnnoImmatric, Codice*)


CorsidiLa(Codice, Nome, Tipo)

la chiave esterna Codice* rappresenta l’associazione è_iscritto

N.B. È un grave errore fare il contrario. Lo schema:

Studenti(Matricola, Nome, AnnoImmatric)


CorsidiLa(Codice, Nome, Tipo, Matricola*)

rappresenta Corsi di Laurea ai quali può essere iscritto un solo studente!


3. Rappresentazione delle associazioni molti a molti o
non binarie

CorsidiLa(Codice,Nome,Facoltà,Tipo)
Docenti(CodDoc, Settore)
Insegna(Codice*, CodDoc*)

Una ennupla di Insegna rappresenta una coppia (Corso_di_Lurea, Docente) di


oggetti in associazione.

Il docente identificato dal CodDoc 1592 insegna ai


corsi di laurea identificati dai codici Inf, SBC e Mat , il
docente identificato dal CodDoc 3014 insegna al
corso di laurea identificato dai codici Inf, ecc...
4. Rappresentazione delle gerarchie fra classi
Partizionamento orizzontale

 Tre schemi indipendenti, uno per ogni classe, contenenti tutti gli
attributi di ciascuna classe

Anche con questa soluzione viene ignorata la gerarchia: si perde la


superclasse
Si osservi che con nessuna delle tre soluzioni è in generale possibile
esprimere i vincoli strutturali della gerarchia, vale a dire i vincoli di
disgiunzione e di totalità
5. Rappresentazione delle proprietà multivalore

Film(CodFilm,Titolo,Regista,Anno)
Attori(CodFilm*, Attore)
Riassumendo

Le regole di traduzione
 Entità: diventano tabelle ed i loro identificatori chiavi primarie
 Associazioni 1-1: se obbligatorie si procede come per le 1-N scegliendo il
lato in cui includere gli attributi e la chiave esterna; se una opzionale si
includono gli attributi e la chiave esterna sul lato“obbligatorio”; se entrambe
opzionali si costruisce una tabella autonoma come per il caso N-N.
 Associazioni1-N:gli attributi dell’associazione e la chiave primaria della
tabella relativa all’entità dal lato “N” sono inclusi nella tabella relativa
all’entità dal lato“1”.
 Associazioni N-N: diventano tabelle con chiave primaria formata
dall’unione delle chiavi delle entità coinvolte
Informazione incompleta
 ll modello relazionale impone ai dati una struttura rigida:
- le informazioni sono rappresentate per mezzo di ennuple
- solo alcuni formati di ennuple sono ammessi: quelli che
corrispondono agli schemi di relazione

 I dati disponibili possono non corrispondere al formato previsto

Es: PERSONE(Nome, SecondoNome, Cognome)

Nome SecondoNome Cognome


Franklin Delano Roosevelt
Winston Churchill
Charles De Gaulle
Josip Stalin
Informazione incompleta: soluzioni?

 Non conviene (anche se spesso si fa) usare valori del dominio (0,
stringa nulla, “99”, ...):

- potrebbero non esistere valori “non utilizzati”


- in fase di utilizzo (nei programmi) sarebbe necessario ogni volta
tener conto del “significato” di questi valori

 Tecnica rudimentale ma efficace:


- valore nullo:  denota l’assenza di un valore del dominio (e non è un
valore del dominio)
- si possono (e debbono) imporre restrizioni sulla presenza di valori
nulli
Vincoli, schemi e istanze

 I vincoli corrispondono a proprietà del mondo reale modellato dalla


base di dati
 interessano a livello di schema (con riferimento cioè a tutte le
istanze)

 Ad uno schema associamo un insieme di vincoli e consideriamo


corrette (valide, ammissibili) le istanze che soddisfano tutti i vincoli

 Nel modello relazionale si possono esprimere i seguenti vincoli:


 Vincolo di chiave
 Vincolo di chiave esterna
 Tipo di un attributo
 Attributo obbligatorio
 Vincoli strutturali delle associazioni (non completamente)
Una base di dati "scorretta"

Esami Studente Voto Lode Corso


276545 32 01
276545 30 e lode 02
787643 27 e lode 03
739430 24 04

Studenti Matricola Cognome Nome


276545 Rossi Mario
787643 Neri Piero
787643 Bianchi Luca
Tipi di vincoli

 Vincoli intrarelazionali: coinvolgono una singola relazione del


database.
 Esempi
- vincoli di ennupla

- vincoli di chiave

- vincoli su valore

 Vincoli interrelazionali: coinvolgono diverse relazioni del database.


 Esempio: vincoli di integrità referenziale
Vincoli di ennupla, esempio
Stipendi Impiegato Lordo Ritenute Netto
Rossi 55.000 12.500 42.500
Neri 45.000 10.000 35.000
Bruni 47.000 11.000 36.000

Lordo = (Ritenute + Netto)

Esprimono condizioni sui valori di ciascuna ennupla, indipendentemente dalle


altre ennuple

Una possibile sintassi:


espressione booleana di atomi che confrontano valori di attributo o
espressioni aritmetiche su di essi
Importanza delle chiavi

 L’esistenza delle chiavi garantisce l’accessibilità a ciascun dato della


base di dati

 Le chiavi permettono di correlare i dati in relazioni diverse:


 il modello relazionale è basato su valori

 In presenza di valori nulli, i valori della chiave non permettono


 di identificare le ennuple
 di realizzare facilmente i riferimenti da altre relazioni
Chiave primaria
 Chiave su cui non sono ammessi nulli
 Notazione: sottolineatura

Matricola Cognome Nome Corso Nascita

86765 NULL Mario Ing Inf 5/12/78

78763 Rossi Mario Ing Civile 3/11/76

65432 Neri Piero Ing Mecc 10/7/79

87654 Neri Mario Ing Inf NULL

43289 Neri Mario NULL 5/12/78


Integrità referenziale
 Informazioni in relazioni diverse sono correlate attraverso valori comuni
 in particolare, valori delle chiavi (primarie)

 le correlazioni debbono essere "coerenti“

 Un vincolo di integrità referenziale (“foreign key”) fra gli attributi X di


una relazione R1 e un’altra relazione R2 impone ai valori su X in R1 di
comparire come valori della chiave primaria di R 2

 ES: vincoli di integrità referenziale fra: l’attributo Vigile della relazione


INFRAZIONI e la relazione VIGILI
Infrazioni

Codice Data Vigile Prov Numero

34321 1/2/95 3987 MI 39548K

53524 4/3/95 3295 TO E39548

64521 5/4/96 3295 PR 839548

73321 5/2/98 9345 PR 839548

Vigili
Matricola Cognome Nome

3987 Rossi Luca

3295 Neri Piero

9345 Neri Mario

7543 Mori Gino


Violazione di vincolo di integrità referenziale

Infrazioni

Codice Data Vigile Prov Numero

34321 1/2/95 3987 MI 39548K

53524 4/3/95 3295 TO E39548


64521 5/4/96 3295 PR 839548

73321 5/2/98 9345 PR 839548

Auto
Prov Numero Cognome Nome

MI E39548 Rossi Mario


TO F34268 Rossi Mario

PR 839548 Neri Luca


Integrità referenziale e valori nulli
Impiegati
Matricola Cognome Progetto

34321 Rossi IDEA

53524 Neri XYZ

64521 Verdi NULL


73032 Bianchi IDEA

Progetti Codice Inizio Durata Costo

IDEA 01/2000 36 200

XYZ 07/2001 24 120

BOH 09/2001 24 150


Azioni compensative

 Esempio:
 Viene eliminata una ennupla causando una violazione

 Comportamento “standard”:
 Rifiuto dell'operazione

 Azioni compensative:
 Eliminazione in cascata
 Introduzione di valori nulli
Eliminazione in cascata

Impiegati
Matricola Cognome Progetto

34321 Rossi IDEA


53524 Neri XYZ

64521 Verdi NULL


73032 Bianchi IDEA

Progetti Codice Inizio Durata Costo

IDEA 01/2000 36 200


XYZ 07/2001 24 120

BOH 09/2001 24 150


Introduzione di valori nulli
Impiegati
Matricola Cognome Progetto

34321 Rossi IDEA

53524 Neri NULL


XYZ

64521 Verdi NULL


73032 Bianchi IDEA

Progetti Codice Inizio Durata Costo

IDEA 01/2000 36 200

XYZ 07/2001 24 120

BOH 09/2001 24 150


Esercizio

 La segreteria di un corso di laurea deve gestire alcune informazioni


relative all’orario delle lezioni.
 informazioni: aule, corsi, lezioni
 le aule sono identificate da un codice, di ogni aula interessa il

numero dei posti, l’edificio in cui è situata, se ha o non ha


proiettore
 alcune aule sono dotate di calcolatori, in questo caso interessa

sapere il numero dei pc


 i corsi sono identificati da un codice; di ogni corso interessa il

nome e il docente
 le lezioni sono caratterizzate da un’ora d’inizio, un’ora di fine, un

giorno della settimana, il semestre


 ogni lezione è tenuta in un’aula e si riferisce ad un corso
Sistemi per il recupero delle informazioni

ALGEBRA RELAZIONALE
Accesso ai Dati nei Sistemi Relazionali

Una base di dati può essere utilizzata con due modalità:

 interattivamente: l’utente interagisce direttamente con la base di dati


presentando al sistema una richiesta di dati. Tale richiesta prende il nome di
interrogazione (query). L’interrogazione viene interpretata dal sistema, che
in risposta restituisce i dati richiesti. Nella richiesta devono essere
specificate le proprietà dei dati che interessano. Se ad es. vogliamo
l’elenco dei libri scritti da Calvino, nella richiesta deve essere specificata
questa proprietà. L’interrogazione deve essere formulata per mezzo di un
linguaggio formale.

 mediante programmi: questo uso è riservato ad utenti programmatori.


Le interrogazioni fanno parte di un programma applicativo che può essere
eseguito dal sistema numerose volte, ed il risultato delle interrogazioni può
essere utilizzato dal programma per successive elaborazioni
ESEMPI DI QUERY

NOME MATRICOL INDIRIZZO TELEFONO CORSO MATRICOLA VOTO


Mario Rossi 123456 Via Etnea 1 222222 Programmazione 345678 27
Architetture 123456 30
Ugo Bianchi 234567 Via Roma 2 333333 Programmazione 234567 18
Teo Verdi 345678 Via Enna 3 444444 Matematica 345678 22
Discreta
Architettura 345678 30

CORSO PROFESSORE
Programmazione Ferro
Architetture Pappalardo
Matematica Discreta Lizzio

Quali Professori hanno


dato piu' di 24 a Teo
Verdi ed in quali corsi?
PROFESSORE CORSO
Programmazione Ferro
Architetture Pappalardo
LINGUAGGI RELAZIONALI

Come esempio di linguaggi per l’uso interattivo di basi di dati, relazionali,


vediamo

 l’algebra relazionale: insieme di operatori su relazioni che danno


come risultato relazioni. Non si usa come linguaggio di interrogazione
dei DBMS ma come rappresentazione interna delle interrogazioni.

 il linguaggio SQL (Structured Query Language), che offre una


sintassi per l’algebra relazionale.

Il termine algebra è dovuto al fatto che sono previsti operatori (query) che
agiscono su relazioni e producono altre relazioni come risultato.
Gli operatori possono essere combinati per formare espressioni complesse.
Algebra relazionale

 Insieme di operatori
 su relazioni
 che producono relazioni (tabelle)
 e possono essere composti per svolgere operazioni più
complesse
OPERATORI FONDAMENTALI

 Gli operatori fondamentali dell’algebra relazionale sono:


 Ridenominazione;
 Unione;
 Intersezione;
 Differenza;
 Proiezione;
 Restrizione (o Selezione);
 Prodotto.

 I simboli R,S,... denotano relazioni, A, B,…attributi e X,Y,…insiemi di


attributi
RIDENOMINAZIONE
 Operatore unario

 Modifica il nome di un attributo senza cambiarne il valore: restituisce


la relazione ottenuta sostituendo in R gli attributi A, B,… con gli
attributi A’, B’,…

 DEFINIZIONE OPERATORIALE: AA’ (R)

Paternità  Genitore  Padre (Paternità)

Padre Figlio Genitore


Padre Figlio
Adamo Abele Adamo Abele
Adamo Caino Adamo Caino
Abramo Isacco Abramo Isacco
OPERATORI INSIEMISTICI

 Le relazioni sono degli insiemi, quindi possiamo applicare gli


operatori sugli insiemi

 I risultati debbono essere relazioni

 E’ possibile applicare unione, intersezione, differenza solo a relazioni


definite sugli stessi attributi
UNIONE, INTERSEZIONE, DIFFERENZA

 Siano R ed S relazioni dello stesso tipo allora

 L’unione di R con S restituisce una relazione dello stesso tipo con


le ennuple che stanno in R in S, o in entrambe.
 L’intersezione di R con S restituisce una relazione dello stesso
tipo con le ennuple che stanno contemporaneamente sia in R sia
in S.
 La differenza di R con S restituisce una relazione dello stesso tipo
con le ennuple che stanno in R ma non in S.

 DEFINIZIONE OPERATORIALE
 RS
 RS
 R-S
ESEMPIO DI UNIONE
ESEMPIO DI INTERSEZIONE
ESEMPIO DI DIFFERENZA
ESEMPIO: UNIONE?

Maternità
Madre

???

 “Paternita’” e “Maternità” sono attributi con nomi diversi ma entrambi sono


“Genitori”
 Soluzione: ridenominare gli attributi
ESEMPIO: RIDENOMINAZIONE E UNIONE
selezione

proiezione
operatori "ortogonali“

selezione:
decomposizione orizzontale

proiezione:
decomposizione verticale
PROIEZIONE

 Produce risultati:
 su un sottoinsieme degli attributi dell’operando
 con valori da tutte le n-uple della relazione

 Data la relazione R su insieme di attributi X={A1,A2,…An} e un sottoinsieme Y di X,


la proiezione di R su Y è la relazione ottenuta da R considerando solo i valori sugli
attributi di Y

 DEFINIZIONE OPERATORIALE: Y(R)

 La cardinalità di Y(R), cioè il numero degli elementi che lo compongono, puo’ essere
minore di R nel caso di duplicati
ESEMPIO PROIEZIONE
 cognome e filiale di tutti gli impiegati

Matricola Cognome Filiale Stipendio


7309 Neri Napoli 55
5998 Neri Milano 64
9553 Rossi Roma 44
5698 Rossi Roma 64

 Cognome, Filiale (Impiegati)

 Si riduce la cardinalita’ del risultato rispetto all’operando


SELEZIONE (o RESTRIZIONE)

 Produce risultati:
 con lo stesso schema dell’operando
 con un sottoinsieme delle ennuple dell’operando: quelle che soddisfano
la condizione

 Data la relazione R la restrizione di R alla condizione C restituisce una


relazione dello stesso tipo di R avente per valori gli elementi di R che
soddisfano la condizione C.

 La condizione di selezione è formata da


 operatori booleani (AND, OR, NOT)
 condizione atomiche: termini che possono contenere
 confronti fra attributi (per esempio, Stipendio>Tasse, dove
Stipendio e Tasse sono attributi)
 confronti fra attributi e costanti (per esempio, Età  60, dove
Età è un attributo)

 DEFINIZIONE OPERATORIALE: Condizione(R)


Operatori booleani
 sintassi:  Condizione (Operando)
 Condizione: espressione booleana (come quelle dei vincoli di ennupla)
 semantica: il risultato contiene le ennuple dell'operando che soddisfano la
condizione

 Connettivi logici
  (AND),
  (OR),
  (NOT)

 Operatori di confronto
 = (uguale)  (diverso)
  (maggiore)  (minore)
  (maggiore o uguale)
  (minore o uguale)
ESEMPIO RESTRIZIONE
 impiegati che guadagnano più di 50

Impiegati

Matricola Cognome Filiale Stipendio


7309 Rossi Roma 55
5998 Neri Milano 64
9553
5698 Milano
Neri Milano
Napoli 44
64
5698 Neri Napoli 64

Stipendio > 50 (Impiegati)


 impiegati che guadagnano più di 50 e lavorano a Milano

Impiegati

Matricola Cognome Filiale Stipendio


7309
5998 Rossi
Neri Milano
Roma 55
64
5998 Neri Milano 64
9553 Milano Milano 44
5698 Neri Napoli 64

Stipendio > 50 AND Filiale = 'Milano' (Impiegati)


 impiegati che hanno lo stesso nome della filiale presso cui lavorano

Impiegati

Matricola Cognome Filiale Stipendio


7309
9553 Milano
Rossi Milano
Roma 55
44
5998 Neri Milano 64
9553 Milano Milano 44
5698 Neri Napoli 64

 Cognome = Filiale(Impiegati)
Selezione e proiezione

 Combinando selezione e proiezione, possiamo estrarre interessanti


informazioni da una relazione
 matricola e cognome degli impiegati che guadagnano più di 50

Matricola Cognome Filiale Stipendio


7309 Rossi Roma 55
5998 Neri Milano 64
9553
5698 Milano
Neri Milano
Napoli 44
64
5698 Neri Napoli 64
 Matricola,Cognome ( Stipendio > 50 )(Impiegati)
Selezione con valori nulli

Impiegati
Matricola Cognome Filiale Età
7309 Rossi Roma 32
5998 Neri Milano 45
9553 Bruni Milano NULL

SEL Età > 40 (Impiegati)

• la condizione atomica è vera solo per valori non nulli


Selezione con valori nulli: soluzione
SEL Età > 40 (Impiegati)
 la condizione atomica è vera solo per valori non nulli
 per riferirsi ai valori nulli esistono forme apposite di condizioni:
IS NULL
IS NOT NULL
 si potrebbe usare (ma non serve) una "logica a tre valori" (vero, falso,
sconosciuto)
 Quindi:
SEL Età>30 (Persone)  SEL Età30 (Persone)  SEL Età IS NULL (Persone)
=
SEL Età>30  Età30  Età IS NULL (Persone)
=
Persone
Impiegati
Matricola Cognome Filiale Età
7309
5998 Rossi
Neri Milano
Roma 32
45
5998
9553 Bruni
Neri Milano 45
NULL
9553 Bruni Milano NULL

SEL (Età > 40) OR (Età IS NULL) (Impiegati)


JOIN NATURALE

 operatore binario (generalizzabile)


 produce un risultato
 sull'unione degli attributi degli operandi
 con ennuple costruite ciascuna a partire da una ennupla di ognuno degli
operandi

 Permette di combinare ennuple da relazioni diverse basandosi sui valori


degli attributi

 Sia R con attributi XY ed S con attributi YZ. Il join naturale produce


una relazione di attributi XYZ; ennuple del risultato sono ottenute
combinando le ennuple di R e S che hanno gli stessi valori negli
attributi con lo stesso nome
ESEMPIO - I

 join completo: ogni ennupla contribuisce al risultato


ESEMPIO - II

 Join non completo: alcuni valori tra gli attributi comuni non
coincidono, quindi, alcune ennuple non partecipano al JOIN
ESEMPIO - III

 Join vuoto: caso limite


 potrebbe anche succedere che nessuna ennupla trovi il
corrispettivo
ESEMPIO - IV

 L’altro caso estremo del JOIN


 ogni ennupla di R1 si combina con ogni ennupla di R2
 la cardinalita’ del risultato e’ il prodotto delle cardinalita’
Cardinalità del join
 Il join di R1 e R2 contiene un numero di ennuple compreso fra zero e il prodotto di
|R1| e |R2|
 se il join coinvolge una chiave di R 2, allora il numero di ennuple è compreso fra
zero e |R1|
 se il join coinvolge una chiave di R2 e un vincolo di integrità referenziale, allora il
numero di ennuple è pari a |R1|

 R1(A,B) , R2 (B,C)
in generale
0  |R1 JOIN R2|  |R1|  |R2|
 se B è chiave in R2
0  |R1 JOIN R2|  |R1|

 se B è chiave in R2 ed esiste vincolo di integrità referenziale fra B (in R1) e R2:


|R1 JOIN R2| = |R1|
Join, una difficoltà

Impiegato Reparto Reparto Capo

Rossi A B Mori

Neri B C Bruni

Bianchi B

Impiegato Reparto Capo

Neri B Mori

Bianchi B Mori

 alcune ennuple non contribuiscono al risultato: vengono "tagliate


fuori"
Join esterno

 Il join esterno estende, con valori nulli, le ennuple che verrebbero


tagliate fuori da un join (interno)
 esiste in tre versioni:
 sinistro, destro, completo
Join esterno

 sinistro: mantiene tutte le tuple del primo operando, estendendole con


valori nulli, se necessario
 destro: ... del secondo operando ...
 completo: … di entrambi gli operandi ...
Impiegati Reparti
Impiegato Reparto Reparto Capo
Rossi A B Mori
Neri B C Bruni
Bianchi B

Impiegati JOINLEFT Reparti


Impiegato Reparto Capo
Neri B Mori
Bianchi B Mori
Rossi A NULL
Impiegati Reparti
Impiegato Reparto Reparto Capo
Rossi A B Mori
Neri B C Bruni
Bianchi B

Impiegati JOINRIGHT Reparti


Impiegato Reparto Capo
Neri B Mori
Bianchi B Mori
NULL C Bruni
Impiegati Reparti
Impiegato Reparto Reparto Capo
Rossi A B Mori
Neri B C Bruni
Bianchi B

Impiegati JOINFULL Reparti


Impiegato Reparto Capo
Neri B Mori
Bianchi B Mori
Rossi A NULL
NULL C Bruni
Join e proiezioni

Impiegato Reparto Reparto Capo


Rossi A B Mori
Neri B C Bruni
Bianchi B

Impiegato Reparto Capo


Neri B Mori
Bianchi B Mori

Impiegato Reparto Reparto Capo


Neri B B Mori
Bianchi B
Proiezioni e join
Impiegato Reparto Capo
Neri B Mori
Bianchi B Bruni
Verdi A Bini
Impiegato Reparto Reparto Capo
Neri B B Mori
Bianchi B B Bruni
Verdi A A Bini
Impiegato Reparto Capo
Neri B Mori
Bianchi B Bruni
Neri B Bruni
Bianchi B Mori
Verdi A Bini
Join e proiezioni

 R 1(X1), R 2(X2)

PROJX1 (R 1 JOIN R2 )  R 1

 R(X), X = X1  X2

(PROJX1 (R)) JOIN (PROJX2 (R))  R


Prodotto cartesiano

 un join naturale su relazioni senza attributi in comune


 contiene sempre un numero di ennuple pari al prodotto delle cardinalità
degli operandi (le ennuple sono tutte combinabili )
Prodotto cartesiano
Impiegati
Impiegato Reparto Codice Capo

Rossi A A Mori

Neri B B Bruni

Bianchi B Reparti

Impiegati JOIN Reparti

Impiegato Reparto Codice Capo


Rossi A A Mori
Rossi A B Bruni

Neri B A Mori

Neri B B Bruni

Bianchi B A Mori

Bianchi B B Bruni
 Il prodotto cartesiano, in pratica, ha senso (quasi) solo se seguito da
selezione:
SELCondizione (R1 JOIN R2)
 L'operazione viene chiamata theta-join e indicata con
R1 JOINCondizione R2

 La condizione C è spesso una congiunzione (AND) di atomi di


confronto A1 A2 dove  è uno degli operatori di confronto (=, >, <, …)
 se l'operatore è sempre l'uguaglianza (=) allora si parla di equi-join
Impiegati Reparti
Impiegato Reparto Codice Capo
Rossi A A Mori
Neri B B Bruni
Bianchi B
Impiegati JOINReparto=Codice Reparti
Impiegato Reparto Codice Capo
Rossi A A Mori
Rossi
Neri A
B B Bruni
Neri
Bianchi B A
B Mori
Bruni
Neri B B Bruni
Bianchi B A Mori
Bianchi B B Bruni
Esempi

Impiegati Matricola Nome Età Stipendio


7309 Rossi 34 45
5998 Bianchi 37 38
9553 Neri 42 35
5698 Bruni 43 42
4076 Mori 45 50
8123 Lupi 46 60
Supervisione Impiegato Capo
7309 5698
5998 5698
9553 4076
5698 4076
4076 8123
 Trovare matricola, nome, età e stipendio degli impiegati che
guadagnano più di 40 milioni

Matricola Nome Età Stipendio


7309 Rossi 34 45
5998
5698 Bianchi
Bruni 37
43 38
42
4076
9553 Mori
Neri 45
42 50
35
8123
5698 Lupi
Bruni 46
43 60
42
4076 Mori 45 50
8123 Lupi 46 60

SELStipendio>40(Impiegati)
 Trovare matricola, nome ed età degli impiegati che guadagnano più di
40 milioni

Matricola Nome Età Stipendio


7309 Rossi 34 45
5998
5698 Bianchi
Bruni 37
43 38
42
9553
4076 Mori
Neri 42
45 35
50
5698
8123 Bruni
Lupi 43
46 42
60
4076 Mori 45 50
8123 Lupi 46 60

PROJMatricola, Nome, Età (SELStipendio>40(Impiegati))


Sistemi per il recupero delle informazioni

IL LINGUAGGIO SQL
INTRODUZIONE

 Le interrogazioni devono essere scritte in un linguaggio formale con


caratteristiche tali da renderlo adatto ad esprimere interrogazioni sulla BD, e
da essere facilmente interpretato dal sistema. Il linguaggio generalmente
usato si chiama SQL (Structured Query Language)

 È un linguaggio di interrogazione e manipolazione della base dati e delle


informazioni in essa contenute

 Creato negli anni ’70 presso IBM , inizialmente solo come linguaggio di
interrogazione. Ora è linguaggio di riferimento per DataBase relazionali.
Standardizzato grazie al lavoro di ISO (international standard organization) e
ANSI (american national standard institute)
SQL

 originariamente "Structured Query Language", ora "nome proprio"


 linguaggio con varie funzionalità:
 contiene sia il DDL (schema) sia il DML(istanza)
 ne esistono varie versioni
 vediamo gli aspetti essenziali, non i dettagli

 prima proposta SEQUEL (1974);


 prime implementazioni in SQL/DS e Oracle (1981)
 dal 1983 ca. "standard di fatto"
 standard (1986, poi 1989 e infine 1992, 1999) - ISO, ANSI
 standard per i software che usano il modello relazionale
 recepito solo in parte
DDL, DML, DCL
 Data Definition Language (DDL)
 permette di creare e cancellare DB o di modificarne la struttura. Sono i comandi
DDL a definire la struttura del DB e quindi i dati in esso contenuti. Ma non fornisce gli
strumenti per modificare i dati stessi: per tale scopo si usa il DML. L’utente deve avere
i permessi necessari per agire sulla struttura del DB che vengono dati tramite il DCL

 Data Manipulation Language (DML)


 permette di inserire, cancellare, modificare e leggere i dati all’interno delle tabelle
di un DB. La struttura di questi dati deve essere già stata definita tramite il DDL. Il
permesso di accedere ai dati deve essere assegnato all’utente tramite il DCL.

 Data Controlo Language (DCL)


 serve a fornire o revocare agli utenti i permessi per poter usare i comandi DML e
DDL oltre agli stessi comandi DCL.
CREAZIONE DI TABELLE

Per definire una relazione (detta tabella nella terminologia SQL), si usa il
comando “create table”: definisce uno schema di relazione e ne crea
un’istanza vuota; specifica attributi, domini e vincoli; ad esempio

Libri(titolo, autore, codice_isbn)


CREATE TABLE, esempio

CREATE TABLE Impiegato(


Matricola CHAR(6) PRIMARY KEY,
Nome CHAR(20) NOT NULL,
Cognome CHAR(20) NOT NULL,
Dipart CHAR(15),
Stipendio NUMERIC(9) DEFAULT 0,
FOREIGN KEY(Dipart) REFERENCES
Dipartimento(NomeDip),
UNIQUE (Cognome,Nome)
)
Domini
 Il “Dominio” indica i valori che un attributo può assumere e le operazioni che possono
essere compiute su di esso.

 Domini elementari (predefiniti)


 Carattere: singoli caratteri o stringhe, anche di lunghezza variabile
 Bit: singoli booleani (flag) o stringhe di bit
 Numerici:
 esatti (es: numeric, decimal)

 approssimati (es: float)

 Data, ora, intervalli di tempo – UTC (Universal time coordinate)


 Introdotti in SQL:1999:
 Boolean

 BLOB, CLOB (Binary/Character large object): per grandi immagini e testi

 Domini definiti dall'utente (semplici, ma riutilizzabili)


VINCOLI
A ogni attributo possono essere associati dei vincoli

■ default: indica il valore che un attributo deve avere quando viene inserito
un record che, in corrispondenza di quell’attributo non ha assegnato alcun
valore

■ not null: i valori inseriti in quel campo devono essere diversi non nulli
■ Es: Cognome CHAR(20) not null

■ unique: il valore può comparire una volta sola

■ primary key: chiave primaria, (una sola, implica NOT NULL)


VINCOLI
■ Il valore di un attributo dichiarato NOT NULL va obbligatoriamente
specificato quando si aggiunge un’ennupla alla relazione.

■ Un altro vincolo è l’eventuale chiave primaria dichiarata con l’opzione


primary key. Gli attributi della chiave primaria non possono assumere
valori NULL.

Quando nella definizione di una tabella sono dichiarati dei vincoli il sistema
che gestisce la BD controlla che le operazioni che modificano la tabella
inserendo nuove ennuple o modificando i valori di attributi non violino i vincoli
dichiarati. Se un vincolo può essere violato l’operazione non viene eseguita e
viene segnalata una condizione di errore
PRIMARY KEY

 Matricola CHAR(6) PRIMARY KEY

 Matricola CHAR(6),
…,
PRIMARY KEY (Matricola)
CHIAVI ESTERNE

Vediamo come introdurre una chiave esterna attraverso il comando Foreign Key

create table studenti (


nome char(20),
matricola char(8) not null, create table CDL (
provincia char(2), facoltà char(20),
anno_nascita smallint, nome char(20) not null,
primary key (matricola) primary key (codice),
foreign key (codice) )
references CDL,
on delete no action,
)
CHIAVI ESTERNE
Quando si dichiara un vincolo di chiave esterna, il sistema fa i seguenti controlli:

1. quando si inserisce un’ennupla nella tabella Studenti, o quando si


modifica il campo chiave esterna, il valore della chiave esterna deve essere
presente in un’ennupla della tabella CDL;

2. quando si elimina un’ennupla dalla tabella CDL, se il valore della sua chiave
primaria è usato come valore di una chiave esterna di un’ennupla della tabella
Studenti, allora sono possibili tre scelte:
a. on delete no action: per proibire la cancellazione dell’ennupla da CDL.
Questa opzione vale anche quando si modifica il valore della chiave primaria
di CDL;
b. on delete cascade, per eliminare sia l’ennupla da CDL che tutte le
ennuple di Studenti che usano il valore della chiave primaria dell’ennupla che
si elimina;
c. on delete set null, per eliminare l’ennupla da CDL e porre a null il valore
della chiave esterna di tutte le ennuple di Studenti che usano il valore della
chiave primaria dell’ennupla che si elimina.
MODIFICA DEI DATI
Nuovi dati si inseriscono nella tabella con il comando INSERT.

Ad esempio, per aggiungere una nuova ennupla alla relazione Studenti si dà il


comando

INSERT INTO Studenti VALUES ("Tizio", "081575", "MI", “1985”)

Per cambiare invece l’attributo Provincia da “MI” a “TO” per lo studente con
Matricola "081575", si dà il comando:

UPDATE Studenti
SET Provincia = “TO”
WHERE Matricola = "081575"

Per eliminare invece l’ennupla dello studente con matricola "081575", si dà il


comando:
DELETE Studenti WHERE Matricola = "081575"
Transazioni in SQL
 Istruzioni fondamentali
 begin transaction: specifica l'inizio della transazione (le operazioni non vengono eseguite
sulla base di dati)
 commit work: le operazioni specificate a partire dal begin transaction vengono eseguite
 rollback work: si rinuncia all'esecuzione delle operazioni specificate dopo l'ultimo begin
transaction . Tutte le modifiche effettuate sui dati in precedenza (a partire dall’inizio della
transazione) sono cancellate. Annulla la transazione

begin transaction;
update ContoCorrente
set Saldo = Saldo – 10
where NumeroConto = 12345 ;
update ContoCorrente
set Saldo = Saldo + 10
where NumeroConto = 55555 ;
commit work;
RECUPERO DEI DATI:
IL COMANDO SELECT
 OBIETTIVI: Scrivere una query in linguaggio SQL
 selezionare ed elencare tutte le righe e le colonne di una tabella
 selezionare ed elencare determinate colonne di una tabella
 selezionare ed elencare le colonne di più tabelle

 Anche se la parola query può essere tradotta in interrogazione o domanda,


una query SQL non è necessariamente una domanda, può essere un
comando per svolgere una delle seguenti operazioni:
 creare o cancellare una tabella
 inserire, modificare o cancellare campi
 ricercare informazioni specifiche in più tabelle e restituire i risultati in un
particolare ordine
 modificare i parametri di protezione di un database
ESEMPIO - I
 Si consideri il seguente schema relazionale

Catalogo ( ISBN, Titolo, CasaEd, AnnoEd)

 Supponiamo che interessi conoscere il titolo e la casa editrice dei libri


pubblicati nel 2001. Occorre:

1. consultare la relazione Catalogo


ESEMPIO - II
2. considerare solo le ennuple in cui AnnoEd = 2001

3. prelevare da queste ennuple i valori degli attributi Titolo e CasaEd

 Questa sequenza di operazioni viene eseguita dal DBMS, purché gli venga
trasmesso un opportuno comando (interrogazione) nel linguaggio SQL:

SELECT Titolo, CasaEd


FROM Catalogo
WHERE AnnoEd = 2001

dove SELECT, FROM e WHERE sono parole riservate del linguaggio SQL.
STRUTTURA DEL COMANDO

 Una interrogazione (query) SQL agisce sulle relazioni definite nella base
di dati, e restituisce come risultato una relazione.
 questa viene in generale visualizzata sul monitor, oppure stampata; può
anche essere memorizzata nella base di dati o può essere utilizzata in
altre interrogazioni.

 Nei casi più semplici una interrogazione SQL deve specificare


 quali sono le informazioni che interessano
 in quali relazioni si trovano
 quali proprietà devono avere
SELECT
Quali sono le informazioni che interessano

SELECT Attributo1,Attributo2,...

è presente in ogni interrogazione e definisce lo schema della relazione


risultato. Più avanti vedremo che può avere una forma più complessa.

Esempio:
SELECT Titolo, CasaEd

significa che ci interessano il titolo e la casa editrice


Le singole colonne verranno elencate nello stesso ordine indicato.

Il comando Select in SQL equivale all’operazione di proiezione


dell’algebra relazionale.
FROM

In quali relazioni si trovano

FROM Relazione1,Relazione2,...

è presente in ogni interrogazione e specifica quali relazioni occorre visitare per


ottenere il risultato.

Esempio:
FROM Catalogo

significa che per estrarre le informazioni che interessano occorre prendere in


esame la relazione Catalogo.
Per selezionare dati da un’altra tabella è sufficiente modificare la clausola
FROM
WHERE

Quali proprietà devono essere soddisfatte

WHERE Condizione

La condizione è espressa sugli attributi delle relazioni specificate nella clausola


FROM.
Può non essere presente, quando non si vogliono specificare condizioni.

Esempio:

WHERE AnnoEd = 2001

significa che interessano informazioni relative ai libri editi nel 2001.


ESEMPIO - I

 Abbiamo visto che l’interrogazione

SELECT Titolo, CasaED


FROM Catalogo
WHERE AnnoEd = 2001

restituisce la relazione

contenente titolo e casa editrice dei libri editi nel 2001


ESEMPIO - II

Invece l’interrogazione
SELECT Titolo, CasaED
FROM Catalogo
restituisce la relazione

contenente titolo e casa editrice di tutti i libri presenti nel catalogo


Riassumendo…

 Riepilogando la forma generale di un interrogazione SQL è, nei casi più


semplici, la seguente:

SELECT Attributo1,Attributo2,...
FROM Relazione1,Relazione2,...
[WHERE Condizione]

 Le parole in maiuscolo sono parole riservate del linguaggio SQL, sono


fisse e specificano le clausole dell’ interrogazione; la clausola WHERE può
mancare
 Le parole in minuscolo sono variabili, e rappresentano le relazioni, gli
attributi, le condizioni che riguardano la specifica interrogazione
Persone
Persone
Nome Età Reddito
Andrea 27 21 Nome Età
Reddito
Reddito
Aldo 25 15 Andrea 27 21 21
Maria 55 42 Aldo 25 15 15
Anna 50 35
Filippo
Maria 55 30
26 42
30
Filippo 26 30
Anna 50 35
Luigi 50 40
Franco 60 20 Filippo 26 30

Olga 30 41 Luigi 50 40
Sergio 85 35 Franco 60 20
Luisa 75 87 Olga 30 41
Nome e reddito delle persone con meno di trenta anni
Sergio 85 35
PROJNome, Reddito(SELEta<30(Persone))
Luisa 75 87
SELECT Nome, Reddito
FROM Persone
WHERE Eta < 30
SELECT, abbreviazioni (alias)

SELECT Nome, Reddito SELECT p.nome as nome,


FROM Persone p.reddito as reddito
WHERE Eta < 30 FROM persone as p
WHERE p.eta < 30
Selezione, senza proiezione

 Nome, età e reddito delle persone con meno di trenta anni

SELEta<30(Persone)

SELECT *
FROM Persone
WHERE Eta < 30
Proiezione, senza selezione

 Nome e reddito di tutte le persone

PROJNome, Reddito(Persone)

SELECT Nome, Reddito


FROM Persone
Condizione complessa

SELECT *
FROM Persone
WHERE reddito > 25 and (eta < 30 or eta > 60)
EVITARE I DUPLICATI

 Si consideri la seguente interrogazione

SELECT CasaEd
FROM Catalogo

Se una casa editrice è presente nel catalogo con 1000 libri, il suo nome
comparirà 1000 volte nel risultato

 Se vogliamo evitare che ciò avvenga, scriveremo

SELECT DISTINCT CasaEd


FROM Catalogo

che ha come risultato le case editrici presenti nel catalogo, rappresentate


una sola volta
DISTINCT

 In generale la specifica DISTINCT nella clausola SELECT elimina i duplicati


dal risultato

 La forma generale di un interrogazione SQL che abbiamo visto fin qui è


quindi la seguente:

SELECT [DISTINCT] Attributo1,Attributo2,...


FROM Relazione1,Relazione2,...
[ WHERE Condizione]

dove le parti racchiuse tra parentesi quadre possono mancare


L’uso di *

 Nella clausola SELECT si può specificare * in luogo della lista di attributi; in


tal caso il risultato contiene tutti gli attributi delle relazioni specificate nella
clausola FROM.
 L’asterisco (*) di select * indica al database di fornire TUTTE le colonne
associate alla tabella
SELECT *
FROM Catalogo
WHERE CasaEd = “Feltrinelli”

 Restituisce come risultato


RIEPILOGO

Le parole SELECT e FROM consentono a una query di caricare dei


dati.

E’ possibile creare una query generica e includere tutte le colonne


con l’istruzione SELECT *. E’ anche possibile selezionare solo
alcune colonne e anche modificare l’ordine in cui devono essere
presentate.

La parola chiave DISTINCT limita l’output delle query poiché


consente di escludere i valori duplicati di una colonna.
ESPRESSIONI, CONDIZIONI E OPERATORI

Obiettivi
 ampliare la query con qualche nuovo termine
 introdurre gli operatori.

In particolare impareremo a:
 capire cos’è una espressione e come si utilizza
 capire cos’è una condizione e come si utilizza
 familiarizzare con la clausola WHERE
 imparare ad usare gli operatori aritmetici, di confronto, di caratteri,
logici e di insiemi
 conoscere altri utili operatori
ESPRESSIONI

 La definizione di espressione è semplice: un’espressione restituisce un


valore

 Nella seguente istruzione, NOME, INDIRIZZO, TELEFONO E RUBRICA sono


espressioni:
SELECT NOME, INDIRIZZO, TELEFONO, RUBRICA
FROM RUBRICA;
 NOME è

 La seguente espressione:
WHERE NOME = ‘ROSSI’
contiene una condizione di una espressione booleana. Questa condizione potrà
essere TRUE (vera) o FALSE (falsa) rispettivamente se la colonna NOME
contiene ROSSI oppure no.
CONDIZIONI - I
 Tutte le volte che si vuole trovare un particolare elemento o gruppo di
elementi in un database, occorre specificare una o più condizioni.
 Le condizioni sono introdotte dalla clausola WHERE.
 nell’esempio precedente la condizione è NOME = ‘ROSSI’. Per trovare
tutti gli impiegati che hanno lavorato più di 100 ore la condizione
potrebbe essere: NUMERODIORE > 100

 Le condizioni consentono di effettuare query selettive. Nella forma più


comune includono una variabile, una costante e un operatore di confronto.
 Variabile………………………….. NOME
 Costante…………………………..’ROSSI’
 Operatore di confronto………. >

 Per scrivere una query condizionale bisogna conoscere la clausola WHERE


e gli operatori. La condizione presente nella clausola WHERE può avere
una struttura molto complessa
CONDIZIONI - II
 In generale le condizioni sono formate combinando predicati con gli
operatori booleani and, or e not

 Predicato: è una condizione semplice del tipo E1 cfr E2 ove:


 cfr è un operatore di confronto, cioè uno degli operatori
= < > <= >= <> (diverso)
 E1 ed E2 sono espressioni, che possono essere attributi, costanti
oppure espressioni formate con gli usuali operatori aritmetici. Molto
spesso E1 è un attributo. E2 può essere un comando SELECT

 Esempi
 · AnnoEd > 1980 and CasaEd = “Feltrinelli”
 · AnnoEd = 2000 and (CasaEd = “Einaudi” or CasaEd = “Mondadori”)

 I predicati hanno valore true (vero) oppure false (falso).


TABELLA DI VERITA’

Gli operatori booleani rispettano le seguenti tabelle di verità:

true and true = true


true or true = true
not true = false

true and false = false


true or false = true
not false = true

false and false = false


false or false = false
LA CLAUSOLA WHERE

 La sintassi della clausola WHERE è la seguente:


WHERE <condizione di ricerca>
 La condizione presente nella clausola WHERE è ottenuta combinando
predicati con gli operatori booleani. Gli attributi che compaiono nei predicati
devono appartenere alle relazioni presenti nella clausola FROM
 La clausola WHERE rende selettive le query, senza questa clausola la
query visualizzerebbe tutti i record della tabella

 Consideriamo il solito schema di relazione Catalogo e una sua istanza


LA CLAUSOLA WHERE

SELECT Titolo, CasaEd


FROM Catalogo
WHERE Anno = 2001 and CasaEd = “Einaudi”

SELECT Titolo, CasaEd


FROM Catalogo
WHERE Anno = 2001 or CasaEd = “Einaudi”

SELECT Titolo, CasaEd


FROM Catalogo
WHERE Anno = 2000 and CasaEd <>
“Feltrinelli”
ESEMPIO

SELECT CasaEd, Anno


FROM Catalogo
WHERE Titolo = “L’amante” and
Anno = (SELECT max(Anno) FROM Catalogo WHERE Titolo =
“L’amante” )

 Viene dapprima calcolata la SELECT tra parentesi, ed il suo risultato viene utilizzato
per valutare la condizione; La SELECT esterna restituisce come risultato la CasaEd e
L’Anno della più recente edizione dell’ Amante presente nel Catalogo

 In questo esempio è stato fatto uso di una struttura detta SOTTOSELECT ,


o SELECT annidata. Questa ha lo scopo di estrarre dal DB un valore da
utilizzare in una espressione. Si osservi che la Sottoselect ha come risultato
un singolo valore, altrimenti il confronto non si può effettuare
GLI OPERATORI

Gli operatori sono gli elementi utilizzati all’interno delle espressioni per
specificare le condizioni necessarie a caricare i dati.
Possono essere divisi nei seguenti gruppi:
 aritmetici
 di confronto
 di caratteri
 logici
 di insieme

E’ un potente gruppo di strumenti a base della conoscenza del


linguaggio SQL
GLI OPERATORI ARITMETICI

1. + (somma) 4. * (moltiplicazione)
2. - (sottrazione) 5. % (modulo o resto)
3. / (divisione)

I primi quattro operatori si spiegano da soli.


L’operatore modulo restituisce il resto di una divisione.
Ad esempio:
5%2=1
6%2=0

Non funziona con i tipi di dati che hanno cifre decimali


GLI OPERATORI ARITMETICI

Se vengono inseriti più operatori aritmetici in una espressione senza


parentesi, essi vengono valutati nell’ordine: moltiplicazione, divisione,
modulo, somma e sottrazione.
Ad esempio:

2*6+9/3 vale 12 + 3 = 15

mentre l’espressione

2 * (6 + 9) / 3 vale 2 * 15 / 3 = 10
OPERATORI ARITMETICI: SOMMA (+)

SQL> SELECT * FROM PREZZO SQL> SELECT ELEMENTO, PREZZOINGROSSO,


PREZZOINGROSSO + 1.50 FROM PREZZO
ELEMENTO PREZZOINGROSSO ELEMENTO PREZZOINGROSSO PREZZOINGROSSO + 1.50
Pomodori 3,40 Pomodori 3,40 4,90
Patate 5,10 Patate 5,10 6,60
Banane 6,70 Banane 6,70 8,20
Rape 4,50 Rape 4,50 6,00
Arance 8,90 Arance 8,90 10,40
Mele 2,30 Mele 2,30 4,80

La terza colonna (PREZZOINGROSSO + 1,50) non si trova nella tabella


originale (in entrambi i casi sono state selezionate con il carattere * tutte le
colonne).
SQL consente di creare colonne virtuali o derivate combinando o
modificando le colonne esistenti.
OPERATORI ARITMETICI: SOMMA (+)
E’ possibile assegnare una intestazione più comprensibile alla
nuova colonna:

SQL> SELECT ELEMENTO, PREZZOINGROSSO,


(PREZZOINGROSSO + 1.50) PREZZODETTAGLIO FROM PREZZO

ELEMENTO PREZZOINGROSSO PREZZODETTAGLIO


Pomodori 3,40 4,90
Patate 5,10 6,60
Banane 6,70 8,20
Rape 4,50 6,00
Arance 8,90 10,40
Mele 2,30 3,80
OPERATORI ARITMETICI: SOTTRAZIONE (-)
L’operatore meno svolge due funzioni, la prima è quella di
cambiare segno ad un numero:
SQL> SELECT * FROM MINMAX
REGIONE TEMPMAX TEMPMIN
Piemonte -4 10
Toscana 4 13
Sicilia 10 19
Lombardia -2 9
Friuli -3 8

SQL> SELECT REGIONE, -TEMPMAX, -TEMPMIN FROM MINMAX


REGIONE TEMPMAX TEMPMIN
Piemonte 4 -10
Toscana -4 -13
Sicilia -10 -19
Lombardia 2 -9
Friuli 3 -8
OPERATORI ARITMETICI: SOTTRAZIONE (-)
La seconda (e ovvia) funzione dell’operatore meno è quella di sottrarre i valore
di una colonna da quelli di un’altra colonna.
Ad esempio

REGIONE MINIME MASSIME DIFFERENZE SQL> SELECT REGIONE,


Piemonte -4 10 14 TEMPMAX MINIME,
Toscana 4 13 9 TEMPMIN MASSIME,
Sicilia 10 19 9 (TEMPMIN - TEMPMAX) DIFFERENZA
Lombardia -2 9 11 FROM MINMAX;
Friuli -3 8 11

Oltre che aver creato la nuova colonna questa query ha corretto (solo sullo
schermo) i nomi di quelle errate.
OPERATORI ARITMETICI: DIVISIONE (/)
L’operatore divisione ha un solo significato, per vedere gli effetti di una
vendita a metà prezzo basta digitare la seguente istruzione:

SQL> SELECT ELEMENTO PRODOTTO, PREZZOINGROSSO,


(PREZZOINGROSSO/2) PREZZOVENDITA FROM PREZZO

ELEMENTO PREZZOINGROSSO PREZZOVENDITA


Pomodori 3,40 1,70
Patate 5,10 2,55
Banane 6,70 3,35
Rape 4,50 2,25
Arance 8,90 4,45
Mele 2,30 1,15
OPERATORI ARITMETICI: MOLTIPLICAZIONE (*)
Anche l’’operatore moltiplicazione è semplice da usare, ad esempio questa
query visualizza l’effetto di uno sconto del 10% sui prezzi di tutti i
prodotti:

SQL> SELECT ELEMENTO PRODOTTO, PREZZOINGROSSO,


(PREZZOINGROSSO*0.9) NUOVOPREZZO FROM PREZZO;

ELEMENTO PREZZOINGROSSO NUOVOPREZZO

Pomodori 3.40 3.06


Patate 5.10 4.59
Banane 6.70 6.03
Rape 4.50 4.05
Arance 8.90 8.01
Mele 2.30 2.07
OPERATORI ARITMETICI: MODULO (%)
L’operatore modulo restituisce il resto intero di una operazione di divisione.
Esempio:
NUMERATORE DENOMINATORE

10 5
SQL> SELECT * FROM RESTI
8 3
23 9
1024 16

E’ possibile creare una nuova colonna, RESTO, dove registrare il resto della
divisione tra NUMERATORE e DENOMINATORE

SQL> SELECT NUMERATORE, DENOMINATORE,


(NUMERATORE % DENOMINATORE) RESTO
FROM RESTI NUMERATORE DENOMINATORE RESTO

10 5 0
8 3 2
23 9 5
1024 16 0
OPERATORI DI CONFRONTO
Questi operatori confrontano le espressioni e restituiscono uno di questi
tre valori: TRUE, FALSE, Unkown. I primi due sono semplici da
spiegare, TRUE significa vero e FALSE significa falso, il terzo,
Unknow, identifica l’assenza di dati in una colonna, cioè NULL.

Molte implementazioni SQL cambiano Unknown in FALSE e forniscono un


operatore speciale, IS NULL, per verificare la condizione NULL (assenza
di dati).

SQL> SELECT * FROM PREZZO WHERE PREZZOINGROSSO = NULL;


No row selected

SQL> SELECT * FROM PREZZO WHERE PREZZOINGROSSO IS NULL;


ELEMENTO PREZZOINGROSSO
Limoni

Nel database la colonna prezzoingrosso della riga Limoni non contiene


dati (non è zero)
OPERATORI DI CONFRONTO: =
Nella clausola WHERE il segno uguale è l’operatore di confronto
più utilizzato, molto comodo per selezionare un valore tra tanti.

SQL> SELECT * FROM AMICI;


COGNOME NOME CITTA DATA DI NASCITA TELEFONO
ROSSI ALE MILANO 1/1/1970 02 3425678
BIANCHI SABY TORINO 25/5/1985 011 6707221
BROWN JO PISA 12/10/1968 050 880245
NERI ALE BOLOGNA 13/11/1986 051 6711

SQL> SELECT * FROM AMICI WHERE NOME = ‘ALE’;


COGNOME NOME CITTA DATA DI TELEFONO
NASCITA
ROSSI ALE MILANO 1/1/1970 02 3425678
NERI ALE BOLOGNA 13/11/1986 051 6711

SQL> SELECT * FROM AMICI WHERE NOME = ‘Ale’;


no row selected.
OPERATORI DI CONFRONTO: > , >=
questi operatori operano nel seguente modo modo:

SQL> SELECT * FROM PREZZO;


ELEMENTO PREZZOINGROSSO

Pomodori 3.40
Patate 5.10 SQL> SELECT * FROM PREZZO
Banane 6.70 WHERE PREZZOINGROSSO > 4.50;

Rape 4.50 ELEMENTO PREZZOINGROSSO


Arance 8.90 Patate 5.10
Mele 2.30 Banane 6.70
Arance 8.90

SQL> SELECT * FROM PREZZO


WHERE PREZZOINGROSSO >= 4.50;

ELEMENTO PREZZOINGROSSO

Patate 5.10
Banane 6.70
Rape 4.50
Arance 8.90

Non si usano apici per racchiudere il numero 4.50


OPERATORI DI CONFRONTO: <, <=
questi operatori operano in senso inverso al precedente:

SQL> SELECT * FROM AMICI;


COGNOME NOME CITTA DATA DI TELEFONO
NASCITA
ROSSI ALE MILANO 1/1/1970 02 3425678
BIANCHI SABY TORINO 25/5/1985 011 6707221
BROWN JO PISA 12/10/1968 050 880245
NERI ALE BOLOGNA 13/11/1986 051 6711

SQL> SELECT * FROM AMICI


WHERE CITTA <= ‘MILANO’ ;
COGNOME NOME CITTA DATA DI NASCITA TELEFONO
ROSSI ALE MILANO 1/1/1970 02 3425678
BROWN JO PISA 12/10/1968 050 880245
OPERATORI DI CONFRONTO: <>, !=
Operatore di disuguaglianza: consente di trovare dati escludendone altri,
cioè il simbolo (<>) oppure (!=) si legge “diverso da”.

Per trovare gli amici tranne ALE (cioè con il nome diverso da ALE):

SQL> SELECT * FROM AMICI


WHERE NOME <> ‘ALE’;

COGNOME NOME CITTA DATA DI NASCITA TELEFONO


BIANCHI SABY TORINO 25/5/1985 011 6707221
BROWN JO PISA 12/10/1968 050 880245

In molte implementazione SQL è indifferente usare la forma (<>) anzichè (!=)


OPERATORI DI CARATTERE
Consentono di manipolare il modo in cui debbono essere rappresentate le
stringhe durante la preparazione delle condizioni che selezionano i dati.

NOME POSIZIONE NUMEROPARTE


Come fare a trovare tutte
le parti che si trovano FEGATO DESTRA-ADDOME 1
nella zona dorsale del CUORE PETTO 2
corpo? Osservando la FARINGE GOLA 3
tabella è possibile
VERTEBRE CENTRO-DORSO 4
individuarne due, ma
hanno nomi differenti. INCUDINE ORECCHIO 5

RENE DORSO 6
OPERATORI DI CARATTERE: LIKE
L’operatore LIKE consente di estrarre dati che somigliano ad un certo schema

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘%DORSO%’;


NOME POSIZIONE NUMEROPARTE
VERTEBRE CENTRO-DORSO 4

RENE DORSO 6

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘DORSO%’;

NOME POSIZIONE NUMEROPARTE


RENE DORSO 6

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘%DORSO’;

NOME POSIZIONE NUMEROPARTE


VERTEBRE CENTRO-DORSO 4
OPERATORI DI CARATTERE: LIKE
NOME POSIZIONE NUMEROPARTE
Come fare a trovare tutte le parti che FEGATO DESTRA-ADDOME 1
iniziano per ‘F’? Osservando la tabella CUORE PETTO 2
è possibile individuarne due, ma FARINGE GOLA 3
hanno nomi differenti.
VERTEBRE CENTRO-DORSO 4
INCUDINE ORECCHIO 5
RENE DORSO 6

SQL> SELECT * FROM PARTI WHERE NOME LIKE ‘F%’;

NOME POSIZIONE NUMEROPARTE


FEGATO DESTRA-ADDOME 1

FARINGE GOLA 3

SQL> SELECT * FROM PARTI WHERE POSIZIONE LIKE ‘f%’;


no rows selected.

L’operatore like è sempre sensibile ai caratteri minuscoli/maiuscoli


REGOLE

 A LIKE maschera
 A NOT LIKE maschera

Controlla che il valore dell’attributo A sia o non sia conforme alla maschera.
maschera è una sequenza qualunque di caratteri che può contenere i
caratteri speciali “ - “ e “ % ”
 Una parola è conforme alla maschera se
 · I caratteri della maschera diversi da – e da % coincidono con quelli
della parola.
 · Al carattere – nella maschera corrisponde un qualunque carattere
della parola
 · Al carattere % nella maschera corrisponde una qualunque sequenza,
anche vuota, di caratteri nella parola
ESEMPIO

 ? CodiceCliente, Cognome e Nome dei Clienti il cui Codice contiene


dalla quarta posizione in avanti i caratteri MRC75

SELECT CodiceCliente, Cognome, Nome


FROM Clienti
WHERE CodF LIKE ---MRC75%

ad es. BCEMRC7548, 123MRC75, j23MRC75e6732 sono tutte parole conformi


alla maschera ---MRC75%
L’OPERATORE DI CONCATENAZIONE (||)
Il simbolo || serve a concatenare due stringhe:

COGNOME NOME CITTA PROVINCIA TELEFONO


ROSSI ALE MILANO MI 02 3425678
BIANCHI SABY TORINO TO 011 6707221
BROWN JO PISA PI 050 880245
NERI ALE BOLOGNA BO 051 6711

SQL> SELECT NOME || COGNOME NOMECOMPLETO FROM AMICI;

NOMECOMPLETO
ROSSI ALE
BIANCHI SABY
BROWN JO
NERI ALE
OPERATORI LOGICI

Negli esempi precedenti è stato effettuato sempre un controllo alla


volta. Questo metodo va bene per i casi semplici, ma come fareste a
trovare tutti quei dipendenti i cui nomi iniziano con la lettera ‘B’ e
che hanno più di 50 giorni di ferie?

Gli operatori logici separano due o più condizioni nella clausola


WHERE di un’istruzione SQL.
Essi sono:
 AND
 OR
 NOT
OPERATORI LOGICI: AND

L’operatore logico AND indica che entrambe le espressioni che si trovano ai suoi lati
devono essere soddisfatte per restituire il valore TRUE (vero). Se una solo delle
espressioni non è soddisfatta l’operatore AND restituisce FALSE.
Ad esempio, per sapere quali impiegati hanno lavorato per l’azienda per 5 anni o meno
ed hanno utilizzato più di 20 giorni di ferie, si può scrivere:

COGNOME NUMDIP ANNI FERIEGODUTE


ABITA 101 2 4
BACCHI 104 5 23
BLESSI 107 8 45
SQL> SELECT * BOLIVAR 233 4 80
FROM FERIE
BOLDI 210 15 100
WHERE ANNI <= 5
COSTALES 211 10 78
AND
FERIEGODUTE > 20;

COGNOME NUMDIP ANNI FERIEGODUTE


BACCHI 104 5 23
BOLIVAR 233 4 80
OPERATORI LOGICI: OR

L’operatore logico OR puo’ essere utilizzato per combinare una serie di condizioni. Se
una di queste è soddisfatta viene restituito TRUE

COGNOME NUMDIP ANNI FERIEGODUTE


ABITA 101 2 4
BACCHI 104 5 23
BLESSI 107 8 45
BOLIVAR 233 4 80
SQL> SELECT * BOLDI 210 15 100
FROM FERIE COSTALES 211 10 78
WHERE COGNOME LIKE ‘BO%’
OR
COGNOME LIKE ‘CO%’;

COGNOME NUMDIP ANNI FERIEGODUTE


BOLDI 210 15 100
BOLIVAR 233 4 80
COSTALES 211 10 78

L’operatore OR richiede che una soltanto delle condizioni sia vera affinchè dati possano essere
restitutiti
OPERATORI LOGICI: NOT

L’operatore logico NOT ha il compito di invertire il significato di una


condizione
COGNOME NUMDIP ANNI FERIEGODUTE
ABITA 101 2 4
BACCHI 104 5 23
BLESSI 107 8 45
BOLIVAR 233 4 80

BOLDI 210 15 100

SQL> SELECT * COSTALES 211 10 78


FROM FERIE
WHERE COGNOME NOT LIKE ‘B%’;

COGNOME NUMDIP ANNI FERIEGODUTE


ABITA 101 2 4
COSTALES 211 10 78
OPERATORI DI INSIEMI: UNION
L’operatore UNION restituisce il risultato di due query escludendo le righe
duplicate.

Esempio: quante persone diverse giocano in entrambe le squadre?

COGNOME COGNOME
ABITA ABITA
BRAVO BACCO
SQL> SELECT COGNOME FROM CALCETTO
CARLINI CARLINI
UNION
DECCA SELECT COGNOME FROM CALCIO; DINI
ESTERLE ESTERLE
COGNOME
FUNDARI FALCONI
ABITA
GIANI GIANI
BACCO
calcett calcio
o BRAVO
CARLINI
DECCA
DINI
ESTERLE A C B
FALCONI
Sono stati esclusi i doppioni FUNDARI A+B-C
GIANI
OPERATORI DI INSIEMI: UNION
L’operatore UNION ALL restituisce il risultato di due query incluse le righe
duplicate.
Esempio: quante persone giocano al calcetto e quante al calcio?
SQL> SELECT COGNOME FROM CALCETTO
UNION ALL
SELECT COGNOME FROM CALCIO; A C B
COGNOME
ABITA
COGNOME
A+B
ABITA
BRAVO
BRAVO
CARLINI
CRLINI
DECCA COGNOME
DECCA
ESTERLE ABITA
ESTERLE
FUNDARI BACCO
FUNDARI
GIANI CARLINI
GIANI
calcett DINI
o ABITA
ESTERLE
BACCO
FALCONI
CARLINI
GIANI
DINI
calcio
ESTERLE

Sono incluse tutte le righe FALCONI


GIANI
OPERATORI DI INSIEMI: INTERSECT
L’operatore INTERSECT restituisce soltanto le righe che vengono trovate in
entrambe le query
Esempio: quali persone giocano in entrambe le squadre?

SQL> SELECT COGNOME FROM CALCETTO


INTERSECT
SELECT COGNOME FROM CALCIO;

calcett A C B calcio
o
COGNOME COGNOME
ABITA ABITA
BRAVO BACCO
CARLINI CARLINI
COGNOME
DECCA DINI
ABITA
ESTERLE ESTERLE
CRLINI
FUNDARI FALCONI
ESTERLE
GIANI GIANI
GIANI

Sono inclusi solo le righe comuni


OPERATORI DI INSIEMI: MINUS
L’operatore MINUS restituisce le righe della prima query che non sono
presenti nella seconda

Esempio: quali persone giocano solo al calcetto?

SQL> SELECT COGNOME FROM CALCETTO


MINUS
SELECT COGNOME FROM CALCIO;

COGNOME COGNOME
ABITA COGNOME ABITA
BRAVO BACCCO BACCO
CARLINI DINI CARLINI
DECCA FALCONI DINI
ESTERLE ESTERLE
FUNDARI FALCONI
A C B
GIANI GIANI
calcett A-C calcio
o

Seleziona quelli che giocano solo al calcetto


Gestione dei valori nulli
Impiegati

Matricola Cognome Filiale Età


7309
5998 Rossi
Neri Roma
Milano 32
45
5998
9553 Neri
Bruni Milano
Milano 45
NULL
9553 Bruni Milano NULL

 Gli impiegati la cui età è o potrebbe essere maggiore di 40

SEL Età > 40 OR Età IS NULL (Impiegati)

select *
from impiegati
where eta > 40 or eta is null
Interrogazioni su più relazioni

 Nella clausola FROM possono essere presenti più relazioni. Ciò è


necessario quando le informazioni per eseguire l’interrogazione sono
distribuite su relazioni diverse, vale a dire: quando gli attributi presenti nella
clausola SELECT o nella clausola WHERE appartengono a relazioni
diverse

 Si consideri il seguente schema relazionale


Film(CodFilm,Titolo,Regista,Anno)
Attori(CodFilm*, Attore)
e supponiamo di volere i titoli dei film in cui recita C. Eastwood. L’attributo
Titolo è nella relazione Film mentre l’attributo Attore è nella relazione Attori.
Occorre pertanto visitare entrambe le relazioni
ESEMPIO - I
.Supponiamo di avere le seguenti istanze di relazione:
ESEMPIO - II

 Il DBMS esegue la seguente procedura:


 Viene costruita una relazione concatenando le ennuple di Film e di
Attori che sono in associazione (tali che CodFilm=CodFilm*)

 Vengono prese in considerazione solo le ennuple in cui l’attributo Attore


ha valore C.Eastwood.
ESEMPIO - III

Viene prelevato l’attributo Titolo

Questa interrogazione in SQL si scrive:


SELECT Titolo
FROM Film, Attori
WHERE Film.CodFilm = Attori.CodFilm
and Attore = “C.Eastwood”

dove Film.CodFilm ed Attori.CodFilm rappresentano il valore di CodFilm nella


relazione Film e nella relazione Attori rispettivamente.

La condizione Film.CodFilm = Attori.CodFilm serve ad esprimere il


collegamento tra le ennuple di Film e quelle di Attori. Solo in questo modo
C.Eastwood sarà associato ad un film in cui recita.
ESEMPIO - IV
 Per motivi di chiarezza e per evitare ambiguità, è opportuno specificare, per
ogni attributo, la relazione cui appartiene , con la notazione
Relazione.Attributo. Pertanto l’interogazione precedente diventa

SELECT Film.Titolo
FROM Film, Attori
WHERE Film.CodFilm = Attori.CodFilm
and Attori.Attore = “C.Eastwood”

 Per motivi di brevità è opportuno assegnare nella clausola FROM un nome


abbreviato alle relazioni, da utilizzare nelle altre clausole dell’interrogazione:

SELECT F.Titolo
FROM Film F, Attori A
WHERE F.CodFilm = A.CodFilm
and A.Attore = “C.Eastwood”
JOIN

 Sottolineiamo il fatto che fra le due relazioni deve esistere un collegamento


(una chiave esterna in una relazione, chiave primaria nell’altra), e che nella
clausola WHERE dell’interrogazione deve essere esplicitato tale
collegamento. Osserviamo che nella clausola FROM può essere presente
un qualunque numero di relazioni, purché queste siano collegate tra di loro,
e nella clausola WHERE siano specificati tutti i collegamenti.

 L’operazione che associa le ennuple di due relazioni (ad es. le ennuple di


Film con quelle di Attori) è quella di join, e la condizione di eguaglianza tra
la chiave esterna di una relazione e la chiave primaria di un’altra (ad es
Film.CodFilm = Attori.CodFilm) è detto predicato di join.
SQL e algebra relazionale

 R1(A1,A2) R2(A3,A4)

select R1.A1, R2.A4


from R1, R2
where R1.A2 = R2.A3

 prodotto cartesiano (FROM)


 selezione (WHERE)
 proiezione (SELECT)

 PROJ A1,A4 (SELA2=A3 (R1 JOIN R2))


ESEMPIO DIFFICILE

 Si consideri lo schema relazionale:


FILM(CodiceDVD, Titolo, Regista, Anno)
ATTORI(Nome, Nazionalità)
RECITA(CodiceDVD*, Nome*, Personaggio)
DVD(Collocazione, CodiceDVD*, DataNoleg, CodiceCliente*)
CLIENTI(CodiceCliente, Cognome, Nome, Indirizzo, Telefono)

e si voglia estrarre Cognome e Nome dei Clienti che hanno noleggiato dvd
relativi a film in cui recitano attori francesi
ESEMPIO DIFFICILE
Cognome e Nome sono attributi della relazione Clienti.

Clienti è collegata a DVD tramite CodiceCliente,

DVD è collegata a Film tramite CodiceDVD, Film è collegato a Recita tramite CodiceDVD, ed infine Recita è
collegato con Attori tramite Nome; finalmente in Attori troviamo l’attributo Nazionalità, e possiamo quindi
verificare la condizione di ricerca.

In SQL tale interrogazione è piuttosto fastidiosa da scrivere:

SELECT Cl.Cognome, Cl.Nome


FROM Clienti Cl, DVD D, Film F, Recita R, Attori A
WHERE Cl.CodiceCliente = D.CodiceCliente
and D.CodiceDVD = F.CodiceDVD
and F.CodiceDVD = R.CodiceDVD
and R.Nome = A.Nome
and A.Nazionalità = “francese”
ESEMPIO DIFFICILE

 Può essere utile, per individuare le relazioni da specificare nella clausola


FROM, considerare lo schema E-R rappresentato dallo schema relazionale:
da tale schema risulta evidente che per collegare Clienti con Attori occorre
attraversare tutte le classi intermedie.

Dvd

164
Persone
Maternità Madre Figlio

Luisa Maria Nome Età Reddito

Luisa Luigi Andrea 27 21

Anna Olga Aldo 25 15

Anna Filippo Maria 55 42

Maria Andrea Anna 50 35

Maria Aldo Filippo 26 30


Luigi 50 40
Paternità Padre Figlio
Franco 60 20
Sergio Franco
Olga 30 41
Luigi Olga
Sergio 85 35
Luigi Filippo
Luisa 75 87
Franco Andrea

Franco Aldo
ALTRI ESEMPI - Selezione, proiezione e join
 I padri di ogni persona

PROJPadre(paternita JOIN Figlio =Nome persone)

 Il nome e l‘età dei figli di Luisa


PROJNome, eta(
SELMADRE=„Luisa“ (maternita)
JOIN Figlio =Nome

SELECT distinct padre


persone
)

FROM persone, paternita


WHERE figlio = nome

SELECT distinct padre


FROM persone, paternita
WHERE figlio = nome and madre=‚Luisa‘
Funzioni di aggregazione

 SQL consente di estrarre dalla Base di Dati informazioni che non sono
esplicitamente presenti, ma si ottengono da quelle presenti utilizzando
opportune funzioni dette funzioni di aggregazione.

Studenti (Matricola, Nome, CorsodiLaurea)


Esami (Matricola*, CodiceAF*, Voto)
AttivitàFormativa(CodiceAF, NomeAF, CFU)

 Le funzioni di aggregazione consentono di estrarre dal DB informazioni quali


il numero di esami sostenuti da un determinato studente, il numero di
studenti che hanno sostenuto un determinato esame, valori medi, massimi,
minimi ecc.
COUNT
 ? Numero di esami sostenuti dallo studente con Matricola 123
SELECT Count(*)
FROM Esami
WHERE Matricola=123

Count(*) indica un conteggio: vengono contate le ennuple (ricordiamo che *


indica l’intera ennupla) di Esami che soddisfano alla condizione
Matricola=123. Restituisce il numero di righe che soddisfano la condizione
specificata nella clausola WHERE

 Al risultato di una funzione di aggregazione può essere dato un nome


tramite il costrutto as:
SELECT Count(*) as Numero_Esami_AA252
FROM Esami E
WHERE CodiceMateria=AA252
SUM

 ? Numero di crediti acquisiti dallo studente con Matricola 123


SELECT Sum(CFU) as Crediti_di_123
FROM Esami E, AttivitàFormative A
WHERE E.CodiceAF = A.CodiceAF
and E.Matricola=123
 Sum(CFU) indica l’ordinaria somma aritmetica dei valori (che devono
essere numerici) dell’attributo CFU. Consideriamo la seguente istanza del
DB
SUM

 Il join E.CodiceAF = A.CodiceAF da luogo alla seguente relazione

 La condizione E.Matricola=123 da luogo alla seguente relazione


SUM

 La funzione Sum esegue la somma dei valori dell’attributo CFU e si ottiene il


risultato desiderato

 L’uso delle funzioni di aggregazione è limitato al caso in cui il risultato sia


costituito da un solo valore; non possono cioè essere presenti allo stesso tempo
nella clausola SELECT sia attributi che funzioni di aggregazione. La seguente
interrogazione, ad es. è sbagliata (del resto avrebbe poco senso)

SELECT Voto, Count(*)


FROM Esami
WHERE Matricola=123
MAX e MIN

 ? Il voto più basso dello studente con Matricola 123


SELECT Min(Voto)
FROM Esami
WHERE Matricola=123

 Il voto più alto dello studente con Matricola 123


SELECT Max(Voto)
FROM Esami
WHERE Matricola=123

 La funzione MAX (MIN) serve a trovare il valore massimo (€minimo) di una


colonna.
Riassumendo

 Le funzioni di aggregazione previste da SQL sono:


 avg media aritmetica (valori numerici)
 count numero di valori
 max valore massimo
 min valore minimo
 sum somma (valori numerici)

 Min e Max, quando sono applicati a valori non numerici, danno


rispettivamente il primo e l’ultimo valore nell’ordine alfabetico.
ORDER BY

La clausola ORDER BY, specificata dopo SELECT FROM WHERE fa sì che il


risultato sia ordinato; si può scegliere fra ordinamento crescente (se non si
specifica nulla), o decrescente (se si specifica desc).

L’ordinamento può essere fatto anche su più attributi.

Nome e reddito delle persone con meno di trenta anni in ordine alfabetico

select nome, reddito


from persone
where eta < 30
order by nome
select nome, reddito select nome, reddito
from persone from persone
where eta < 30 where eta < 30
order by nome

Persone Persone

Nome Reddito Nome Reddito


Andrea 21 Aldo 15
Aldo 15 Andrea 21
Filippo 30 Filippo 30
NULL

 A IS NULL , A IS NOT NULL


 controlla che l’ attributo A abbia o non abbia valore nullo

 ? La collocazione dei dvd non noleggiati


SELECT Collocazione
FROM DVD
WHERE CodiceCliente is null

 ? La collocazione dei dvd noleggiati dopo il 1/1/08


SELECT Collocazione
FROM DVD
WHERE DataNoleg is not null and DataNoleg > 1/1/05

L’uso del predicato is [not] null è l’unico modo per stabilire se una dvd è o non è
noleggiat0.
Sistemi per il recupero delle informazioni

ESERCIZI
ESERCIZIO 1

 Nell’ esercizio che segue sono dati degli schemi di Basi di Dati
relazionali, e delle richieste di informazioni da estrarre dalle Basi di
Dati.

 Esprimere tali richieste con interrogazioni SQL.

 SCHEMA RELAZIONALE:

ATTORI (CodAttore, Nome, AnnoNascita, Nazionalità);


RECITA (CodAttore*, CodFilm*)
FILM (CodFilm, Titolo, AnnoProduzione, Nazionalità, Regista, Genere)
PROIEZIONI (CodProiezione, CodFilm*, CodSala*, Incasso, DataProiezione)
SALE (CodSala, Posti, Nome, Città)
ESERCIZIO 1

 Scrivere le interrogazioni SQL che restituiscono le seguenti


informazioni:
1- Il nome di tutte le sale di Verona
2- Il titolo dei film di F. Fellini prodotti dopo il 1960.
3- Il titolo e la durata dei film di fantascienza giapponesi o francesi prodotti
dopo il 1990
4- I titolo dei film dello stesso regista di “Casablanca”
5- Il titolo ed il genere dei film proiettati il giorno di Natale 2004
6- Il titolo dei film in cui recita M. Mastroianni oppure S.Loren
7- Il numero di sale di Messina con più di 60 posti
ESERCIZIO 1

1- Il nome di tutte le sale di Verona


SELECT s.Nome FROM Sale s WHERE s.Città = 'Pisa‘

2- Il titolo dei film di F. Fellini prodotti dopo il 1960.


SELECT f.Titolo FROM Film f WHERE f.Regista = “Fellini” AND
f.AnnoProduzione > 1960

3- Il titolo e la durata dei film di fantascienza giapponesi o francesi prodotti


dopo il 1990
SELECT f.Titolo, f.Durata FROM Film f WHERE f.Genere=”Fantascienza”
and ((f.Nazionalità=”Giapponese” or f.Nazionalità=”Francese”) and
f.AnnoProduzione >1990
ESERCIZIO 1
4- I titolo dei film dello stesso regista di “Casablanca”
SELECT f.Titolo FROM Film f
WHERE f.Regista = (SELECT f.Regista FROM Film f WHERE f.Titolo =
“Casablanca”)

5- Il titolo ed il genere dei film proiettati il giorno di Natale 2004


SELECT DISTINCT f.Titolo, f.Genere FROM Film f, Proiezioni p
WHERE p DataProiezione =25/12/04 and f.CodFilm=p.CodFilm

6- Il titolo dei film in cui recita M. Mastroianni oppure S.Loren


SELECT DISTINCT f.Titolo FROM Film f, Recita r, Attore a
WHERE (a.Nome = “M.Mastrianni” OR a.Nome = ”S.Loren”)
AND f.CodFilm = r.CodFilm AND r.CodAttore = a.CodAttore

7- Il numero di sale di Messina con più di 60 posti


SELECT count(*) FROM Sale s
WHERE s.Città = “Messina” and s.Posti > 60
ESERCIZIO 2

 SCHEMA RELAZIONALE:

ROMANZI(CodiceR, Titolo, NomeAut*, Anno)


PERSONAGGI(NomeP, CodiceR*, sesso, ruolo)
AUTORI(NomeAut, AnnoN, AnnoM:optional, Nazione)
FILM(CodiceF, Titolo, Regista, Produttore, Anno, CodiceR*)
ESERCIZIO 2

 1- Il titolo dei romanzi del 19° secolo


 2- Il titolo, l’autore e l’anno di pubblicazione dei romanzi di autori russi,
ordinati per autore e, per
 lo stesso autore, ordinati per anno di pubblicazione
 3- I personaggi principali (ruolo =”P”) dei romanzi di autori viventi.
 4. I romanzi dai quali è stato tratto un film con lo stesso titolo del romanzo
 5- Il titolo, il regista e l’anno dei film tratti dal romanzo “Robin Hood”
 6- Per ogni autore italiano, l’anno del primo e dell’ultimo romanzo.
ESERCIZIO 3

 SCHEMA RELAZIONALE:

STUDENTI (Matricola, NomeS, CorsoLaurea*, AnnoN)


CORSIDILAUREA (CorsoLaurea, TipoLaurea, Facoltà)
FREQUENTA (Matricola*, CodCorso*)
CORSI (CodCorso, NomeCorso, CodDocente*)
DOCENTI (CodDocente, NomeD, Dipartimento)
ESERCIZIO 3

1- Il nome e l’anno di nascita degli studenti iscritti a Editoria e Giornalismo, in


ordine rispetto al nome
2- Matricola e nome degli studenti di un corso di laurea triennale (tipoLaurea =
'L') che seguono un corso di un docente di nome Anna.
3- Per ogni tipo di laurea, il tipoLaurea e l’età media degli studenti
4- Il codice dei corsi frequentati da più di 5 studenti e tenuti da docenti del
Dipartimento di Informatica
5- Per ogni studente della Facoltà di Lettere e Filisofia, la matricola ed il
numero di corsi seguiti
6- Matricola e nome degli studenti che non frequentano nessun corso
7- Nome e CodDocente dei docenti che insegnano qualche corso seguito da
più di 5 studenti
Esercizi

Dato il seguente schema:

AEREOPORTO(Città, Nazione, NumPiste)

VOLO(IdVolo, GiornoSett, CittaPart, OraPart, CittaArr, OraArr, TipoAereo)

AEREO(TipoAereo, NumPasseggeri, QtaMerci)

In SQL:
1. Creare il Database
2. Città con un aereoporto di cui non è noto il numero di piste
3. Città e orario di partenza dei voli del lunedì
4. Nazione e numero piste dell’aereoporto da cui parte il volo con
IdVolo=‘A001’
2 – Città con un aeroporto di cui non è noto il numero di piste
SELECT Citta FROM Aereoporto WHERE NumPiste IS NULL

3 – Città e Orario di partenza dei voli del Lunedì


SELECT CittaPart, OraPart FROM Volo WHERE GiornoSett=‘LUN’

4 – Nazione e Numero di piste dell’aeroporto da cui parte il volo con


IdVolo=‘A001’
SELECT Aeroporto.nazione, Aereoporto.NumPiste FROM Aeroporto, Volo
WHERE Aeroporto.citta=Volo.cittapart AND Volo.IdVolo=‘A001’
ALTRI ESERCIZI

1. Città di partenza, orario di partenza, città di arrivo, orario di


arrivo degli aerei con merci>1000
2. Il tipo di aereo e il numero dei passeggeri dei voli che
arrivano a Torino
3. Il numero dei voli che partono il venerdì da Francoforte
4. La quantità dei voli che partono da ogni città
5. Le città, numero dei voli in arrivo, nazione, avente numero di
volo in arrivo maggiore di 10
6. Il numero dei voli internazionali che partono il lunedì da
Torino

Potrebbero piacerti anche