Database
Idoneità Informatica, CdS Economia e Commercio
- questi lucidi, a cura del Dott. Giulio Pellitta, non
sostituiscono il libro di testo;
- si prega di segnalare eventuali errori a
[email protected]
Database
Sommario
- Introduzione
- Tabelle e chiave primaria
- Query
- Calcoli ed alias
- Ordinamento
Database
Introduzione
- Un database è un archivio strutturato di dati che
può essere manipolato con dei comandi nel
linguaggio SQL, Structured Query Language
- I programmi per la gestione dei database si
chiamato RDMS, Relational Database Manager
Systems
Database
Introduzione
- Base di Open Office o LibreOffice
- Access di Microsoft Office
- Diversi formati di file (odb, mdb, mdbx)
- Per praticità ci riferiremo solitamente a Base
- NB: Base per funzionare ha bisogno di Java
Database
Tabelle e chiave primaria
- Un database è costituito di una o più tabelle,
ciascuna composta di uno o più campi, ognuno
con un certo nome ed un tipo prefissato
- Un elemento contenuto in una tabella (una riga)
si chiama record
Database
Tabelle e chiave primaria
- Per poter accedere ai singoli record di una
tabella è necessario impostare per quella tabella
quali campi costituiscono la chiave primaria
- Un valore di chiave primaria identifica al più un
elemento di una tabella, non ci possono essere
due o più elementi con la stessa chiave primaria
Database
Tabelle e chiave primaria
- Ad esempio, possiamo immaginare di avere un
database con una tabella “studenti”, composta di
tre campi di tipo testo: “matricola”, “nome”,
“cognome”: la matricola identifica un unico
studente e quindi può funzionare da chiave
primaria
- La chiave può mancare, ma è raro. Se mancano
campi da usare come chiave si può aggiungere
un campo detto chiave surrogata, poi vediamo.
Database
Tabelle e chiave primaria
- Una tabella si può indicare con l'elenco dei suoi
campi. Quelli sottolineati sono in chiave. Es.
studenti(matricola,nome,cognome)
- Le virgolette doppie “ e ” si usano per delimitare
nomi di campi o tabelle
- Sono utili ad esempio nel caso in cui un nome
contenga uno spazio, come “Nome persona”,
altrimenti possono essere omesse
Database
Tabelle e chiave primaria
- Non vanno confuse invece con gli apici o
virgolette singole ' e ', che delimitano dei valori
- Ad esempio il campo “nome” della tabella
“studenti” potrebbe essere uguale a 'Gianni'
- A differenza delle doppie virgolette vanno messe
sempre!
Database
Tabelle e chiave primaria
Q1. Pensando ai fogli di calcolo, la chiave
primaria svolge il ruolo di che cosa?
a) Formule
b)
Indirizzi
c)
Funzioni
Database
Query
- Le tabelle vengono manipolate (create, lette,
modificate, cancellate) tramite dei comandi
chiamati query
- Ci concentreremo sul comando SELECT per la
lettura delle tabelle
Database
Query
- SQL non è un linguaggio case sensitive, ma
preferiremo indicare i comandi in maiuscolo
- Nel caso del comando SELECT, la sintassi da
utilizzare è SELECT campo1, campo2, … FROM
nometabella
- Alcuni DB richiedono di terminare la query con ;
Database
Query
- Quella che abbiamo appena visto è una
proiezione, cioè prendiamo alcuni dei campi di
una tabella
- Possiamo prenderli tutti con la seguente sintassi
SELECT * FROM nometabella;
Database
Query
- Possiamo anche imporre delle condizioni ai
record che ci interessano tramite la clausola
WHERE, in questo caso parliamo di selezione
- Ad esempio SELECT * FROM studenti WHERE
“nome”='Gianni'
- Gli operatori logici di confronto sono gli stessi
del foglio elettronico. Si compongono con gli
operatori OR, AND e NOT.
Database
Calcoli ed alias
- Il comando SELECT può anche fare dei calcoli a
partire dai dati contenuti nel database.
- Supponendo di avere una tabella temperature
con campi “luogo” e “tempC” (temperatura in gradi
Celsius) possiamo calcolare le temperature Kelvin
equivalenti con
SELECT luogo, tempC+273 FROM temperature
Database
Calcoli ed alias
ES1. Scrivere una query per convertire le
temperature da Celsius a Fahrenheit.
Database
Calcoli ed alias
- Quando si usa SELECT per dei calcoli si può
assegnare un nome (alias) al campo
corrispondente tramite l'operatore AS (si può
omettere)
- Riprendendo l'esempio precedente:
SELECT luogo, tempC+273 AS tempK FROM
temperature
Database
Calcoli ed alias
- Si può anche usare AS per avere un nome più
semplice da utlizzare (specie se compare più
volte nella query).
- SELECT nome N FROM studenti WHERE
N='Gianni' OR N='Pino' OR N='Andrea'
Database
Ordinamento
- Possiamo ordinare i nostri dati rispetto a uno o
più campi, in maniera crescente (predefinito) o
decrescente usando l'operatore ORDER BY
campo1 ASC|DESC, campo2 ASC|DESC, …
- Es.: SELECT * FROM temperature ORDER BY
tempC, oppure SELECT * FROM temperature
ORDER BY luogo ASC, tempC DESC
Database
Ordinamento
Es. ? Data la tabella
studenti(matricola,nome,cognome), scrivere
l'elenco degli studenti in ordine alfabetico rispetto
al cognome, e rispetto al nome in caso di stesso
cognome.
Database
Progettazione di un database
- In un database c'è una marcata distinzione tra i
valori in esso contenuti e le operazioni che si
effettuano su di essi.
- Rispetto ad un semplice foglio di calcolo c'è un
cambio di prospettiva significativo.
Database
Progettazione di un database
- Progettare bene un database richiede che i dati
tenendo conto di come andranno usati.
- Le tabelle in esso contenute in generale non
sono le stesse che avremmo in un foglio di
calcolo, ma sono studiate per essere utilizzate
con le query.
- Saremo comunque in grado di ottenere un
risultato leggibile tramite le query stesse.
Database
Progettazione di un database
- Uno dei principi fondamentali che si segue nella
progettazione di un database è di evitare la
ridondanza dei dati, ogni informazione deve
essere presente una e una sola volta.
- Questo per evitare problemi di coerenza e
risparmiare spazio.
Database
Progettazione di un database
- Supponete di dover compilare dei moduli,
dovrete ripete più volte le stesse informazioni
(nome, cognome, codice fiscale, email, …).
- Inoltre potreste accidentalmente inserire gli
stessi dati in maniera diversa in punti diversi.
- Con i database si vogliono evitare situazioni
simili.
Database
Progettazione di un database
- Questi problemi si possono verificare nel
momento in cui il database è costituito di più
tabelle, e particolarmente se le tabelle
contengono dati tra loro correlati e che verranno
utilizzati assieme tramite delle query.
- Vedremo meglio più avanti.
Database
Progettazione di un database
- Quando un database contiene più tabelle queste
sono indipendenti tra di loro, in particolare
possono contenere campi con lo stesso nome.
- In questi casi per riferirsi ad un campo si
aggiunge il nome della tabella, ad esempio
“persone”.”nome” o “animali”.”nome”.
Database
Progettazione di un database
E1. Supponiamo di voler usare un database per
memorizzare l'elenco di libri in vendita presso una
libreria, includendo le informazioni su “titolo”,
“autore” e “prezzo”.
Creare una tabella per i libri. Che tipi vanno
utilizzati e quali campi impostare come chiave
primaria?
Database
Progettazione di un database
- Nell'esercizio precedente, ragionevolmente
avete impostato i campi titolo ed autore come
testo e il campo prezzo come decimale (potreste
aver anche specificato che vogliamo due cifre
decimali).
- Dovreste inoltre aver impostato tutti i campi
come chiave primaria.
Database
Progettazione di un database
- Premesso questo, cosa c'è che non va in questo
modo di procedere?
- Alcuni dati saranno ripetuti, ad esempio ci
saranno autori relativi a più libri oppure più
edizioni dello stesso libro.
Database
Progettazione di un database
- Come anticipato questo crea problemi di
coerenza ('Umberto Eco', 'Eco Umberto', 'U. Eco').
- Inoltre sprechiamo spazio per scrivere più volte
gli stessi valori (nel 2007 è uscito un libro di
Davide Ciliberti il cui titolo è lungo 1433 caratteri).
Database
Progettazione di un database
- Evitare quanto sopra dovremo suddividere
l'informazione sui libri in più tabelle.
- Poi ricomporremo i dati tramite un'operazione
chiamata JOIN.
Database
Progettazione di un database
E2. Creare una tabella “autori” e una tabella “titoli”
usando un codice numerico come chiave
primaria. Nella tabella autori usare campi distinti
per nome e cognome.
Database
Progettazione di un database
- Nell'esercizio precedente dovreste aver creato
due tabelle con campi “codice”, “nome”,
“cognome” e “codice”, “titolo”.
- Dovreste aver imposto i due campi “codice”
come campi interi che si auto-incrementano, in
modo da poterli usare come chiave primaria.
- I campi codice (ID o simili) che abbiamo
aggiunto si chiamano a volte chiavi surrogate.
Database
Progettazione di un database
- Come utilizzare le tabelle autori e titoli
Riprendiamo la tabella libri e modifichiamo i campi
autore e titolo in modo che contengano un dato di
tipo numerico.
- In tal modo le due tabelle autori e titoli
conterranno dei dati a cui la tabella libri potrà far
riferimento.
Database
Progettazione di un database
- Tra le tabelle c'è dunque una relazione di tipo
gerarchico.
- Si dice che la tabella libri è la tabella figlia, le
tabelle autori e titoli sono tabelle padre.
Database
Join
- Siamo ora quasi pronti ad introdurre il Join. Per
effettuare una query su più tabelle si utilizza la
seguente sintassi.
SELECT campo1, campo2, … FROM tabella1,
tabella2, … [WHERE …]
- Supponiamo in un primo tempo di omettere la
clausola WHERE, che risultato viene?
Database
Join
- Quando si utilizzano campi di più tabelle
vengono combinati i valori delle varie tabelle in un
prodotto cartesiano.
- Ad esempio, SELECT * FROM libri, autori
prende tutti i record della tabella libri combinati in
ogni modo possibile con i record della tabella
autori.
Database
Join
- La query dunque produrrà una tabella molto
grande, dove però la maggior parte delle righe
non hanno senso.
- Dunque è necessario selezionare i risultati
significativi con una clausola WHERE tenendo
presente la relazione tra le tabelle.
Database
Join
- Il Join, dunque, è dato da un prodotto
cartesiano seguito da una selezione.
Database
Join
E3. Scrivere una query per fare il join della tabella
libri con le tabelle titoli ed autori.
Database
Join
Q1. Dire se le query seguenti producono lo stesso
risultato o meno, e motivare la risposta.
SELECT * FROM libri, autori
SELECT * FROM autori, libri
Database
Join
E4. Creare un database con tabelle “lavoratori” e
“aziende”, la prima con campi “nome” e “azienda”,
la seconda con campi “nome” e “luogo”.
Scrivere una query per fare un elenco dei
lavoratori completo del luogo di lavoro.
Database
Valore NULL
- Nella scorsa lezione abbiamo già visto che in
una tabella uno o più campi devono essere
impostati come chiave primaria per poter
manipolare la tabella tramite query.
- La chiave primaria identifica un record di una
tabella, ed è quindi un insieme di campi unico i cui
elementi non possono essere NULL.
Database
Valore NULL
- NULL è un valore speciale, corrisponde ad un
campo vuoto. Serve a gestire dati parzialmente
completi.
- Per chiederci se un campo di una tabella è vuoto
utilizziamo la sintassi seguente.
SELECT * FROM tabella WHERE campo IS
NULL
Database
Valore NULL
- Attenzione, abbiamo utilizzato l'operatore IS
NULL piuttosto che dire =NULL, perché tutti i
confronti con il valore NULL risultano falsi.
Database
Valore NULL
Q2. Qual è il risultato di questa query?
SELECT * FROM tabella WHERE campo=NULL
Database
Valore NULL
E5. Scrivere una query per trovare tutti i libri il cui
autore nel campo cognome non ha il valore 'Eco'.
Database
Operatori aggregati
- Abbiamo visto come si può utilizzare una
SELECT per fare delle operazioni su un dato di
una tabella del database.
- Per lavorare su più dati assieme si usano gli
operatori aggregati.
Database
Operatori aggregati
- Consideriamo ad esempio la query seguente
SELECT SUM(stipendio) FROM lavoratori
- Prima vengono trovati tutti i valori del campo
stipendio, poi una volta ottenuta la colonna con
questi valori ci si applica l'operatore SUM.
Database
Operatori aggregati
- Cosa succede in presenza di valori NULL?
- Quei valori vengono scartati, quindi l'esempio
precedente somma solo i valori non NULL del
campo stipendio.
Database
Operatori aggregati
- Altro operatore aggregato è COUNT(campo),
che conta il numero di valori (non nulli, per quanto
appena detto) del suo argomento.
- Si può anche utilizzare per contare i valori
diversi usandolo in combinazione con l'operatore
DISTINCT, cioè COUNT(DISTINCT campo).
Database
Operatori aggregati
- COUNT(*) può essere utilizzato per contare tutte
le righe di una tabella.
- DISTINCT si può usare anche non in
combinazione con altri operatori aggregati, ad
esempio SELECT DISTINCT nome FROM
persone
Database
Operatori aggregati
E6. Aggiungere alla tabella lavoratori la distanza
del domicilio dal luogo di lavoro. Scrivere una
query per calcolare la distanza media usando
l'operatore aggregato AVG().
Database
Operatori aggregati
- Gli operatori aggregati si usano anche assieme
ad una selezione. Ad esempio per sapere quanti
autori si chiamano 'Umberto' scriviamo SELECT
COUNT(*) FROM autori WHERE nome='Umberto'
- Possiamo anche chiedere quanti sono gli autori,
raggruppati per i vari nomi, con il comando
SELECT COUNT(*) FROM autori GROUP BY
nome, che è un esempio di query raggruppata.
Database
Stringhe
- SQL ha varie funzioni per manipolare le stringhe.
- Il caso più semplice è la concatenazione, che si
fa tramite la funzione CONCAT(,) (o talvolta con
l'operatore ||).
- Es: SELECT CONCAT(CONCAT(FirstName,' '),
LastName) “Full Name” FROM employee
Oppure
SELECT FirstName||' '||LastName AS “Full Name”
FROM employee
Database
Stringhe
- Viceversa si possono anche considerare delle
sotto-stringhe.
sotto-stringhe
- Es. per sapere gli studenti col Cognome che
inizia per 'Ta' si potrebbe scrivere
SELECT * FROM studenti WHERE
LEFT(Cognome, 1)='Ta'
Database
Stringhe
- Viceversa si possono anche considerare delle
sotto-stringhe.
sotto-stringhe
- Es. per sapere gli studenti col Cognome che
inizia per 'Ta' si potrebbe scrivere
SELECT * FROM studenti WHERE
LEFT(Cognome, 1)='Ta'
- LEFT prende un certo numero di caratteri da
l'inizio di una stringa. RIGHT( , ) parte dalla fine.
Database
Stringhe
- Altra possibilità è prendere una sotto-stringa nel
mezzo. In tal caso bisogna specificare la stringa
di partenza, la posizione del carattere iniziale e
quanti caratteri prendere.
- La funzione si chiama MID( , , ) oppure
SUBSTRING( , , ).