Upload
minaandr64
View
77
Download
0
Embed Size (px)
DESCRIPTION
Esercizi SQL
Citation preview
Andrea [email protected]
© 2007 Andrea Turati
Structured Query Language parte 1
Come interrogare una base di dati relazionale… ed avere la risposta esatta
Informatica Applicata per Ingegneria Biomedica - SQL/1 2© 2007 Andrea Turati
Le basi di dati relazionali
• Fatture
• Schedario dei numeri di telefono dei fornitori
• Ordini dei clienti
• Indirizzi dei clienti
• Archivio prodotti in magazzino
Fatture
Fornitori
Ordini
Clienti
Magazzino
informazioni tabelle base di dati
Informatica Applicata per Ingegneria Biomedica - SQL/1 3© 2007 Andrea Turati
Tabelle, record e campi
I dati sono organizzati in tabelle chiamate relazioni.
Ogni relazione è definita dalle colonne di cui è composta econtiene tutte le tuple (o righe) dello stesso tipo contenute nellabase di dati.
Le colonne della tabella rappresentano i campi o proprietà dellatabella; ogni riga corrisponde a un record e raggruppa i valori chequeste proprietà assumono in una tupla.
tabella
campo
record
RubricaNome Cognome Telefono Indirizzo Città
Andrea Turati 030-XXXXXX Via Turati 37 BresciaCesare Colombo 02-XXXXXX Via Fucini, 2 MilanoFrancesco Corcoglioniti 02-XXXXXXX Piazza Leonardo, 5 MilanoMarco Rossi 0575-XXXXX Via Torre, 1 Novara… … … … …
Informatica Applicata per Ingegneria Biomedica - SQL/1 4© 2007 Andrea Turati
Cos’è l’SQL?
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)
DROP
DDL DML DCLComandi SQL (Structured Query Language)
CREATE INSERT GRANTUPDATE REVOKEDELETESELECT
Informatica Applicata per Ingegneria Biomedica - SQL/1 5© 2007 Andrea Turati
A cosa serve l’SQL?
SQL rappresenta uno strumento per l’accesso ai dati alternativo a quelli che prevedono l’uso 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 all’altro
Informatica Applicata per Ingegneria Biomedica - SQL/1 6© 2007 Andrea Turati
Le tappe della storia1974: prima proposta Structured English Query Language - SEQUEL (IBM
Research)1981: prima implementazione nel sistema SQL/DS (Structured Query
Language/Data System) (IBM)dal 1983 ca.: “standard di fatto”1986: prima versione standard dell’ANSI (American National Standards
Institute)1989: estensione dello standard (SQL-89)1992: SQL-92 (SQL2) major release: nuovi tipi dei dati,
standardizzazione del catalogo dei dati di sistema e dei codici di errore
1999: SQL3, orientato agli aspetti più avanzati, quali i trigger, XML, il paradigma ad oggetti
2003: SQL:2003 (SQL:200n) ha standardizzato ulteriori funzionalità legate ad XML, sequenze, tipi di dati, ecc... Introducendo degli oggetti più complessi rispetto alle righe ed alle tabelle (cataloghi, schemi,…)
Informatica Applicata per Ingegneria Biomedica - SQL/1 7© 2007 Andrea Turati
Come viene usato SQL?SQL (linguaggio dichiarativo) esprime le interrogazioni dichiarando l’obiettivo dell’interrogazione stessa e non il modo per raggiungerlo (linguaggi imperativi)Tale interrogazione viene eseguita in diversi passi: – Il parser riconosce le componenti singole e converte l’interrogazione
complessa in una struttura ordinata ad albero– L’ottimizzatore riarrangia l’ordine delle istruzioni per rendere più
efficiente l’esecuzione– 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.
Ottimizzazionedelle interrogazioni
Parsing
Interrogazionecomplessa
Esecuzione
Base di dati
Generazionedel codice
Informatica Applicata per Ingegneria Biomedica - SQL/1 8© 2007 Andrea Turati
Limiti di SQL
SQL è un linguaggio dichiarativo
+ facilità di esprimere le richieste- assenza di strutture di controllo
•iterazioni•strutture condizionali
Soluzioni possibili:1. Uso di software di interfaccia (middleware)2. SQL immerso (embedded) in altri linguaggi di programmazione3. SQL procedurale
Informatica Applicata per Ingegneria Biomedica - SQL/1 9© 2007 Andrea Turati
Superare i limiti di SQL(1)
1. MiddlewareLe interfacce ODBC, JDBC, ... offrono un’interfaccia di accesso ai dati indipendente dal formato, dalla localizzazione, ecc...
2. Embedded SQL (es. programmi C/C++)
Codice Sorgente
+ istruzioni
SQL
pre-compilatore del codice SQL immerso nel linguaggio
Codice Sorgente + istruzioni
SQL precompilate
compilatore del linguaggio
programma eseguibile
DB
DBJdbc/Odbc Applicazione
Informatica Applicata per Ingegneria Biomedica - SQL/1 10© 2007 Andrea Turati
Middleware/ODBC
ODBC driver
Applicazione
Oracle driver
Oracle DB DB
ODBC API
DB2driver
...driver
DB2
Informatica Applicata per Ingegneria Biomedica - SQL/1 11© 2007 Andrea Turati
Middleware/JDBC
JDBC driver (Driver Manager)
Applicazione Java
JDBC/ODBC bridge
Driver per JDBC fornito dal produttoreODBC driver
DB DB
JDBC API
Informatica Applicata per Ingegneria Biomedica - SQL/1 12© 2007 Andrea Turati
3. 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
– ....
Superare i limiti di SQL(2)
Informatica Applicata per Ingegneria Biomedica - SQL/1 13© 2007 Andrea Turati
Selezione semplice
Per visualizzare o estarre i dati da una tabella occorre utilizzare le query di selezione, basate sull’uso di un comando del DML: SELECTCome dice il nome, una tale interrogazione permette di ‘selezionare’ dei particolari dati di una tabella e visualizzarliLa selezione viene fatta sulla base dei nomi delle colonne della tabellaLa parola chiave FROM permette di scegliere la tabella del database da cui si vogliono estarre i dati
select ListaCampifrom Tabella;
Informatica Applicata per Ingegneria Biomedica - SQL/1 14© 2007 Andrea Turati
Selezione semplice – es.
PersoneNome Età Reddito
Angelo 27 48Marco 26 45Piero 19 50
select Nome, Redditofrom Persone; Nome Reddito
Angelo 48Marco 45Piero 50
Estrarre, dalla tabella “Persone”, tutti i nomi e i rispettivi redditi.
Informatica Applicata per Ingegneria Biomedica - SQL/1 15© 2007 Andrea Turati
Ordinare i dati
Per avere in output un insieme di righe ordinate secondo un certo campo, si può utilizzare il comando order by
select ListaCampifrom Tabellaorder by UnCampo;
Esempio
PersoneNome Età Reddito
Individuare nomi eredditi ordinati perReddito
select Nome, Redditofrom Personeorder by Reddito;
-N.B. : l’ordinamento è per default ascendente, per averlo discendente:order by NomeCampo desc
Informatica Applicata per Ingegneria Biomedica - SQL/1 16© 2007 Andrea Turati
Filtrare i dati
La clausola WHERE permette di specificare una condizione che deve essere soddisfatta dai dati estrattiSu 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
select ListaCampifrom Tabellawhere Condizione;
La condizione è unpredicato (o più) che usa gli operatori=, <>, <, >, <=, >=
Informatica Applicata per Ingegneria Biomedica - SQL/1 17© 2007 Andrea Turati
Filtrare i dati - es.
select Nome, Redditofrom Personewhere Reddito > 45;
Nome Reddito
Angelo 48
Piero 50
Individuare nomi eredditi delle personeche guadagnano piùdi 45
PersoneNome Età Reddito
Angelo 27 48Marco 26 45Piero 19 50
Informatica Applicata per Ingegneria Biomedica - SQL/1 18© 2007 Andrea Turati
Filtrare e ordinare i dati - es.
Dalla tabella Rubrica, selezionare Nome e Cognome di tutte le persone che abitano a Milano, ordinando i risultati in base al Cognome.
RubricaNome Cognome Telefono Indirizzo Città
Matteo Testa 030-XXXXXX Via Corsica, 37 BresciaGiovanni Valli 02-XXXXXX Via Chiusa, 2 MilanoLuisa Micheletti 02-XXXXXXX Via Manzoni, 15 MilanoMarco Silva 0575-XXXXX Via Torre, 1 Novara… … … … …
Seleziona la tabella Rubrica
Seleziona le colonne Nome e Cognome
Seleziona solamente i record che hanno il valore “Milano” nel campo Città
Ordina i risultati in base al Cognome
Nome, Cognome
Città = “Milano”Cognome;
Rubricaselectfromwhereorder by
Nome CognomeLuisa MichelettiGiovanni Valli
Informatica Applicata per Ingegneria Biomedica - SQL/1 19© 2007 Andrea Turati
Filtrare i dati – wildcard
Per specificare i criteri di selezione su dei campi di tipo testo è possibile utilizzare la funzione LIKEL’uso del segno % permette di selezionare più stringhe che si corrispondono solo in parte (% sostituisce un’intera sottostringa)Il segno _ permette di sostituire invece un singolo carattereL’uso di un segno o di un altro dipende dal DBMS– Esempio: Microsoft Access usa i segni * e ? in sostituzione
rispettivamente di % e _
select ListaCampifrom Tabellawhere CampoX like “text%”;
Informatica Applicata per Ingegneria Biomedica - SQL/1 20© 2007 Andrea Turati
Filtrare i dati – wildcard – es.
select Duratafrom Chiamatewhere NumTelefono like “02%”;
Durata
5
11
Individuare la durata delle chiamate di tuttigli utenti del distrettodi Milano
ChiamateNome Durata NumTelefono
Angelo 10 0893442
Marco 5 023444
Martina 11 026542
Piero 2 063442
Informatica Applicata per Ingegneria Biomedica - SQL/1 21© 2007 Andrea Turati
Filtraggio avanzato – operatori logici
Attraverso gli operatori AND ed OR è possibile combinare più criteri di selezione
L’operatore NOT è utilizzabile per creare delle condizioni che sono il negato di altre
Informatica Applicata per Ingegneria Biomedica - SQL/1 22© 2007 Andrea Turati
Filtraggio avanzato – es.(1)
select Nome, Etàfrom Personewhere CAP like‘201%’ andReddito > 50;
select Nome, Etàfrom Personewhere CAP not like‘201%’;
Nome Età
Martina 23
Nome Età
Angelo 27
Piero 19
Individuare nome e età di tutte le persone che risiedono a Milano e hannoun reddito maggiore di 50.
Individuare nome e età ditutte le persone che risiedonofuori Milano
Persone
Nome CAP Età Reddito
Angelo 11100 27 48
Marco 20127 26 45
Martina 20120 23 52
Piero 84100 19 50
Informatica Applicata per Ingegneria Biomedica - SQL/1 23© 2007 Andrea Turati
Filtraggio avanzato - altri operatori
L’operatore IN permette di specificare la condizione di appartenenza ad un certo insieme di valori (eventualmente risultato dell’esecuzione di un’altra query)
Per verificare se un attributo è null si usa l’operatore IS– Es. Attributo is null oppure
Attributo is not null
Informatica Applicata per Ingegneria Biomedica - SQL/1 24© 2007 Andrea Turati
Filtraggio avanzato – es.(2)
select Nome, Etàfrom Personewhere Livello not in (‘quadro’, ‘dirigente’);
Individuare nome e età di tutte le persone che non sonoquadri o dirigenti
Persone
Nome Livello Età Reddito
Angelo quadro 27 48
Marco dirigente 26 45
Martina quadro 23 52
Piero impiegato 19 50
Nome Età
Piero 19
(oppure:select Nome, Etàfrom Personewhere Livello not like ‘quadro’ and
Livello not like ‘dirigente’;
)
Informatica Applicata per Ingegneria Biomedica - SQL/1 25© 2007 Andrea Turati
Duplicati
In SQL si possono avere più righe uguali in una stessa tabellaL’eliminazione dei duplicati non viene fatta automaticamente perché è una operazione costosa e spesso non necessariaSe non si vogliono i duplicati è necessario esplicitare tale richiesta tramite la parola chiave distinct
Individuare i nomi distinti della tabellaPersone
select distinct Nomefrom Persone;
Persone
Nome Età Reddito
Informatica Applicata per Ingegneria Biomedica - SQL/1 26© 2007 Andrea Turati
Uso degli ALIAS
Un alias è un nome mnemonico introdotto con il comando AS ed è utilizzato per identificare:– un campo
• Es.:
– una tabella• Es.:
select Via as IndirizzoClientefrom Cliente as TabClienti
Da ricordare... vedremo poi a cosa ci può servire!
Nome IndirizzoCliente
Piero Via Garibaldi 70
ClienteNome Via
Piero Via Garibaldi 70
select Nome, Via as IndirizzoClientefrom Cliente
Informatica Applicata per Ingegneria Biomedica - SQL/1 27© 2007 Andrea Turati
Al pari di altri linguaggi di programmazione, SQL supporta l’uso di funzioni per la manipolazione dei datiTali funzioni spesso sono molto specifiche al DBMSEsse si possono dividere in quattro macrogruppi:1. Funzioni di manipolazione di stringhe di testo.
• Es.
• Estrae 3 lettere dal campo testo partendo dal carattere in posizione 1
2. Operazioni matematiche.• Es.:
Funzioni(1)
ABS(x) valore assoluto
SQRT(x) radice quadrata
EXP(x) esponenziale
XEX(x) rappresentazione esadecimale
SUBSTRING(testo FROM 1 FOR 3)
SUBSTRING(testo, 1, 3)
MID(testo, 1, 3)
SUBSTR(testo, 1, 3)
Informatica Applicata per Ingegneria Biomedica - SQL/1 28© 2007 Andrea Turati
Funzioni(2)
Funzioni di manipolazioni di date.
– Estrae anno, mese, giorno dalla dataEstrazione di informazioni di sistema.– Es.:
– Restituisce la data di sistema
Datepart(yyyy, data)mm
dd
to_char(data,’YY’)
MM
DD
Year(data)
Month(data)Dayofmonth(data)
SYSDATE
DATE()
CURRENT_DATE
GETDATE()
Informatica Applicata per Ingegneria Biomedica - SQL/1 29© 2007 Andrea Turati
Funzioni – es.
select substring(cliente from 2 for 2) as NumCliente, Provinciafrom Destinatari;
NumCliente Provincia
45 Pa
30 Bz
Destinatari
Cliente Via Numero Città CAP Provincia
C45 Tortora 4 Palermo 91011 Pa
C30 Rossi 25 Vipiteno 39049 Bz
Informatica Applicata per Ingegneria Biomedica - SQL/1 30© 2007 Andrea Turati
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.
Via Numero Città CAP Provincia
Cliente Prodotto Prezzo Quantità
(Costo = Prezzo x Quantità)
Prodotto Costo Sconto
(Prezzo = Costo x Sconto)
Via,Numero CAP-Città Provincia
Cliente Costo
Prodotto Prezzo
Informatica Applicata per Ingegneria Biomedica - SQL/1 31© 2007 Andrea Turati
I campi calcolati(2)
Per concatenare più stringhe si utilizzano i seguenti operatori:
Utilizzando gli operatori aritmetici è possibile associare delle espressioni a dei campi del risultato
|| (standard)
+ (Transact SQL-Ms SQL Server)
& (Ms Access)
concat() (MySQL)
Informatica Applicata per Ingegneria Biomedica - SQL/1 32© 2007 Andrea Turati
I campi calcolati – es.
Destinatari
Cliente Via Numero Città CAP Provincia
C45 Tortora 4 Palermo 91011 Pa
C30 Rossi 25 Vipiteno 39049 Bz
select Cliente, (Via || ”,” || Numero) as Indirizzo, (CAP || ”-” || Città) as Località, Provinciafrom Destinatari;
Cliente Indirizzo Località Provincia
C45 Tortora,4 91011-Palermo Pa
C30 Rossi,25 39049-Vipiteno Bz
Informatica Applicata per Ingegneria Biomedica - SQL/1 33© 2007 Andrea Turati
Query innestate
SQL permette di realizzare query in cui i valori utilizzati per specificare le condizioni sono ricavati direttamente da altre query– L’interrogazione viene specificata direttamente nel predicato
all’interno della clausola WHERECaso 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
l’attributo della riga stessa e almeno uno degli elementi dell’interrogazione nidificata
– ALL: come sopra ma per tutti gli elementi
DOT Notation: per evitare duplicazioni di nomi all’interno di una query che coinvolge più tabelle, identifico i campi attraverso la tebella di appartenenza:
NomeTabella.NomeCampoEsempio: Persone.Nome colonna Nome della tabella Persone
Informatica Applicata per Ingegneria Biomedica - SQL/1 34© 2007 Andrea Turati
Query innestate – es.(1)
select clienti.*from clientiwhere Cod_fisc = ANY (
select Cod_fisc_clientefrom ordiniwhere Quantità > 3
);
Clienti
Cod_fisc Nome Cognome
cod1 Marco Pace
cod3 Sara Gelo
cod2 Luca Neri
Ordini
Cod_fisc_cliente Importo Cod_Prod Quantità
cod1 200 A1 2
cod2 10 B54 4
cod4 30 S32 5
Cod_fisc Nome Cognome
cod2 Luca Neri
Estrarre i clienti che hanno fatto ordini con quantità maggiore di 3
Informatica Applicata per Ingegneria Biomedica - SQL/1 35© 2007 Andrea Turati
Query innestate – es.(2)
Per esprimere appartenenza ed esclusione ci sono anche altri due operatori (già visti in precedenza...)– IN = ANY– NOT IN <> ALL
select D.Nomefrom Dipartimento as Dwhere D.Nome <> ALL
(select Dipartimentofrom Persone as Pwhere P.Nome = “Angelo”)
Trovare i dipartimenti in cui non lavorano persone con Nome “Angelo”
Dipartimento
Nome Num_Dip
Persone
Codice Nome Cognome Dipartimento
Informatica Applicata per Ingegneria Biomedica - SQL/1 36© 2007 Andrea Turati
Query innestate – es.(3)
select Dipartimentofrom Personewhere Stipendio >= ALL (select Stipendio
from Persone);
Oppure...
Trovare il dipartimento dell’impiegato che guadagna di più
Persone
Codice Nome Cognome Dipartimento Stipendio
select Dipartimentofrom Persone where Stipendio = (
select max(Stipendio)from Persone);
Informatica Applicata per Ingegneria Biomedica - SQL/1 37© 2007 Andrea Turati
Query innestate complesse (1)
EXISTS e NOT EXISTS– Operatore che ammette come parametro una interrogazione
nidificata e dà valore vero solo se l’interrogazione fornisce un risultato non vuoto
select *from Persone as P1 where exists
(select * from Persone as P2where P1.Nome = P2.Nome and
P1.Cognome = P2.Cognome andP1.Codice_Fiscale <> P2.Codice_Fiscale);
Trovare le persone che hanno omonimi
Persone
Codice_fiscale Nome Cognome
Informatica Applicata per Ingegneria Biomedica - SQL/1 38© 2007 Andrea Turati
Query innestate complesse (2)
L’esempio precedente mostra cheNon si può sempre pensare che l’esecuzione delle interrogazioni nidificate avvenga eseguendo prima la più interna e poi la più esterna......quando l’interrogazione nidificata usa variabili di quella esterna ciò non è più vero
• Si chiama PASSAGGIO DI BINDING da un contesto ad un altro
...In questi casi l’esecuzione è la seguente:• Per ogni riga della query esterna calcolo la query nidificata e il
predicato che ne deriva
L’operatore [NOT] EXISTS è significativo solo in casi di passaggio di binding (gli altri anche negli altri tipi di query nidificate)
Informatica Applicata per Ingegneria Biomedica - SQL/1 39© 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 dell’Aida
2. Trovare i titoli delle opere dirette da Luca Ronconi negli anni tra il 1990 ed il 2000
3. Trovare gli incassi delle rappresentazioni nell’anno 2005
4. Trovare i registi che hanno diretto almeno un’opera nel 2004 e nel 2005
Informatica Applicata per Ingegneria Biomedica - SQL/1 40© 2007 Andrea Turati
Soluzione1.select Regista, Datafrom Rappresentazione where Titolo like “Aida”;
2.select Titolofrom Rappresentazione where (Regista = “Luca Ronconi”)
and (Year(Data) < 2000) and (Year(Data) > 1990);
3.select Prezzo*Spettatori, Titolofrom 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 41© 2007 Andrea Turati
Bibliografia
Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo TorloneBasi di Dati – Modelli e linguaggi di interrogazione, 2002 - McGraw Hill– Capitolo 4.2
Teach Yourself SQL in 10 minutessecond editionBen Forta2001, SAMS