41
Andrea Turati [email protected] © 2007 Andrea Turati Structured Query Language parte 1 Come interrogare una base di dati relazionale… ed avere la risposta esatta

Esercitazione01-SQL

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