SQL

SELECT

by Andrea Spera

Le query SELECT sono alla base dell'interrogazione dei dati in SQL. Con questo comando è possibile estrarre informazioni specifiche da uno o più database, applicare filtri, ordinare i risultati e combinare dati da più tabelle.
In questa pagina esploreremo diversi esempi pratici di query SELECT, basati su tre tabelle che abbiano chiamato: Ordini, Venditori, Filiali.
Ordini
ID NrOrdine DataOrdine IdVenditore Valore
1 1010 05/10/2018 3 € 150,00
2 1011 05/10/2018 2 € 1.111,00
3 1012 13/10/2018 4 € 1.321,00
4 1013 15/10/2018 3 € 321,00
5 1014 15/10/2018 4 € 900,00
6 1015 11/02/2018 2 € 1.888,00
7 1016 11/10/2018 3 € 120,00
8 1017 11/10/2018 3 € 970,00
Venditori
ID Nome Cognome IdFiliale
1 Paolo Rossi 1
2 Marco Bianchi 2
3 Marta Verdi 1
4 Marco Bello 3
Filiali
ID Filiale Area
1 Padova Nord
2 Milano Nord
3 Roma Centro
Una query di selezione semplice
Codice
-- This is a comment (not supported by Microsoft Access)
SELECT V.Nome, V.Cognome
FROM Venditori AS V
WHERE V.IdFiliale=1
ORDER BY V.Nome ASC;
Risultato della query
Nome Cognome
Marta Verdi
Paolo Rossi
Utilizzo di IN e BETWEEN
Codice
SELECT O.NrOrdine
FROM Ordini AS O
WHERE O.NrOrdine IN ("1010", "1011");
Risultato della query
NrOrdine
1010
1011
Codice
SELECT O.NrOrdine
FROM Ordini AS O
WHERE O.Valore BETWEEN 500 AND 1000;
Risultato della query
NrOrdine
1014
1017
Utilizzo di LIKE con % con _
Nell'esempio qui sotto, con l'espressione "LIKE "__10" cerchiamo nel campo NrOrdine una stringa di 4 caratteri che contenga "10" a partire dalla terza posizione.
Codice
SELECT O.NrOrdine
FROM Ordini AS O
WHERE O.NrOrdine LIKE "__10";
Risultato della query
NrOrdine
1010
In quest'altro esempio, invece, cerchiamo nella colonna Cognome ogni stringa, di lunghezza qualsiasi, che inizi con "B".
Codice
SELECT V.Cognome
FROM Venditori AS V
WHERE V.Cognome LIKE "B%";
Risultato della query
Cognome
Bianchi
Bello
Esempio di una query di selezione con subquery
Codice
SELECT F.Filiale, V.Cognome, Count(O.NrOrdine) AS Conteggio_ordini, Sum(O.Valore) AS Valore_totale
FROM (Venditori AS V
LEFT JOIN Ordini AS O
ON V.ID=O.IdVenditore)
INNER JOIN Filiali AS F
ON V.IdFiliale=F.ID
GROUP BY F.Filiale, V.Cognome, F.Area
HAVING F.Area="Nord"
ORDER BY Sum(O.Valore) DESC;
Alternativa
SELECT SQ.Filiale, SQ.Cognome, Count(O.NrOrdine) AS Conteggio_ordini, Sum(O.Valore) AS Valore_totale, SQ.Area
FROM Ordini AS O
RIGHT JOIN
(
SELECT V.ID, F.Filiale, V.Cognome, F.Area
FROM Venditori AS V
LEFT JOIN Filiali AS F
ON V.IdFiliale=F.ID
) AS SQ
ON O.IdVenditore=SQ.ID
GROUP BY SQ.Filiale, SQ.Cognome, SQ.Area
HAVING SQ.Area="Nord"
ORDER BY Sum(O.Valore) DESC;
Risultato della query
Filiale Cognome Conteggio_ordini Valore_totale
Milano Bianchi 2 € 2.999,00
Padova Verdi 4 € 1.561,00
Padova Rossi 0
Query Editor di Microsoft Access