SQL
Materiale aggiuntivo per il corso di laurea in Lingue e Culture per il Turismo classe L-15
Ultima modifica:
5/4/2012
Query (Interrogazioni)
! È necessario un modo per interrogare le basi di dati, cioè per estrarre
conoscenza
! Per reperire le informazioni di interesse da un DB, un utente non può
semplicemente leggere le tabelle:
! le tabelle possono essere molto grosse
! può essere necessario utilizzare più tabelle contemporaneamente
! Si usano le query (interrogazioni)
2
Query
! Una query permette di specificare
! cosa cercare all’interno del DB (criteri di selezione)
! quali informazioni (campi) visualizzare
! Il risultato consiste in una nuova tabella temporanea con i campi e i record di interesse
3
SQL
! Originariamente “Structured Query Language”
! SQL è un linguaggio che consente di formulare interrogazioni (query) (Data Manipulation Language, DML)
! Anche usato come Data Declaration Language, DDL (per esempio, per dichiarare vincoli di integrità)
! È il linguaggio utilizzato da tutti i DBMS relazionali commerciali (con qualche differenza da un sistema all’altro)
4
Sintassi
! Esistono, in generale, più modi per
effettuare un’interrogazione: scelta basata sulla leggibilità (più che sull’efficienza…)
! Struttura essenziale (introdurremo le variazioni di volta in volta):
select ListaAttributi (target list) from ListaTabelle (clausola “from”) where Condizione (clausola “where”)
5
Significato dell’interrogazione
! Si considerano la tabella/le tabelle della clausola “from”
! Si selezionano i record che soddisfano la condizione della clausola “where” (opzionale)
! Si danno in output i valori degli attributi elencati nella target list (“select”)
6
Tabella “Impiegato”
7
Schema:
Impiegato(Matricola, Nome, Cognome, Dipart, Ufficio, Stipendio, Città)
Tabella “Impiegato”
Matricola Nome Cognome Dipart Ufficio Stipendio Città
45 Mario Rossi Amministr 10 15 Milano
46 Carlo Bianchi Prod 20 12 Torino
47 Giuseppe Verdi Amministr 20 13 Roma
48 Franco Neri Distrib 16 15 Napoli
49 Carlo Rossi Direzione 14 27 Milano
50 Lorenzo Lanzi Direzione 7 21 Genova
51 Paola Burroni Amministr 75 13 Venezia
52 Marco Franco Prod 20 14 Roma
8
Impiegato
Interrogazione
select * from Impiegato
where Cognome = ‘Rossi’
9 Matricola Nome Cognome Dipart Ufficio Stipendio Città
45 Mario Rossi Amministr 10 15 Milano
49 Carlo Rossi Direzione 14 27 Milano
Interrogazione 1
select * from Impiegato
where Cognome = ‘Rossi’
10 Matricola Nome Cognome Dipart Ufficio Stipendio Città
45 Mario Rossi Amministr 10 15 Milano
49 Carlo Rossi Direzione 14 27 Milano
tutti
Interrogazione 2
select Stipendio from Impiegato
where Cognome = ‘Rossi’
11
Stipendio 15 27
Join
! Per formulare interrogazioni che coinvolgono più tabelle occorre effettuare un join, cioè
“congiungere” le tabelle
! È un’operazione fondamentale: di norma in un DB le informazioni sono registrate in più tabelle
! La congiunzione avviene sui valori in comune tra le tabelle
12
Join in SQL
! In SQL per effettuare un join è possibile:
1. elencare le tabelle di interesse nella clausola “from”
2. definire nella clausola “where” le condizioni necessarie per mettere in relazione fra loro gli attributi di interesse
13
Tabella “Dipartimento”
14 Nome Indirizzo Città
Amministr Via Vai Milano Prod P.le Lavater 3 Torino Distrib Via Segre 9 Roma Direzione Via Vai 2 Milano Ricerca Via Morone 6 Milano Dipartimento(Nome, Indirizzo, Città)
Interrogazione 4
Restituire nome e cognome degli impiegati e le città in cui lavorano
select
Impiegato.Nome,Cognome, Dipartimento.Città from
Impiegato,Dipartimento where
Dipart = Dipartimento.Nome
15
Interrogazione 4
Restituire nome e cognome degli impiegati e delle città in cui lavorano
select
Impiegato.Nome,Cognome, Dipartimento.Città from
Impiegato,Dipartimento where
Dipart = Dipartimento.Nome
16
La notazione “punto”
(Tabella.Attributo) serve per disambiguare
Risultato interrogazione 4
17 Impiegato.Nome Cognome Dipartimento.Città
Mario Rossi Milano
Carlo Bianchi Torino
Giuseppe Verdi Milano
Franco Neri Roma
Carlo Rossi Milano
Lorenzo Lanzi Milano
Paola Burroni Milano
Marco Franco Torino
Interrogazione 4bis
Attenzione!
Se si omette la condizione di join, si ottiene un risultato poco significativo: ogni tupla di una relazione viene messa in corrispondenza con ogni tupla dell’altra relazione
Per es.:
select *
from Impiegato,Dipartimento
Dimenticare la join è un errore grave
18
Risultato interrogazione 4bis
19
Matricola Impiegato.Nome Cognome Dipart Dipartiment
o.Nome Indirizzo Dipartimento.Città
45 Mario Rossi Amministr Amministr Via Vai 2 Milano
45 Mario Rossi Amministr Prod P.le Lavater 3 Torino
45 Mario Rossi Amministr Distrib Via Segre 9 Roma
45 Mario Rossi Amministr Direzione Via Vai 2 Milano
45 Mario Rossi Amministr Ricerca Via Morone 6 Milano
46 Carlo Bianchi Prod Amministr Via Vai 2 Milano
46 Carlo Bianchi Prod Prod P.le Lavater 3 Torino
46 Carlo Bianchi Prod Distrib Via Segre 9 Roma
46 Carlo Bianchi Prod Direzione Via Vai 2 Milano
46 Carlo Bianchi Prod Ricerca Via Morone 6 Milano
52 Marco Franco Prod Amministr Via Vai 2 Milano
52 Marco Franco Prod Prod P.le Lavater 3 Torino
52 Marco Franco Prod Distrib Via Segre 9 Roma
52 Marco Franco Prod Direzione Via Vai 2 Milano
52 Marco Franco Prod Ricerca Via Morone 6 Milano
…
…
Interrogazione 4ter
20
Matricola Impiegato.Nome Cognome Dipart Dipartiment
o.Nome Indirizzo Dipartimento.Città
45 Mario Rossi Amministr Amministr Via Vai 2 Milano
46 Carlo Bianchi Prod Prod P.le Lavater 3 Torino
47 Giuseppe Verdi Amministr Amministr Via Vai 2 Milano
48 Franco Neri Distrib Distrib Via Segre 9 Roma
49 Carlo Rossi Direzione Direzione Via Vai 2 Milano
50 Lorenzo Lanzi Direzione Direzione Via Vai 2 Milano
51 Paola Burroni Amministr Amministr Via Vai 2 Milano
52 Marco Franco Prod Prod P.le Lavater 3 Torino
…
select *
from Impiegato,Dipartimento where Dipart=Dipartimento.Nome
Sulla clausola “where”
! Ammette come argomento un’espressione booleana
! Predicati semplici combinati con not, and, or (not ha la precedenza, consigliato l’uso di parentesi( ))
! Ciascun predicato usa operatori: =, <>,
<, >, <=, >=
! Confronto tra valori di attributi, costanti, espressioni
21
Interrogazione 6
select Nome,Cognome from
Impiegato where
Ufficio = 20 and Dipart =‘Amministr’
22
Nome Cognome Giuseppe Verdi
Interrogazioni 7 e 8
select Nome, Cognome from Impiegato where
Dipart=‘Prod’ or Dipart=‘Amministr’
select Nome from Impiegato where
Cognome=‘Rossi’ and (Dipart=‘Prod’ or
Dipart=‘Amministr’)
23 7
8
7
Nome Mario
8 Nome Cognome Mario Rossi Carlo Bianchi Paola Burroni Marco Franco Giuseppe Verdi
Ordinamento
! Per ordinare le righe del risultato di un’interrogazione, si può usare la clausola order by
! Es.
select * from Impiegato order by Matricola asc select *
from Impiegato
order by Matricola desc
asc può essere lasciato sottointeso 24 ordine crescente
ordine decrescente
Ordinamento
! Si possono combinare più criteri di ordinamento
! Es.
select * from Impiegato
order by Cognome, Nome
25 a parità di cognome, ordina
per nome (ordine crescente
sottinteso)