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.

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?