1. Management Analytics
Excel e Basi Dati
Giovanni Della Lunga
giovanni.dellalunga@gmail.com
MASTER BIG DATA, ANALYTICS AND TECHNOLOGIES FOR MANAGEMENT
3. Di cosa stiamo parlando?
3
The Web
Relational
Databases
Automated Data
Acquisition using VBA
Data
Models
Non Relational
Databases
Mongo Query Json file
4. Nozioni di base
»Un database è un insieme integrato di informazioni omogenee, che
fornisce una serie di strumenti, come tabelle, query, maschere e
report, per la catalogazione, l’ordinamento e la ricerca dei dati.
»Prima di entrare nel vivo della presentazione è necessario introdurre i
termini più importanti che è indispensabile conoscere per affrontare
la gestione dei database…
5. Nozioni di base
» Gli elementi costitutivi di un database sono i seguenti :
» I campi : un campo è uno spazio nel database che contiene un’unità
d’informazione, come un nome, un numero di telefono, una data. Quando si crea
un database è necessario includere un campo per ogni categoria di dati a cui si è
interessati.
» I record : un record è costituito da un insieme di campi riferiti ad un singolo
soggetto. In un database che raccoglie i dati dei clienti, per esempio, tutte le
informazioni relative a uno stesso cliente sono registrate in un record.
» Le tabelle : una tabella è un elenco che visualizza più record
contemporaneamente. Più precisamente, ogni riga di una tabella di un database è
costituita da un record, ognuno dei quali è suddiviso in vari campi che
costituiscono le colonne.
6. Nozioni di base
»Il database può essere pensato come una serie di tabelle, ognuna
delle quali contiene informazioni omogenee.
»In un database relazionale i dati non sono memorizzati in un’unica
grande tabella, ma in più tabelle tutte in relazione tra loro, tanto che
le informazioni di diverse tabelle possono essere unite ed è possibile
eseguire ricerche in più tabelle contemporaneamente.
Definizione : un database relazionale è un database in grado di gestire più
tabelle correlate ed estrarre informazioni da più tabelle
contemporaneamente.
8. Excel Data Retrival
»In generale possiamo recuperare dati nelle diverse forme, utilizzando
diverse tecniche. In queste lezioni approfondiremo l’utilizzo dei
seguenti approcci:
•ADO, RecordSets (rs), and SQL statements
•HTTP Request
•Usare MongoDB
8
10. Che cos’è ADO
» ADO è l'interfaccia piu' usata per accedere ai
database sotto Windows, non solo mediante ASP,
ma anche mediante Visual Basic, C/C++ ed altri
ambienti di sviluppo.
» Con ADO si utilizza un data provider che fa da
tramite fra la sorgente dati e l’applicativo
consentendo, indipendentemente dal linguaggio
di programmazione scelto e dalla fonte dati, di
utilizzare sempre lo stesso criterio di
consultazione;
» ADO viene distribuito con Excel-VBA tramite una
libreria che si chiama ADODB (Microsoft ActiveX
Data Object 6.1 Library) e che comprende tutti gli
oggetti ADO adattandosi quindi alla maggior parte
dei progetti
11. ADO per DB
» Il modello ADO consiste di numerosi oggetti; di
questi i più importanti sono
Oggetto CONNECTION: contiene informazioni
riguardanti il fornitore dei dati e lo schema del
database;
Oggetto RECORDSET: contiene tutti o parte dei
records di una tabella del database indicato
nell’oggetto Connection;
Oggetti FIELD: si trovano all’interno degli oggetti
Recordset e rappresentano le colonne delle tabelle
del database;
Oggetti COMMAND: permettono di eseguire
direttamente varie tipologie di comandi incluse
query SQL;
12. ADO per DB
»Per far sapere al Visual Basic di quali
oggetti stiamo parlando occorre
preliminarmente aprire la finestra di
dialogo Riferimenti dal menu Strumenti
dell’editor VBA e far scorrere il
lunghissimo elenco di elementi fino ad
arrivare ai due componenti che ci
servono che si chiamano:
Microsoft ActiveX Data Objects 6.1 Library
Microsoft ActiveX Data Objects Recordset
2.8 Library
13. ADO – L’oggetto CONNECTION
»Il sistema per poter accedere ad un’origine dati (database, file di
testo, cartelle di Excel, etc …) è rappresentato dalla connection, la
quale ha come requisito principale l’appoggio ad un data-provider
OLE-DB, la cui funzione è quella di colloquiare in modo diretto e
corretto con la fonte dati prescelta;
»L’oggetto connection contiene solo le informazioni necessarie per
poter accedere alla fonte dati quali, ad esempio, il percorso, la
password, il nome dell’utente, il nome del DNS per ODBC, etc... Ed
una volta aperto, cioè a connessione avvenuta, è possibile iniziare a
colloquiare con il contenitore prescelto;
14. ADO – L’oggetto CONNECTION
»La sequenza di utilizzo è la seguente:
Configurazione della connessione
Apertura della connessione
Elaborazione Dati
Chiusura della connessione
15. ADO – L’oggetto CONNECTION
»La sequenza di utilizzo è
la seguente:
Configurazione della
connessione
Apertura della
connessione
Elaborazione Dati
Chiusura della
connessione
Step 1: Dichiare una variabile di tipo oggetto
ADODB.Connection e istanziare una nuova connessione
Dim cn As ADODB.Connection
Set cn= New ADODB.connection
Step 2: Specificare la Stringa di Connessione
cn.ConnectionString = "Data Source=" & ThisWorkbook.Path
& "newsvendor.mdb“
Step 3: Specificare il Data Provider
cn.Provider = "Microsoft Jet 4.0 OLE DB Provider"
16. Recordset
»Un recordset è semplice un insieme di records (rows);
ȏ assimilabile ad una tabella di database temporanea che contiene il
risultato di una query;
»Una tipica sequenza operativa con l’oggetto recordset è la seguente:
Apertura di un recordset (attraverso una connessione)
Elaborazione dati
Chiusura del recordset
17. Recordset
»Una tipica sequenza
operativa con l’oggetto
recordset è la seguente:
Apertura di un recordset
(attraverso una connessione)
Elaborazione dati
Chiusura del recordset
Step 1: Dichiarare una variabile di tipo Recordset ed
istanziare l’oggetto (si noti l’uso della parola chiave set)
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Step 2: Specificare la connessione
rs.Open “Tabella", cn
Dove “Tabella” è il nome della tabella che intendiamo
scaricare.
18. Recordset
»Metodi dell’oggetto RECORDSET
AddNew – aggiunge un nuovo record vuoto alla fine del RECORDSET;
CancelUpdate – cancella tutte le modifiche fatte nel RECORD corrente;
Delete – cancella il RECORD corrente;
MoveFirst – Sposta il puntatore del record al primo record del RECORDSET;
MoveNext – Muove il puntatore del record al record successivo a quello
correntemente in uso;
Update – Salva le modifiche del record corrente;
19. Recordset
»La funzione EOF
EOF esegue un test per
verificare se siamo giunti alla
fine del RECORDSET
La funzione EOF ritorna un
valore logico VERO se il
puntatore del record è
posizionato oltre la fine del
RECORDSET; altrimenti la
funzione ritorna FALSO;
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open “Demand", cn
Do Until rs.EOF
count = count + 1
rs.MoveNext
Loop
Questo esempio permette di contare il numero di record
presenti nel RECORDSET. Il flusso del programma esce dal
ciclo condizionale quando la fine del RECORDSET viene
raggiunta. Si noti l’utilizzo del metodo MoveNext per
avanzare di un record all’interno del ciclo.
20. Metodo Close
»Un oggetto di tipo RECORDSET dovrebbe venire chiuso quando non
risulta più necessario
rs.Close
»In maniera analoga, una volta terminato l’utilizzo di una connessione,
anche questa dovrebbe essere chiusa per non lasciare connessioni
appese al database
cn.Close
22. Semplice Esempio (1/8)
Dim dbPath As String
Dim dbFile As String
dbPath = "C:UsersUserGoogle DriveSeminari e Lezioni2017Uni Firenze - MABIDAdata"
dbFile = "esempi_modulo_2.accdb"
'declare conn to be a Connection -
Dim conn As ADODB.Connection
' make a connection object -
Set conn = New ADODB.Connection
' specify what kind of data provider it is -
conn.Provider = "Microsoft.ACE.OLEDB.12.0"
' open the connection on one database -
conn.Open dbPath & dbFile
' declare a recordset -
Dim myTableRS As ADODB.Recordset
' make one -
Set myTableRS = New ADODB.Recordset
' open it using a table in the database, and the connection
myTableRS.Open "Titoli", conn, adOpenDynamic, adLockPessimistic
23. Semplice Esempio (2/8)
' go to start of recordset -
myTableRS.MoveFirst: k = 1
' until we reach the end..
Do Until myTableRS.EOF
' display the 'Titolò field in current cell
Cells(k, 1).Value = myTableRS.Fields("Titolo")
' move next row
myTableRS.MoveNext: k = k + 1
Loop
'close the recordset
myTableRS.Close
Set myTableRS.ActiveConnection = Nothing
' and the connection
conn.Close
Set conn = Nothing
24. Semplice Esempio (3/8)
Dim wanted As String
' note the use of "'"
wanted = "'Adams, Pat'"
'wanted = InputBox("Text to be searched", "Input search")
myTableRS.Find "Autore = " & wanted
If Not myTableRS.EOF Then
MsgBox myTableRS.Fields("Autore")
Else
MsgBox "Not found"
End If
»Il metodo FIND
25. Semplice Esempio (4/8)
myTableRS.Open "myTable", conn, adOpenStatic, adLockOptimistic
myTableRS.MoveFirst
Do While Not myTableRS.EOF
myTableRS.Fields("PhoneNumber") = myTableRS.Fields("PhoneNumber") + 1
myTableRS.Update
myTableRS.MoveNext
Loop
»Il metodo UPDATE
26. Semplice Esempio (5/8)
myTableRS.Open "myTable", conn, adOpenStatic, adLockOptimistic
myTableRS.MoveFirst
Do While Not myTableRS.EOF
myTableRS.Fields("PhoneNumber") = myTableRS.Fields("PhoneNumber") + 1
myTableRS.MoveNext
Loop
myTableRS.Updatebatch
»Il metodo UPDATEBATCH
27. Semplice Esempio (6/8)
»Inserimento di nuove righe
»Cancellazione di righe
myTableRS.AddNew
myTableRS.Fields("Autore") = "Della Lunga, Giovanni"
myTableRS.Fields("ID_Au") = 1000
myTableRS.Update
I nuovi record sono aggiunti alla fine della tabella.
In un database relazione l’ordine dei record nelle tabelle non
riveste particolare importanza
myTableRS.Find "ID = 1000"
If Not myTableRS.EOF Then
myTableRS.Delete
myTableRS.Update
MsgBox ("Record deleted")
Else
MsgBox ("No matching record")
End If
Questo frammento di codice cancella
una riga il cui ID field è uguale al valore
inserito (1000)
.delete cancella il record corrente dopo
aver eseguito l’istruzione update
28. Semplice Esempio (7/8)
myTableRS.Open "Select ID_Au, Autore From Autori", conn, adOpenDynamic,
adLockPessimistic
'
Dim i As Integer
Do While Not myTableRS.EOF
For i = 1 To myTableRS.Fields.Count
Debug.Print myTableRS.Fields(i - 1),
Next
Debug.Print
myTableRS.MoveNext
Loop
»Utilizziamo un pò di SQL (anche se ancora non sappiamo cos’è!)
29. Semplice Esempio (8/8)
Dim myCommand As ADODB.Command
Set myCommand = New ADODB.Command
myCommand.ActiveConnection = conn
myCommand.CommandText = "INSERT INTO Autori (ID_Au, Autore) VALUES (1000, 'Della
Lunga, Giovanni')“
myCommand.Execute
»L’oggetto Command
In questo esempio il CommandText è un’istruzione SQL Standard
Non sono necessari oggetti di tipo RecordSet
30. Il cursore
» Il cursore rappresenta una
sorta di puntatore al record
correntemente attivo;
» Esistono diversi tipi di cursori
con diversi effetti;
» La scelta del cursore viene
fatta prima di aprire il record
set;
» Accanto vediamo una
sintetica descrizione dei vari
tipi di cursore disponibili
(fonte Microsoft).
» Static. Is snapshot – changes by other users are
invisible. adOpenStatic
» ForwardOnly. Like the above but you can only
move forward through rows – more efficient.
adOpenForwardOnly
» Dynamic. Changes by others seen, move
anywhere. adOpenDynamic
» Keyset. Like dynamic, but can't see rows added
by others. adOpenKeyset
» Nei nostri esempi abbiamo sempre utilizzato il
tipo Dynamic.
31. Data Locking
» Qualora due o più utenti
processino lo stesso database
nello stesso tempo, potrebbero
sovrascrivere i dati l’un l’altro;
» Per prevenire questa possibilità si
utilizzano i ‘lock’;
» Il primo utente pone un lock sui
dati che sta utilizzando
prevenendo così la possibilità che
un secondo utente possa
modificare i dati nello stesso
tempo;
» adLockReadOnly - you are only reading
records so they are not locked
» adLockPessimistic – record locked when
you access it, released when finished
» adLockOptimistic – record only locked
when you update it – might go wrong
» adLockBatchOptimistic - only locked
when do batch update
33. Acquisire dati da Microsoft SQL Server
» Excel è già predisposto per una rapida connessione ad un DB SQL Server…
34. Acquisire dati da Microsoft SQL Server
» Acquisire la stringa di connessione
Selezioniamo nel nostro computer il file con
estensione .odc che viene salvato al termine
del collegamento con SQL Server;
Editiamo il file con un editor di testo
qualunque;
Scorriamo il testo senza modificarlo fino a
raggiungere la sezione individuata dai tag
<odc:ConnectionString> …
</odc:ConnectionString>;
Selezioniamo tutto il blocco di caratteri che si
trova fra queste due stringhe e facciamone
una copia da incollare nel nostro modulo vba;
Ai fini del risultato che ci interessa, alcuni degli
elementi non sono necessari per cui, volendo,
la stringa può anche essere semplificata;
35. Acquisire dati da Microsoft SQL Server
' dichiariamo connDati come ADODB.Connection
Dim connDati As ADODB.Connection
' rsDati indica il nostro recordset
Dim rsDati As ADODB.Recordset
' la variabile lstrConnection conterrà la stringa di connessione
Dim lstrConnection As String
' infine lstrSQL il comando SQL da utilizzare
Dim lstrSQL As String
lstrConnection = "Provider=SQLOLEDB.1;" & _
"Integrated Security=SSPI;" & _
"Data Source=laptop-cirfa6ne;" & _
"Workstation ID=LAPTOP-CIRFA6NE;" & _
"Initial Catalog=SQL_EXCEL"
La sintassi della stringa di
connessione varia da un DB
all'altro. Essenzialmente può
essere composta da:
Provider: Il tipo di provider OLE-
Db usato per la connessione
Initial File Name o Data Source: Il
path fisico del DataBase
(compreso il nome del file)
Initial Catalog: Il nome del
database
User ID: L'user name necessario
per la connessione
Password: La password per il
nome utente specificato
37. Acquisire Dati da MySQL
»Possiamo ottenere gli stessi servizi in Excel con VBA anche
interfacciandoci con un database MySQL a condizione di aver
predisposto un’adeguata connessione ODBC;
»Le funzionalità ODBC in MySQL non sono integrate nello strumento
come in SQL Server ma vanno installate deliberatamente scaricando
un file di sistema dal sito web di MySQL e istallandolo;
»Nome File (per Windows a 64 bit!)
mysql-connector-odbc-5.3.8-winx64.msi
»Download
https://dev.mysql.com/downloads/connector/odbc/
38. Acquisire Dati da MySQL
» Che cos’è ODBC
ODBC è l’acronimo di Open Database Connectivity, è una API standard per la connessione ai DBMS.
Questa API è indipendente dai linguaggi di programmazione dai sistemi di database e dal sistema
operativo.
L’ API è un insieme di procedure disponibili al programmatore, di solito raggruppate a formare un set di
strumenti specifici per un determinato compito.
Le API permettono di evitare ai programmatori di scrivere tutte le funzioni dal nulla.
In aggiunta al software ODBC, c’è bisogno di un driver specifico per poter accedere ad ogni diverso tipo
di DBMS.
ODBC permette ai programmi che lo usano di inviare ai database stringhe SQL senza che ci sia bisogno
di conoscerne le API proprietarie. Genera automaticamente richieste che il sistema di database
utilizzato sia in grado di capire. Questo è un fattore molto positivo in quanto i programmi possono
connettersi a diversi tipi di database utilizzando più o meno lo stesso codice.
39. Acquisire Dati da MySQL
» Come Impostare un ODBC
Per impostare un nuovo ODBC andare
su Pannello di controllo, poi Strumenti
di amministrazione, Origine dati (
ODBC ); aprire la finestra DNS di
sistema e premere sul pulsante
aggiungi.
Arrivati a questo punto bisogna
selezionare su che tipo di database si
vuole lavorare (nel nostro caso MySQL
ANSI driver)
Naturalmente è presente anche la
versione UNICODE!
40. Acquisire Dati da MySQL
» Al termine della procedura di installazione del
driver ODBC, nella finestra di dialogo riportata
a fianco, dobbiamo inserire
Un nome convenzionale per il connettore ODBC
che stiamo creando;
Una descrizione (facoltativa) che aiuti a ricordare a
che cosa serve quel connettore;
Il nome del server, dell’utente e della password di
accesso a MySQL;
Il nome del database MySQL col quale stabilire la
connessione;
41. Acquisire Dati da MySQL
lstrConnection = "DSN=ConnMySQL"
lstrSQL = " SELECT DISTINCT Titolo FROM sql_excel_biblioteca.Titoli " & _
" ORDER BY Titolo "
Set rsDati = New ADODB.Recordset
Set connDati = New ADODB.Connection
connDati.Open lstrConnection
rsDati.Open lstrSQL, connDati
ActiveSheet.Range("E2").CopyFromRecordset rsDati
rsDati.Close
Set rsDati = Nothing
connDati.Close
Set connDati = Nothing
43. Introduzione a SQL
» Prima di occuparci di cos’è e come si usa SQL cerchiamo di capire cosa si intende
con la parola database, che spesso in italiano viene tradotta come “base di dati”.
» Un database è una collezione di dati che viene gestita e organizzata da un
software specifico, il DBMS (DataBase Management System, Sistema di Gestione
di DataBase).
» Un DBMS è sostanzialmente uno strato software che si frappone fra l’utente ed i
dati veri e propri.
» Grazie a questo strato intermedio l’utente e le applicazioni non accedono ai dati
cosi’ come sono memorizzati effettivamente, cioè alla loro rappresentazione
fisica, ma ne vedono solamente una rappresentazione logica.
44. Introduzione a SQL
» Ciò permette un elevato grado di indipendenza fra le applicazioni e la
memorizzazione fisica dei dati. L’amministratore del database, se ne sente la
necessità, può decidere di memorizzare i dati in maniera differente o anche di
cambiare il DBMS senza che le applicazioni, e quindi gli utenti, ne risentano.
» La cosa importante è che non venga cambiata la rappresentazione logica di quei
dati, che è la sola cosa che i loro utilizzatori conoscono.
» Questa rappresentazione logica viene chiamata ‘Schema del databasè ed è la
forma di rappresentazione dei dati piu’ a basso livello a cui un utente del
database può accedere.
45. Database Relazionali
»Database relazionali: i database appartenenti a questa categoria si
basano sul modello relazionale la cui struttura principale è la
relazione, cioè una tabella bidimensionale composta da righe e
colonne.
»Ciascuna riga, che in terminologia relazionale viene chiamata tupla,
rappresenta un’entità che noi vogliamo memorizzare nel database.
»Le caratteristiche di ciascuna entità sono definite invece dalle colonne
delle relazioni, che vengono chiamate attributi.
»Entità con caratteristiche comuni, cioè descritti dallo stesso insieme di
attributi, faranno parte della stessa relazione.
46. Database Relazionali
» La struttura fondamentale del modello relazionale è appunto la “relazione”, cioè una tabella
bidimensionale costituita da righe (tuple) e colonne (attributi).
» Le relazioni rappresentano le entità che si ritiene essere interessanti nel database.
» Ogni istanza dell’entità troverà posto in una tupla della relazione, mentre gli attributi della
relazione rappresenteranno le proprietà dell’entità.
» Ad esempio, se nel database si dovranno
rappresentare delle persone, si potrà definire
una relazione chiamata “Persone”, i cui
attributi descrivono le caratteristiche delle
persone.
» Ciascuna tupla della relazione “Persone”
rappresenterà una particolare persona.
47. Chiavi Primarie
» Le tuple in una relazione sono un insieme nel senso matematico del termine, cioè
una collezione non ordinata di elementi differenti.
» Per distinguere una tupla da un’altra si ricorre al concetto di “chiave primaria”,
cioè ad un insieme di attributi che permettono di identificare univocamente una
tupla in una relazione.
» Naturalmente in una relazione possono esserci piu’ combinazioni di attributi che
permettono di identificare univocamente una tupla (“chiavi candidate”), ma fra
queste ne verra’ scelta una sola da utilizzare come chiave primaria.
» Gli attributi della chiave primaria non possono assumere il valore null (che
significa un valore non determinato), in quanto non permetterebbero piu’ di
identificare una particolare tupla in una relazione.
» Questa proprieta’ delle relazioni e delle loro chiavi primarie va sotto il nome di
integrita’ delle entita’ (entity integrity).
48. Creiamo il nostro Database di Esempio
» In pratica la creazione del database consiste nella creazione delle tabelle che lo
compongono.
» In realtà prima di poter procedere alla creazione delle tabelle normalmente
occorre creare in effetti il database, il che di solito significa definire uno spazio dei
nomi separato per ogni insieme di tabelle.
» In questo modo per un DBMS è possibile gestire più database indipendenti
contemporaneamente, senza che ci siano dei conflitti con i nomi che vengono
utilizzati in ciascuno di essi.
» La sintassi utilizzata dai più diffusi DBMS, è la seguente:
49. Creazione delle Tabelle
» Una volta creato il database è possibile creare le tabelle che lo compongono.
» L’istruzione SQL preposta a questo scopo è:
» nome_colonna: è il nome della colonna che compone la tabella. I nomi devono
iniziare con un carattere alfabetico.
» tipo_colonna: è l’indicazione del tipo di dato che la colonna potrà contenere.
50. Creazione delle Tabelle
» I principali tipi previsti dallo standard SQL sono:
» CHARACTER(n)
Una stringa a lunghezza fissa di esattamente n caratteri. CHARACTER può essere abbreviato con CHAR
» CHARACTER VARYING(n)
Una stringa a lunghezza variabile di al massimo n caratteri. CHARACTER VARYING può essere abbreviato con VARCHAR o CHAR VARYING.
» INTEGER
Un numero intero con segno. Può essere abbreviato con INT. La precisione, cioè la grandezza del numero intero che può essere memorizzato in una
colonna di questo tipo, dipende dall’implementazione del particolare DBMS.
» SMALLINT
Un numero intero con segno con precisione non superiore a INTEGER.
» FLOAT(p)
Un numero a virgola mobile, con precisione p. Il valore massimo di p dipende dall’implementazione del DBMS. è possibile usare FLOAT senza
indicazione della precisione, utilizzando quindi la precisione di default, anch’essa dipendente dall’implementazione. REAL e DOUBLE PRECISION sono
dei sinonimi per un FLOAT con una particolare precisione. Anche in questo caso le precisioni dipendono dall’implementazione, con il vincolo che la
precisione del primo non sia superiore a quella del secondo.
» DECIMAL(p,q)
Un numero a virgola fissa di almeno p cifre e segno, con q cifre dopo la virgola. DEC è un’abbreviazione per DECIMAL. DECIMAL(p) è un’abbreviazione
per DECIMAL(p,0). Il valore massimo di p dipende dall’implementazione.
» INTERVAL
Un periodo di tempo (anni, mesi, giorni, ore, minuti, secondi e frazioni di secondo).
» DATE, TIME e TIMESTAMP
Un preciso istante temporale. DATE permette di indicare l’anno, il mese e il giorno. Con TIME si possono specificare l’ora, i minuti e i secondi.
TIMESTAMP è la combinazione dei due precedenti. I secondi sono un numero con la virgola, permettendo cosi’ di specificare anche frazioni di
secondo.
54. Popolazione del Database
» INSERT, inserire una riga in una tabella
L’istruzione SQL che effettua l’inserimento di una nuova riga in una tabella è INSERT. La
sintassi con cui essa viene usata più comunemente è:
» Popoliamo le nostre tabelle a partire dai dati in formato Excel…
55. SELECT, interrogare il database
»Nella lezione precedente abbiamo esaminato i costrutti che SQL
mette a disposizione per inserire i dati in un database relazionale.
»In questa e nelle prossime lezioni ci concentreremo sulle istruzioni
che ci permettono di estrarre i dati che ci interessano.
»L’istruzione SQL preposta a tale scopo è SELECT.
»L’interrogazione è la funzionalità più usata di un database e le
clausole di cui dispone l’istruzione SELECT sono numerose e a volte
possono dar luogo a combinazioni piuttosto complicate.
56. SELECT, interrogare il database
»La sintassi completa è la seguente:
SELECT [DISTINCT ] lista_elementi_selezione
FROM lista_riferimenti_tabella
[ WHERE espressione_condizionale ]
[ GROUP BY lista_colonne ]
[ HAVING espressione_condizionale ]
[ ORDER BY lista_colonne ]
57. SELECT, interrogare il database
» Come si vede, le uniche clausole obbligatorie sono SELECT e FROM. Quest’ultima,
detta clausola di selezione, stabilisce da quale tabella (o da quali) estrarre i dati,
mentre la prima è detta clausola di proiezione e stabilisce quali colonne devono
essere riportate nel risultato finale.
» La clausola WHERE definisce invece un filtro sulle righe che verranno analizzate,
mentre ORDER BY indica l’ordinamento da applicare al risultato finale. Se WHERE
non viene specificata, non viene applicato alcun filtro sulle righe, che quindi
vengono esaminate tutte. Se invece non viene specificato alcun ordinamento, le
righe vengono restituite senza un ordine definito, generalmente così come
vengono trovate in tabella.
58. SELECT, interrogare il database
» SELECT * FROM sql_excel_biblioteca.titoli;
» SELECT Titolo FROM sql_excel_biblioteca.titoli;
» SELECT Titolo, ISBN as Codice FROM sql_excel_biblioteca.titoli;
»Le possibili espressioni utilizzabili sono moltissime e dipendono in
gran parte dal database utilizzato, quindi spesso le stesse funzioni
hanno nomi o sintassi diverse in MySQL, Oracle o SQL Server.
Purtroppo ciò limita la portabilità delle espressioni tra i vari database.
Per i dettagli è quindi necessario ricorrere alla documentazione
ufficiale dei singoli database.
59. SELECT, interrogare il database
» DISTINCT, eliminare i duplicati
» La prima query che abbiamo visto restituirebbe righe duplicate nel caso in cui
nella tabella fossero presenti libri con lo stesso titolo. Per evitare ciò occorre
specificare l’opzione DISTINCT:
» SELECT DISTINCT Titolo FROM sql_excel_biblioteca.titoli;
» Questa opzione fa sì che nel risultato non ci siano righe uguali tra loro, ed è utile
soprattutto quando si lavora con i join. Un join (congiunzione) è una funzione che
stabilisce come combinare righe di due tabelle diverse per ottenere una tabella
unica. Si distinguono generalmente tre tipi di join, che vediamo di seguito.
60. SELECT, interrogare il database
» La clausola ORDER BY
La clausola ORDER BY dell'SQL imposta l'ordinamento ascendente o discendente di una query. Per default
l'ordinamento è ascendente.
La sintassi base è la seguente:
SELECT * FROM nome_tabella ORDER BY nome_campo
In questo modo l'ordinamento è ascendente; per specificarlo è necessario utilizzare la clausola ASC:
SELECT * FROM nome_tabella ORDER BY nome_campo ASC
Per specificare l'ordinamento decrescente, invece, è necessario utilizzare la clausola DESC:
SELECT * FROM nome_tabella ORDER BY nome_campo DESC
61. Le funzioni
» Lo standard SQL prevede numerose funzioni, che sono classificate in due grandi
famiglie:
» Funzioni di Aggregazione, operano su un insieme di valori (per esempio tutta
una colonna) e restituiscono un unico valore riepilogativo; si possono usare solo
all’interno di istruzioni SELECT;
» Funzioni Scalari, agiscono su un solo valore (l’argomento) e restituiscono un
valore basato sull’argomento;
vedi esempi di funzioni scalari
62. Le funzioni
» Quelle che abbiamo visto finora sono funzioni scalari, che agiscono su un solo
valore;
» Le funzioni di aggregazione producono un risultato diverso rispetto alle funzioni
scalari;
» Non generano righe modificate ma producono un unico valore ottenuto
prendendo in considerazione tutta la colonna o le colonne indicate come
argomento;
» Vediamo un semplice esempio: vogliamo conoscere l’età media e l’anzianità di
servizio media degli impiegati i cui dati si trovano nella tabella Dipendenti…
63. Le funzioni
» Per ottenere la media delle età e delle anzianità
di servizio, possiamo usare la funzione di
aggregazione AVG()
64. Le funzioni
» La funzione AVG() agisce sull’argomento che viene inserito fra parentesi tonde,
che può essere il nome di una colonna oppure un’espressione;
» Oltre ad AVG() fanno parte dello standard SQL anche le funzioni SUM, COUNT,
MAX e MIN che sono recepite in tutte le implementazioni di SQL;
» In particolare la funzione COUNT consente tre formulazioni diverse
COUNT(*) Conteggia tutte le righe di una tabella, comprese quelle che contengono valori
NULL
COUNT(espressione) Conteggia tutte le righe che hanno valori diversi da NULL nella colonna
specificata con l’espressione;
COUNT(DISTINCT espressione) Conteggia il numero di righe nella colonna indicata
dall’espressione che non contengono valori NULL e che hanno valori diversi.
65. La clausola GROUP BY
»In molti casi si usano le funzioni di aggregazione insieme con la
clausola GROUP BY;
»Quando si utilizza tale clausola si deve segnalare sia in SELECT sia in
GROUP BY la stessa(e) colonna(e) ;
»Esempio:
66. La clausola HAVING
»Non è consentito in SQL di ricorrere alla clausola WHERE per stabilire
un criterio di selezione riferito a valori raggruppati mediante la
clausola GROUP BY;
»Per ottenere il risultato che ci interessa dobbiamo servirci della
clausola HAVING che svolge correttamente il ruolo di WHERE in
riferimento ad un valore ottenuto mediante la clausola di
raggruppamento;
67. Lavorare con più tabelle
»Iniziamo dalla relazione uno a molti;
INDIRIZZI
TELEFONI
Chiave primaria Chiave esterna
Chiave primaria
68. Lavorare con più tabelle
»Nella terminologia SQL si chiama join (congiunzione, collegamento o
relazione) sia il risultato di una query eseguita su più tabelle, sia il
meccanismo che caratterizza la relazione fra le tabelle;
»Il collegamento è reso possibile dal fatto che le tabelle messe in
relazione hanno un campo in comune che viene richiamato
espressamente nella clausola WHERE;
»Questo campo può avere lo stesso nome nelle tabelle messe in join
ma non necessariamente (come nell’esempio appena visto);
»E’ essenziale però che la join avvenga fra colonne che hanno lo stesso
tipo di dati;
69. Lavorare con più tabelle
»Attenzione a specificare la join!!
»Senza specifica quello che si ottiene è il prodotto cartesiano delle
tabelle ed è un’insidia sempre latente quando si fanno le join;
»Esempio di query sbagliata:
Si noti l’assenza della clausola
WHERE
70. Lavorare con più tabelle
»La clausola JOIN
»Una query che utilizza un INNER JOIN restituisce tutte le righe che si
accoppiano e soltanto quelle;
71. Lavorare con più tabelle
»LEFT JOIN
Possono esistere situazioni nelle quali si vogliono vedere tutti i record della
tabella del lato sinistro della relazione, che abbiano oppure no record con i
quali agganciarsi nel lato destro;
In questi casi si può usare un left outer join;
72. Lavorare con più tabelle
»Relazioni molti a molti
Per poter gestire questo tipo di
relazioni bisogna scomporle in
due o più relazioni uno a molti
creando contestualmente una
tabella che faccia da ponte e
consenta una relazione ordinata
fra le coppie di tabelle;
Non è un concetto
immediatamente intuitivo per
cui passiamo subito ad un
esempio concreto;
74. Clustering con l’algoritmo k-means
» In questo esempio utilizzeremo una tecnica algoritmica che è entrata a far parte
dei metodi di Data Mining (DM) e che si chiama Clustering;
» In particolare si discuterà di un metodo di clustering detto partizionante, talvolta
chiamato anche “semplice”, che può essere realizzato con il noto algoritmo k-
means (o delle k-medie) sviluppato per la prima volta da MacQueen nel 1967.
» In linea generale, partendo da un dataset, il clustering si propone di individuare
delle regioni distinte nelle quali raggruppare dati in modo tale che i dati
all’interno di una stessa regione siano simili tra loro rispetto ad un criterio
(metrica) scelto inizialmente, mentre quelli in regioni differenti siano dissimili tra
loro.
» In seguito alla realizzazione di queste regioni o cluster, è l’utente esperto di
dominio, grazie all’aiuto di una o più tecniche di valutazione, che decide il
significato di tali raggruppamenti.
75. Clustering con l’algoritmo k-means
» L’algoritmo k-means, archetipo dei metodi di raggruppamento, è un algoritmo di
clustering che permette di suddividere gruppi di oggetti in k partizioni sulla base
dei loro attributi.
» Ogni cluster viene identificato mediante un centroide o punto medio. L’algoritmo
segue una procedura iterativa
76. Clustering con l’algoritmo k-means
» L’algoritmo può essere illustrato attraverso la seguente schematizzazione:
1. Scegliere un valore di k il numero totale di cluster da determinare.
2. Scegliere in modo casuale (spesso utilizzando un generatore di numeri
pseudocasuali) k dati nel dataset. Questi sono i centri iniziali (baricentri) dei
cluster.
3. Utilizzare la distanza euclidea per assegnare i restanti dati ai centri dei
cluster più vicini.
4. Utilizzare i dati in ogni cluster per calcolare una nuova media di ogni
cluster.
5. Se le nuove medie sono identiche a quelle calcolate in precedenza, il
processo termina; altrimenti, utilizzare le nuove medie come centri dei
cluster e ripetere i passi da 3 a 5.
77. Clustering con l’algoritmo k-means
» Come criterio di valutazione generale, una clusterizzazione ottimale per
l’algoritmo k-means è definita come una clusterizzazione che presenta il valore
minimo della somma dei quadrati delle differenze degli errori fra le osservazioni e
i centri dei cluster di appartenenza.
» Trovare una clusterizzazione ottimale per un dato valore di k è quasi impossibile
dal momento che bisognerebbe ripetere l’algoritmo per ognuna delle possibili
scelte dei centri iniziali dei cluster.
» Anche per poche centinaia di osservazioni non sarebbe pratico applicare k-means
più volte.
» Piuttosto, è prassi comune scegliere un criterio di conclusione dell’algoritmo,
come un valore massimo accettabile per l’errore quadratico ed eseguire
l’algoritmo finché il risultato raggiunto non soddisfa il criterio di conclusione
prestabilito.