Andrea Turati
andrea.turati@cefriel.it
Fatture Schedario dei numeri di telefono dei fornitori Ordini dei clienti Indirizzi dei clienti Archivio prodotti in magazzino
Fornitori
Ordini
Clienti
Magazzino
informazioni
tabelle
base di dati
Cos lSQL?
SQL (Structured Query Language) il linguaggio di riferimento per le basi di dati relazionali
Data Definition Language (permette di definire lo schema di una b.d.r.) Data Manipulation Language (permette di modificare le istanze delle b.d.r.) Data Control Language (permette di definire controllo e autorizzazioni in una b.d.r)
SQL rappresenta uno strumento per laccesso ai dati alternativo a quelli che prevedono luso di linguaggi di sviluppo ad hoc e/o interfacce amichevoli personalizzate per il particolare DB Anche se sono diffuse interfacce di tipo grafico, la conoscenza di SQL rimane molto importante per lavorare con i DB (soprattutto per chi deve sviluppare SW) Anche se lo standard unico ogni DBMS usa un dialetto proprio per cui alcuni costrutti, tipicamente collegati alle funzionalit pi avanzate, differiscono da uno allaltro
SQL (linguaggio dichiarativo) esprime le interrogazioni dichiarando lobiettivo dellinterrogazione stessa e non il modo per raggiungerlo (linguaggi imperativi) Tale interrogazione viene eseguita in diversi passi:
Il parser riconosce le componenti singole e converte linterrogazione complessa in una struttura ordinata ad albero Lottimizzatore riarrangia lordine delle istruzioni per rendere pi efficiente lesecuzione Il generatore di codice trasforma le istruzioni elementari in un codice eseguibile dal motore di esecuzione Il motore di esecuzione (query engine) esegue i comandi.
Esecuzione
Limiti di SQL
SQL un linguaggio dichiarativo
Soluzioni possibili: 1. Uso di software di interfaccia (middleware) 2. SQL immerso (embedded) in altri linguaggi di programmazione 3. SQL procedurale
Informatica Applicata per Ingegneria Biomedica - SQL/1
Middleware Le interfacce ODBC, JDBC, ... offrono uninterfaccia di accesso ai dati indipendente dal formato, dalla localizzazione, ecc...
DB
Jdbc/ Odbc
Applicazione
2.
DB
Informatica Applicata per Ingegneria Biomedica - SQL/1
Middleware/ODBC
Applicazione ODBC API Oracle driver ODBC driver DB2 driver ... driver
Oracle DB
DB2
DB
10
Middleware/JDBC
Applicazione Java JDBC API JDBC driver (Driver Manager) JDBC/ODBC bridge ODBC driver Driver per JDBC fornito dal produttore
DB
DB
11
Linguaggi procedurali basati su SQL Permettono di interfacciarsi con il sottostante database in maniera imperativa (supportando, ad esempio, costrutti come i cicli).
Oracle PL/SQL Transact-SQL PL/pgSQL ....
12
Selezione semplice
Per visualizzare o estarre i dati da una tabella occorre utilizzare le query di selezione, basate sulluso di un comando del DML: SELECT Come dice il nome, una tale interrogazione permette di selezionare dei particolari dati di una tabella e visualizzarli La selezione viene fatta sulla base dei nomi delle colonne della tabella La parola chiave FROM permette di scegliere la tabella del database da cui si vogliono estarre i dati
13
Persone Et Reddito 27 48 26 45 19 50
Reddito 48 45 50
2007 Andrea Turati
14
Ordinare i dati
Per avere in output un insieme di righe ordinate secondo un certo campo, si pu utilizzare il comando order by select ListaCampi from Tabella order by UnCampo; Esempio
Nome Persone Et Reddito
15
Filtrare i dati
La clausola WHERE permette di specificare una condizione che deve essere soddisfatta dai dati estratti Su ciascuna riga vengono valutati i valori dei campi coinvolti nella condizione: solo se essi verificano la condizione, i campi di tale riga (specificati dalla SELECT) vengono selezionati
La condizione un predicato (o pi) che usa gli operatori =, <>, <, >, <=, >=
16
17
Dalla tabella Rubrica, selezionare Nome e Cognome di tutte le persone che abitano a Milano, ordinando i risultati in base al Cognome.
select Nome, Cognome from Rubrica where Citt = Milano order by Cognome;
Rubrica Nome Matteo Giovanni Luisa Marco Cognome Testa Valli Micheletti Silva Telefono 02-XXXXXX 0575-XXXXX Indirizzo Via Chiusa, 2 Via Torre, 1
18
Seleziona le colonne Nome e Cognome Seleziona la tabella Rubrica Seleziona solamente i record che hanno il valore Milano nel campo Citt Ordina i risultati in base al Cognome
Citt Brescia Milano Milano Novara Nome Luisa Giovanni Cognome Micheletti Valli
2007 Andrea Turati
Per specificare i criteri di selezione su dei campi di tipo testo possibile utilizzare la funzione LIKE Luso del segno % permette di selezionare pi stringhe che si corrispondono solo in parte (% sostituisce unintera sottostringa) Il segno _ permette di sostituire invece un singolo carattere Luso di un segno o di un altro dipende dal DBMS
Esempio: Microsoft Access usa i segni * e ? in sostituzione rispettivamente di % e _
19
Durata 5 11
20
Attraverso gli operatori AND ed OR possibile combinare pi criteri di selezione Loperatore NOT utilizzabile per creare delle condizioni che sono il negato di altre
21
Individuare nome e et di tutte le persone che risiedono a Milano e hanno un reddito maggiore di 50.
Individuare nome e et di tutte le persone che risiedono fuori Milano select Nome, Et from Persone where CAP not like201%; Nome Angelo Piero
Informatica Applicata per Ingegneria Biomedica - SQL/1
Et 23
Loperatore IN permette di specificare la condizione di appartenenza ad un certo insieme di valori (eventualmente risultato dellesecuzione di unaltra query) Per verificare se un attributo null si usa loperatore IS
Es. Attributo is null Attributo is not null oppure
23
(oppure:
select Nome, Et from Persone where Livello not like quadro and Livello not like dirigente;
Nome Piero
Et 19
)
Informatica Applicata per Ingegneria Biomedica - SQL/1
24
Duplicati
In SQL si possono avere pi righe uguali in una stessa tabella Leliminazione dei duplicati non viene fatta automaticamente perch una operazione costosa e spesso non necessaria Se non si vogliono i duplicati necessario esplicitare tale richiesta tramite la parola chiave distinct
Persone Nome Et Reddito
25
select Nome, Via as IndirizzoCliente from Cliente Cliente Nome Piero Via Via Garibaldi 70 Nome Piero IndirizzoCliente Via Garibaldi 70
una tabella
Es.: select Via as IndirizzoCliente from Cliente as TabClienti
26
Funzioni(1)
Al pari di altri linguaggi di programmazione, SQL supporta luso di funzioni per la manipolazione dei dati Tali funzioni spesso sono molto specifiche al DBMS Esse si possono dividere in quattro macrogruppi:
1. Funzioni di manipolazione di stringhe di testo.
Es.
SUBSTRING(testo FROM 1 FOR 3) SUBSTRING(testo, 1, 3) MID(testo, 1, 3) SUBSTR(testo, 1, 3)
2. Operazioni matematiche.
Es.:
ABS(x) SQRT(x) EXP(x) XEX(x) valore assoluto radice quadrata esponenziale rappresentazione esadecimale
27
2007 Andrea Turati
Funzioni(2)
to_char(data,YY) MM DD
28
Funzioni es.
Destinatari Cliente Via Numero Citt CAP Provincia
C45 C30
Tortora Rossi
NumCliente
Provincia
45 Pa 30 Bz
29
I campi calcolati(1)
Spesso i dati presenti in una base di dati non sono nella forma di cui hanno bisogno le applicazioni che li utilizzeranno.
Numero Citt CAP Provincia Via,Numero CAP-Citt Provincia
Via
Cliente
Prodotto
Prezzo
Quantit
Cliente
Costo
30
I campi calcolati(2)
Utilizzando gli operatori aritmetici possibile associare delle espressioni a dei campi del risultato
31
C45 C30
Tortora Rossi
select Cliente, (Via || , || Numero) as Indirizzo, (CAP || - || Citt) as Localit, Provincia from Destinatari;
Cliente
Indirizzo
Localit
Provincia
C45 C30
Tortora,4 Rossi,25
91011-Palermo Pa 39049-Vipiteno Bz
32
Query innestate
SQL permette di realizzare query in cui i valori utilizzati per specificare le condizioni sono ricavati direttamente da altre query
Linterrogazione viene specificata direttamente nel predicato allinterno della clausola WHERE
Caso tipico: confronto di un attributo con il risultato di una query. Come procedo?
Devo estendere i normali operatori di confronto (=,<>,<,>,<=,>=) con due nuovi operatori ANY: la riga soddisfa la condizione se risulta vero il confronto tra lattributo della riga stessa e almeno uno degli elementi dellinterrogazione nidificata ALL: come sopra ma per tutti gli elementi
DOT Notation: per evitare duplicazioni di nomi allinterno di una query che coinvolge pi tabelle, identifico i campi attraverso la tebella di appartenenza:
NomeTabella.NomeCampo
Esempio: Persone.Nome colonna Nome della tabella Persone
Informatica Applicata per Ingegneria Biomedica - SQL/1
33
Estrarre i clienti che hanno fatto select clienti.* ordini con quantit maggiore di 3 from clienti where Cod_fisc = ANY ( select Cod_fisc_cliente from ordini where Quantit > 3 );
Cod_fisc Nome Cognome cod2
Informatica Applicata per Ingegneria Biomedica - SQL/1
Luca
Neri
2007 Andrea Turati
34
select D.Nome from Dipartimento as D where D.Nome <> ALL (select Dipartimento from Persone as P where P.Nome = Angelo)
Per esprimere appartenenza ed esclusione ci sono anche altri due operatori (gi visti in precedenza...) IN = ANY NOT IN <> ALL
35
select Dipartimento from Persone where Stipendio >= ALL (select Stipendio from Persone); Oppure... select Dipartimento from Persone where Stipendio = ( select max(Stipendio) from Persone );
Informatica Applicata per Ingegneria Biomedica - SQL/1
36
select * from Persone as P1 where exists (select * from Persone as P2 where P1.Nome = P2.Nome and P1.Cognome = P2.Cognome and P1.Codice_Fiscale <> P2.Codice_Fiscale);
37
Loperatore [NOT] EXISTS significativo solo in casi di passaggio di binding (gli altri anche negli altri tipi di query nidificate)
38
2007 Andrea Turati
Esercizio
Data la tabella seguente: Rappresentazione (Autore, Titolo, Data, Produttore, Regista, Scenografo, Prezzo, Spettatori)
1. Trovare i registi e le date delle varie rappresentazioni dellAida 2. Trovare i titoli delle opere dirette da Luca Ronconi negli anni tra il 1990 ed il 2000 3. Trovare gli incassi delle rappresentazioni nellanno 2005 4. Trovare i registi che hanno diretto almeno unopera nel 2004 e nel 2005
39
Soluzione
1.
select Regista, Data from Rappresentazione where Titolo like Aida;
2.
select Titolo from Rappresentazione where (Regista = Luca Ronconi) and (Year(Data) < 2000) and (Year(Data) > 1990);
3.
select Prezzo*Spettatori, Titolo from Rappresentazione where Year(Data) = 2005;
4.
select Regista from Rappresentazione where Regista in (select Regista from Film where Year(Data) = 2004) and Regista in (select Regista from Film where Year(Data) = 2005);
Informatica Applicata per Ingegneria Biomedica - SQL/1
40
Bibliografia
Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Basi di Dati Modelli e linguaggi di interrogazione, 2002 - McGraw Hill
Capitolo 4.2
Teach Yourself SQL in 10 minutes second edition Ben Forta 2001, SAMS
41