Title: Interrogazioni
1Interrogazioni
- Le interrogazioni in SQL sono formulate in modo
dichiarativo specificando cioè cosa si vuole
ottenere e non come lo si vuole ottenere. - Linterrogazione viene passata allottimizzatore
di interrogazioni (query optimizer) che fa parte
del DBMS. Questo la analizza e la traduce nel
linguaggio di interrogazione interno al DBMS. - Per questo chi programma in SQL deve cercare di
scrivere codice leggibile e facilmente
modificabile, piuttosto che efficiente.
2Interrogazioni
- Listruzione base per le interrogazioni è select
- select ListaAttributi (target list)
- from ListaTabelle (clausola from)
- where Condizione (clausola where)
- Più in dettaglio
- select AttrEspr as Alias, AttrEspr as
Alias - from Tabella as Alias, Tabella as
Alias - where Condizione
- Seleziona le righe che soddisfano la condizione
where fra quelle appartenenti al prodotto
cartesiano delle tabelle in ListaTabelle. - Ogni colonna (tabella) può essere ridenominata
con un alias.
3Interrogazioni
- Es.
- Data una base di dati che contiene le tabelle
- IMPIEGATO(Nome, Cognome, Dipart, Ufficio,
Stipendio, Città ) - DIPARTIMENTO(Nome, Indirizzo,Città )
- select Stipendio/12 as SalarioMensile
- from Impiegato
- where Cognome Rossi
- Il risultato è una tabella con una colonna
rinominata SalarioMensile e tante righe quanti
sono gli impiegati che si chiamano Rossi. - Se si usa dopo select si selezionano tutti gli
attributi
4(No Transcript)
5Selezione e proiezione
Nome e reddito delle persone con meno di trenta
anni PROJNome, Reddito(SELEtalt30(Persone)) se
lect nome, reddito from persone where eta lt
30 select p.nome as nome, p.reddito as
reddito from persone p where p.eta lt 30
6Interrogazioni su più tabelle
- Se si vogliono estrarre informazioni da più
tabelle, si pone come argomento della clausola
from una lista delle tabelle. - Se si deve formulare un join, è possibile farlo
esplicitando il collegamento fra le due tabelle
nella clausola where. - Es.
- Estrarre i nomi degli impiegati e le città dove
lavorano. - select Impiegato.Nome, Impiegato.Cognome,
Dipartimento.Città - from Impiegato, Dipartimento
- where Impiegato.Dipart Dipartimento.Nome
7Interrogazioni su più tabelle
- E possibile omettere il nome della tabella per
quegli attributi che non presentano ambiguità . - select Impiegato.Nome, Cognome,
Dipartimento.Città - from Impiegato, Dipartimento
- where Dipart Dipartimento.Nome
- e abbreviare ulteriormente il codice utilizzando
gli alias - select I.Nome, Cognome, D.CittÃ
- from Impiegato as I, Dipartimento as D
- where Dipart D.Nome
8Clausola where
- Ammette come argomento una condizione logica.
- Gli operatori ammessi per i predicati semplici
(confronto attributo-costante o
attributo-espressione) sono - , ltgt, lt, gt, lt, gt
- I predicati semplici possono essere modificati
tramite gli operatori logici and, or, not. - not ha precedenza su and e or, ma non è definita
la precedenza fra and e or. Quando si coordinano
più predicati con and e or è bene esplicitare le
precedenze con le parentesi. - Es.
- select Nome
- from Impiegato
- where Cognome Rossi and
- (Dipart Amministraz or Dipart Produz)
9Operatore like
- Per i confronti fra stringhe è definito anche
loperatore like. - Il confronto è effettuato con una stringa che può
contenere i caratteri speciali e _ . - _ rappresenta un carattere arbitrario
- rappresenta in numero arbitrario di caratteri
(anche zero). - Es.
- select
- from Impiegato
- where Cognome like _oi
- La condizione è soddisfatta da Rossi Borroni Poli
Pollastri ecc.
10Gestione dei valori nulli
- La gestione dei valori nulli, a seconda
dellimplementazione, avviene attraverso una
logica a due valori come nellSQL-89, o a tre
valori (vero, falso, unknown) come nellSQL-2. - Le condizioni sui valori nulli possono essere
definite attraverso i predicati is null o is not
null.
11Interpretazione algebrica delle interrogazioni
- E possibile mettere in corrispondenza
interrogazioni SQL ed espressioni equivalenti in
algebra relazionale. - Es.
- select T1.Attributo11, . Th.Attributohm
- from Tabella1 as T1, .... Tabellah as Th
- where Condizione
- equivale a
- P T1.Attributo11.... Th.Attributohm (sCondizione
(Tabella1 x Tabella2 x .... x Tabellah) ) - Espressioni più complicate hanno comunque una
traduzione, anche se non così diretta.
12Duplicati
- Lalgebra relazionale non ammette duplicati, SQL
li ammette. - Quindi
- select CittÃ
- from Persona
- where Cognome Rossi
- estrae una lista di città in cui una città può
comparire più volte. - Per evitare i duplicati SQL prevede la parola
chiave distinct - da inserire subito dopo select.
- select distinct CittÃ
- from Persona
- where Cognome Rossi
13Join
- In SQL-2 è stata introdotta la seguente sintassi
per esprimere il join ed estenderlo ai join
esterni - select AttrEspr as Alias, AttrEspr as
Alias - from Tabella as Alias
- TipoJoin join Tabella as Aliason
CondizioneJoin - where AltraCondizione
- TipoJoin può assumere i valori
- inner, right outer, left outer, full outer
- inner è il default.
- Cè anche lestensione natural che implica la
condizione di uguaglianza sugli attributi con lo
stesso nome.
14Join implicito ed esplicito
- Padre e madre di ogni persona
- select paternita.figlio, padre, madrefrom
maternita, paternitawhere paternita.figlio
maternita.figlio - select madre, paternita.figlio, padre from
maternita join paternita on - paternita.figlio
maternita.figlio
15Alias e variabili
- Luso degli alias consente di
- compattare il codice
- fare riferimento a più esemplari della stessa
tabella - creare interrogazioni nidificate
- Se una tabella compare una sola volta non cè
differenza fra variabile ed alias. - Se compare più volte si parla più propriamente di
variabile. - select I1.Cognome, I1.Nome
- from Impiegato I1, Impiegato I2
- where I1.Nome I2.Cognome and
- I1.Nome ltgt I2.Nome and
- I2.Dipart Produzione
16Ordinamento
- E possibile anche ordinare le righe del
risultato di una interrogazione attraverso la
clausola order by, a chiusura di una
interrogazione. - order by AttrdiOrdinamento asc desc
- , AttrdiOrdinamento asc desc
- asc (default) indica ordinamento ascendente, desc
discendente. - Il primo attributo ha priorità , a parità di
valore si usa il secondo ecc. - select
- from Persona
- order by Cognome, Nome
17Operatori aggregati
- In algebra relazionale le espressioni vengono
valutate sulle singole tuple in successione.
Talvolta però possono essere necessarie
informazioni derivabili dallesame di tutte le
tuple o di più tuple contemporanemente. - SQL prevede una serie di operatori aggregati
- count, sum, max, min, avg
- con sintassi
- count ( lt distinct all ListaAttributi gt )
- lt summaxminavg gt(distinct all AttrEspr )
- Es. Determinare il numero degli impiegati che si
chiamano Rossi - select count()
- from Impiegato
- where nome Rossi
18Interrogazioni con raggruppamento
- Gli operatori aggregati vengono applicati a tutte
le righe che vengono prodotte come risultato
delloperazione. - Può essere necessario applicare loperatore solo
ad un sottoinsieme delle righe. - SQL non ammette che nella stessa target list
compaiano funzioni aggregate ed espressioni a
livello di riga, come il nome di un attributo. - Loperatore group by specifica come suddividere
le tabelle in sottoinsiemi. - Es.
- select Dipart, sum(Stipendio)
- from Impiegato
- group by Dipart
19Uninterrogazione scorretta select nome,
max(reddito) from persone Di chi sarebbe il
nome? La target list deve essere omogenea select
min(eta), avg(reddito) from persone
20Interrogazioni con raggruppamento
- In ogni interrogazione che usa group by argomento
della select può essere solo un sottoinsieme
degli attributi usati nella clausola group by - Es. di interrogazione scorretta
- select Ufficio
- from Impiegato
- group by Dipart
- Poiché deve venire prodotta una sola riga per
ogni valore di Dipart, e, a parità di tale
valore, possono aversi diversi valori di Ufficio,
il risultato dellinterrogazione è indeterminato. - In alcuni casi (es. se lattributo non compreso
nella clausola group by è chiave) la query
potrebbe fornire un risultato corretto, ma per
semplicità SQL lo vieta comunque.
21Predicati sui gruppi
- Può essere anche necessario restringere i gruppi
attraverso lapplicazione di condizioni. - Se le condizioni sono verificabili a livello
delle singole righe, basta utilizzare la clausola
where, altrimenti si aggiunge una condizione alla
group by attraverso lestensione having - select Dipart, sum(Stipendio) as SommaStipendi
- from Impiegati
- group by Dipart
- having sum(Stipendio) gt 100
- Se non si specifica group by e si usa having da
solo la condizione è applicata a tutte le righe.
Il problema è che se la condizione non è
verificata, il risultato sarà vuoto.
22Select
- La forma di select cui siamo arrivati dopo le
estensioni viste è quindi - SelectSQL select ListaAttributiOEspressioni
- from ListaTabelle
- where CondizioniSemplici
- group by ListaAttributiDiRaggruppamento
- having CondizioniAggregate
- order by ListaAttributiDiOrdinamento
23Interrogazioni di tipo insiemistico
- SQL fornisce anche gli operatori di tipo
insiemistico - union, intersect, except (minus)
- con la seguente sintassi
- SelectSQL
- lt union intersect except gt all
SelectSQL - NB
- intersect e except potrebbero anche essere
derivati attraverso opportune query - gli operatori insiemistici eseguono per default
una eliminazione dei duplicati all specifica di
non farla - gli schemi su cui si opera non devono essere
identici ma avere uguale numero di attributi, con
domini compatibili. La corrispondenza è per
posizione.
24Interrogazioni di tipo insiemistico
- Es.
- Estrarre nomi e cognomi degli impiegati
- select Nome
- from Impiegato
- union
- select Cognome
- from Impiegato
- Estrarre i cognomi degli impiegati che sono anche
nomi - select Nome
- from Impiegato
- intersect
- select Cognome
- from Impiegato