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( , , ).