Interrogazioni di base
Consideriamo la seguente tabella teatro:
nome | città | |
---|---|---|
CSS | Udine | css@gmail.com |
Litta | Milano | litta@gmail.com |
Piccolo | Milano | piccolo@gmail.com |
Eliseo | Roma | eliseo@gmail.com |
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:
nome | |
---|---|
CSS | css@gmail.com |
Litta | litta@gmail.com |
Piccolo | piccolo@gmail.com |
Eliseo | eliseo@gmail.com |
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:
nome | nome |
---|---|
CSS | CSS |
Litta | Litta |
Piccolo | Piccolo |
Eliseo | Eliseo |
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 and, or 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:
cf | nome | cognome | dataDiNascita | stipendio |
---|---|---|---|---|
ELSDLL72 | Elisa | D’Allarche | 1972-04-29 | 2500 |
FRNDPP76 | Fernanda | D’Ippoliti | 1976-03-11 | 2100 |
MRCDLL70 | Marco | Dall’Aglio | 1970-01-09 | 2700 |
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
nome | cognome | stipendio |
---|---|---|
Elisa | D’Allarche | 2500 |
Marco | Dall’Aglio | 2700 |
Il nome e il cognome dei dipendenti nati dopo il 1975.
select nome, cognome from dipendenti where dataDiNascita > '1975-12-31'
nome | cognome |
---|---|
Fernanda | D’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')
nome | cognome |
---|---|
Elisa | D’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'
codiceFiscale | stipendioAnnuale |
---|---|
ELSDLL72 | 30000 |
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.