Interrogazioni di base

8 / 100

Interrogazioni di base

Consideriamo la seguente tabella teatro:

nomecittàemail
CSSUdine[email protected]
LittaMilano[email protected]
PiccoloMilano[email protected]
EliseoRoma[email protected]

L’interrogazione più semplice che si possa scrivere è la seguente:

select *
from teatro   

Il risultato è l’intera tabella teatro. La prima riga dell’interrogazione è detta clausola select e serve per selezionare le colonne della tabella che ci interessano. L’operatore * permette di selezionare tutte le colonne. La seconda riga dell’interrogazione è detta clausola from e serve per indicare quali tabelle usare. La clausola select e quella from sono obbligatorie in una interrogazione.

Se siamo interessati solo al nome e all’email dei teatri, possiamo selezionarli in questo modo:

select nome, email
from teatro   

Il risultato è la seguente tabella:

nomeemail
CSS[email protected]
Litta[email protected]
Piccolo[email protected]
Eliseo[email protected]

Per chiarire la differenza tra relazione del modello realzionale e tabella SQL, vediamo una semplice interrogazione che genera una tabella con due colonne con lo stesso nome:

select nome, nome
from teatro   

Il risultato è la seguente tabella:

nomenome
CSSCSS
LittaLitta
PiccoloPiccolo
EliseoEliseo

Inoltre, mostriamo una semplice interrogazione che genera una tabella con due righe uguali:

select città
from teatro   

Il risultato è la seguente tabella:

città
Udine
Milano
Milano
Roma

E’ possibile specificare la parola chiave distinct dopo la parola chiave select per eliminare i duplicati.

Introduciamo ora la clausola where:

select nome
from teatro
where città = 'Milano'   

Il risultato è la seguente tabella:

nome
Litta
Piccolo

La clausola where definisce un predicato sui valori degli attributi delle tabelle selezionate. Le righe che soddisfano il predicato, cioè per le quali in predicato è vero, vengono inserite nella tabella risultato.

Un predicato è formato combinando predicati atomici con gli operatori Booleani andor e not. Il not ha precedenza sugli altri due operatori ma non è stata definita una precedenza tra or e and.

Un predicato atomico è ottenuto confrontando due espressioni sui valori degli attributi mediante i seguenti operatori di confronto: =, <><><=>=. Esempi di espressioni sono un attributo e una costante. Le costanti di tipo stringa, tempo e data si scrivono tra apici, come nell’esempio di sopra.

Non servono gli apici per i numeri. Inoltre, l’operatore like permette un confronto con stringhe che contengono i valori speciali _ (un carattere qualsiasi) e % (una sequenza arbitraria, eventualmente vuota, di caratteri). E’ possibile confrontare il valore di un’espressione con il valore nullo con i predicati is null e is not null.

Facciamo qualche esempio sulla seguente tabella:

cfnomecognomedataDiNascitastipendio
ELSDLL72ElisaD’Allarche1972-04-292500
FRNDPP76FernandaD’Ippoliti1976-03-112100
MRCDLL70MarcoDall’Aglio1970-01-092700

Di seguito scriveremo prima la query in linguaggio naturale, poi la sua traduzione in SQL e infine il suo risultato.

Il nome, il cognome e lo stipendio dei dipendenti con uno stipendio di almeno 2500 Euro.

select nome, cognome, stipendio
from dipendenti
where stipendio >= 2500   
nomecognomestipendio
ElisaD’Allarche2500
MarcoDall’Aglio2700

Il nome e il cognome dei dipendenti nati dopo il 1975.

select nome, cognome
from dipendenti
where dataDiNascita > '1975-12-31'   
nomecognome
FernandaD’Ippoliti

Il nome e il cognome dei dipendenti con il nome che finisce con la lettera ‘a’ e con uno stipendio di almeno 2500 Euro.

select nome, cognome 
from dipendente 
where (stipendio >= 2500) and (nome like '%a')
nomecognome
ElisaD’Allarche

Il codice fiscale e lo stipendio annuale di Elisa D’Allarche.

select cf as codiceFiscale, stipendio * 12 as stipendioAnnuale
from dipendente
where nome = 'Elisa' and cognome = 'D\'Allarche'   
codiceFiscalestipendioAnnuale
ELSDLL7230000

Alcune osservazioni sull’ultima query: nelle espressioni possiamo usare le 4 operazioni *, /, +, -. Possiamo inoltre rinominare le colonne. Infine occorre far precedere il carattere apice (‘) da una barra (\) all’interno delle stringhe come in ‘D\’Allarche’.

A partire da SQL-2, la logica dei predicati in SQL è a tre valori: vero (V), falso (F) e sconosciuto (unknown, indicato con U). Le regole per usare i tre valori di verità sono le seguenti:

  • ogni confronto in cui almeno una componente ha valore sconosciuto ha come risultato il valore sconosciuto. Fanno eccezione i predicati is null e is not null, il cui valore è sempre o vero o falso, anche se il valore di confronto è sconosciuto;
  • gli operabori Booleani vengono estesi al valore U nel seguente modo:

    not U = U

    V and U = U, F and U = F, U and U = U

    V or U = V, F or U = U, U or U = U

    In sostanza, not A è vero se e solo se A è falso, A and B è vero se e solo se entrambi A e B sono veri e A or B è vero se e solo almeno uno tra A e B è vero;
  • una tupla soddisfa un predicato se il valore del predicato per quella tupla è vero.

Ad esempio, la query:

select *
from dipendente 
where (età >= 30)

seleziona i dipendenti la cui età è nota (non nulla) e il suo valore è maggiore o uguale a 30. Inoltre:

select *
from dipendente 
where (età < 30) or (età >= 30)

seleziona i dipendenti la cui età è nota, qualsiasi sia in suo valore. Si noti che il risultato non contiene tutti i dipendenti, ma, giustamente, vengono esclusi quelli che hanno valore sconosciuto per l’attributo età. In realtà questo risultato sembra contrario all’intuizione, in quanto noi sappiamo che ogni persona ha un’età e qualsiasi valore abbia è sicuramente un valore che soddisfa il predicato dato. L’intuizione è però fuorviante in tal caso in quanto assume che l’attributo età abbia un valore, anche se sconosciuto. Invece, il valore nullo per un attributo significa che: (i) il valore dell’attributo non esiste, oppure (ii) il valore dell’attributo esiste ma non è noto, oppure (iii) non è noto se il valore dell’attributo esista. L’interprete SQL non assume nessuno di questi tre casi. Per capire meglio, consideriamo la stessa query riferita all’attributo opzionale email:

select *
from dipendente 
where (email like '%@gmail.com') or not (email like '%@gmail.com')

Un impiegato senza indirizzo di posta elettronica viene giustamente escluso dal risultato, in quanto è falso che il suo indirizzo appartiene al dominio gmail.com ed è falso pure che il suo indirizzo non appartiene a tale dominio. Semplicemente, il suo indirizzo non esiste.

Translate »