Sei sulla pagina 1di 41

Structured Query Language parte 1

Come interrogare una base di dati relazionale ed avere la risposta esatta

Andrea Turati
andrea.turati@cefriel.it

2007 Andrea Turati

Le basi di dati relazionali


Fatture

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

2007 Andrea Turati

Tabelle, record e campi


I dati sono organizzati in tabelle chiamate relazioni. Ogni relazione definita dalle colonne di cui composta e contiene tutte le tuple (o righe) dello stesso tipo contenute nella base di dati. Le colonne della tabella rappresentano i campi o propriet della tabella; ogni riga corrisponde a un record e raggruppa i valori che queste propriet assumono in una tupla.
Rubrica Nome Andrea tabella Cesare Francesco Marco Cognome Turati Colombo Corcoglioniti Rossi Telefono 02-XXXXXX 0575-XXXXX Indirizzo Via Fucini, 2 Via Torre, 1 Citt Brescia Milano Novara record campo 030-XXXXXX Via Turati 37

02-XXXXXXX Piazza Leonardo, 5 Milano

Informatica Applicata per Ingegneria Biomedica - SQL/1

2007 Andrea Turati

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)

Comandi SQL (Structured Query Language) DDL DML DCL


CREATE DROP INSERT UPDATE DELETE SELECT GRANT REVOKE

Informatica Applicata per Ingegneria Biomedica - SQL/1

2007 Andrea Turati

A cosa serve lSQL?

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

2007 Andrea Turati

Le tappe della storia


1974: 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 dellANSI (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

2007 Andrea Turati

Come viene usato SQL?

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.

Interrogazione complessa Parsing Base di dati

Ottimizzazione delle interrogazioni

Generazione del codice

Esecuzione

Informatica Applicata per Ingegneria Biomedica - SQL/1

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 programmazione 3. SQL procedurale
Informatica Applicata per Ingegneria Biomedica - SQL/1

2007 Andrea Turati

Superare i limiti di SQL(1)


1.

Middleware Le interfacce ODBC, JDBC, ... offrono uninterfaccia di accesso ai dati indipendente dal formato, dalla localizzazione, ecc...
DB

Jdbc/ Odbc

Applicazione

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
Informatica Applicata per Ingegneria Biomedica - SQL/1

2007 Andrea Turati

Middleware/ODBC

Applicazione ODBC API Oracle driver ODBC driver DB2 driver ... driver

Oracle DB

DB2

DB

Informatica Applicata per Ingegneria Biomedica - SQL/1

10

2007 Andrea Turati

Middleware/JDBC

Applicazione Java JDBC API JDBC driver (Driver Manager) JDBC/ODBC bridge ODBC driver Driver per JDBC fornito dal produttore

DB

DB

Informatica Applicata per Ingegneria Biomedica - SQL/1

11

2007 Andrea Turati

Superare i limiti di SQL(2)


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 ....

Informatica Applicata per Ingegneria Biomedica - SQL/1

12

2007 Andrea Turati

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

select ListaCampi from Tabella;

Informatica Applicata per Ingegneria Biomedica - SQL/1

13

2007 Andrea Turati

Selezione semplice es.

Nome Angelo Marco Piero

Persone Et Reddito 27 48 26 45 19 50

Estrarre, dalla tabella Persone, tutti i nomi e i rispettivi redditi.

select Nome, Reddito from Persone;

Nome Angelo Marco Piero

Reddito 48 45 50
2007 Andrea Turati

Informatica Applicata per Ingegneria Biomedica - SQL/1

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

Individuare nomi e redditi ordinati per Reddito

select Nome, Reddito from Persone order by Reddito;


-N.B. : lordinamento per default ascendente, per averlo discendente: order by NomeCampo desc
Informatica Applicata per Ingegneria Biomedica - SQL/1

15

2007 Andrea Turati

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

select ListaCampi from Tabella where Condizione;

La condizione un predicato (o pi) che usa gli operatori =, <>, <, >, <=, >=

Informatica Applicata per Ingegneria Biomedica - SQL/1

16

2007 Andrea Turati

Filtrare i dati - es.


Persone Et Reddito 27 48 26 45 19 50

Nome Angelo Marco Piero

Individuare nomi e redditi delle persone che guadagnano pi di 45

select Nome, Reddito from Persone where Reddito > 45;


Nome Angelo Piero Reddito 48 50
2007 Andrea Turati

Informatica Applicata per Ingegneria Biomedica - SQL/1

17

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.
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

030-XXXXXX Via Corsica, 37 02-XXXXXXX Via Manzoni, 15

Informatica Applicata per Ingegneria Biomedica - SQL/1

Filtrare i dati wildcard

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 _

select ListaCampi from Tabella where CampoX like text%;


Informatica Applicata per Ingegneria Biomedica - SQL/1

19

2007 Andrea Turati

Filtrare i dati wildcard es.


Chiamate Nome Angelo Marco Martina Piero Durata NumTelefono 10 0893442 5 023444 11 026542 2 063442 Individuare la durata delle chiamate di tutti gli utenti del distretto di Milano

select Durata from Chiamate where NumTelefono like 02%;

Durata 5 11

Informatica Applicata per Ingegneria Biomedica - SQL/1

20

2007 Andrea Turati

Filtraggio avanzato operatori logici

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

21

2007 Andrea Turati

Filtraggio avanzato es.(1)


Persone Nome Angelo Marco Martina Piero CAP 11100 20127 20120 84100 Et 27 26 23 19 Reddito 48 45 52 50 select Nome, Et from Persone where CAP like201% and Reddito > 50; Nome Martina Et 27 19
22
2007 Andrea Turati

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

Filtraggio avanzato - altri operatori

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

23

2007 Andrea Turati

Filtraggio avanzato es.(2)


Persone Nome Angelo Marco Martina Piero Livello quadro dirigente quadro impiegato Et 27 26 23 19 Reddito 48 45 52 50 Individuare nome e et di tutte le persone che non sono quadri o dirigenti

select Nome, Et from Persone where Livello not in (quadro, dirigente);

(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

2007 Andrea Turati

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

Individuare i nomi distinti della tabella Persone

select distinct Nome from Persone;

Informatica Applicata per Ingegneria Biomedica - SQL/1

25

2007 Andrea Turati

Uso degli ALIAS

Un alias un nome mnemonico introdotto con il comando AS ed utilizzato per identificare:


un campo
Es.:

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

Da ricordare... vedremo poi a cosa ci pu servire!


Informatica Applicata per Ingegneria Biomedica - SQL/1

26

2007 Andrea Turati

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)

Estrae 3 lettere dal campo testo partendo dal carattere in posizione 1

2. Operazioni matematiche.
Es.:
ABS(x) SQRT(x) EXP(x) XEX(x) valore assoluto radice quadrata esponenziale rappresentazione esadecimale
27
2007 Andrea Turati

Informatica Applicata per Ingegneria Biomedica - SQL/1

Funzioni(2)

Funzioni di manipolazioni di date.

Datepart(yyyy, data) Year(data) mm Month(data) Dayofmonth(data) dd

to_char(data,YY) MM DD

Estrae anno, mese, giorno dalla data

Estrazione di informazioni di sistema. Es.:


SYSDATE DATE() CURRENT_DATE GETDATE()

Restituisce la data di sistema


Informatica Applicata per Ingegneria Biomedica - SQL/1

28

2007 Andrea Turati

Funzioni es.
Destinatari Cliente Via Numero Citt CAP Provincia

C45 C30

Tortora Rossi

4 Palermo 91011 Pa 25 Vipiteno 39049 Bz

select substring(cliente from 2 for 2) as NumCliente, Provincia from Destinatari;

NumCliente

Provincia

45 Pa 30 Bz

Informatica Applicata per Ingegneria Biomedica - SQL/1

29

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.
Numero Citt CAP Provincia Via,Numero CAP-Citt Provincia

Via

Cliente

Prodotto

Prezzo

Quantit

Cliente

Costo

(Costo = Prezzo x Quantit)


Prodotto Costo Sconto Prodotto Prezzo

(Prezzo = Costo x Sconto)


2007 Andrea Turati

Informatica Applicata per Ingegneria Biomedica - SQL/1

30

I campi calcolati(2)

Per concatenare pi stringhe si utilizzano i seguenti operatori:


|| + & concat() (standard)
(Transact SQL-Ms SQL Server) (Ms Access) (MySQL)

Utilizzando gli operatori aritmetici possibile associare delle espressioni a dei campi del risultato

Informatica Applicata per Ingegneria Biomedica - SQL/1

31

2007 Andrea Turati

I campi calcolati es.


Destinatari Cliente Via Numero Citt CAP Provincia

C45 C30

Tortora Rossi

4 Palermo 91011 Pa 25 Vipiteno 39049 Bz

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

32

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
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

2007 Andrea Turati

Query innestate es.(1)


Clienti Cod_fisc Nome cod1 cod3 cod2 Sara Luca Cognome Gelo Neri Marco Pace cod1 cod2 cod4 Ordini Cod_fisc_cliente Importo Cod_Prod 200 A1 10 B54 30 S32 Quantit 2 4 5

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

Query innestate es.(2)


Dipartimento Nome Num_Dip Codice Nome Persone Cognome Dipartimento

select D.Nome from Dipartimento as D where D.Nome <> ALL (select Dipartimento from Persone as P where P.Nome = Angelo)

Trovare i dipartimenti in cui non lavorano persone con Nome Angelo

Per esprimere appartenenza ed esclusione ci sono anche altri due operatori (gi visti in precedenza...) IN = ANY NOT IN <> ALL

Informatica Applicata per Ingegneria Biomedica - SQL/1

35

2007 Andrea Turati

Query innestate es.(3)


Persone Codice Nome Cognome Dipartimento Stipendio

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

Trovare il dipartimento dellimpiegato che guadagna di pi

36

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 linterrogazione fornisce un risultato non vuoto
Persone Codice_fiscale Nome Cognome

Trovare le persone che hanno omonimi

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);

Informatica Applicata per Ingegneria Biomedica - SQL/1

37

2007 Andrea Turati

Query innestate complesse (2)

Lesempio precedente mostra che


Non si pu sempre pensare che lesecuzione delle interrogazioni nidificate avvenga eseguendo prima la pi interna e poi la pi esterna... ...quando linterrogazione nidificata usa variabili di quella esterna ci non pi vero
Si chiama PASSAGGIO DI BINDING da un contesto ad un altro

...In questi casi lesecuzione la seguente:


Per ogni riga della query esterna calcolo la query nidificata e il predicato che ne deriva

Loperatore [NOT] EXISTS significativo solo in casi di passaggio di binding (gli altri anche negli altri tipi di query nidificate)
38
2007 Andrea Turati

Informatica Applicata per Ingegneria Biomedica - SQL/1

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

39

2007 Andrea Turati

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

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/1

41

2007 Andrea Turati