La SELECT è il comando per leggere e recuperare dati dal database. È il cuore del Query Language.

Struttura generale

SELECT   [DISTINCT] colonna1, colonna2, ...   -- cosa mostrare
FROM     NomeTabella                           -- da quale tabella
WHERE    condizione                            -- filtrare le righe
ORDER BY colonna [ASC | DESC]                  -- ordinare i risultati
LIMIT    n [OFFSET m];                         -- limitare il numero di righe

Esempi progressivi

-- Tutte le colonne di tutti gli studenti
SELECT * FROM Studenti;

-- Solo nome e cognome
SELECT nome, cognome FROM Studenti;

-- Con filtro e ordinamento
SELECT nome, cognome, voto_medio
FROM Studenti
WHERE voto_medio >= 7.0
ORDER BY cognome ASC, nome ASC;

-- Senza valori duplicati
SELECT DISTINCT nome_corso FROM Corsi;

-- Alias per rinominare le colonne nel risultato
SELECT nome AS "Nome Studente", voto_medio AS Media FROM Studenti;

-- Limitare i risultati (es. paginazione)
SELECT * FROM Studenti ORDER BY cognome LIMIT 10 OFFSET 0;   -- prima pagina
SELECT * FROM Studenti ORDER BY cognome LIMIT 10 OFFSET 10;  -- seconda pagina

Operatori nella clausola WHERE

Confronto:

WHERE voto_medio = 8.0         -- uguale
WHERE nome <> 'Mario'          -- diverso
WHERE crediti > 4
WHERE data_nascita <= '2005-12-31'

Logici:

WHERE voto_medio >= 6.0 AND id_classe = 3
WHERE nome = 'Mario' OR nome = 'Marco'
WHERE NOT (voto_medio < 6.0)

Intervallo:

WHERE voto_medio BETWEEN 6.0 AND 8.0          -- estremi inclusi
WHERE data_nascita BETWEEN '2000-01-01' AND '2005-12-31'

Lista di valori:

WHERE nome IN ('Mario', 'Luigi', 'Marco')
WHERE id_corso NOT IN (1, 2, 3)

Pattern matching (LIKE):

WHERE cognome LIKE 'R%'          -- inizia con R
WHERE email LIKE '%@gmail.com'   -- termina con @gmail.com
WHERE nome LIKE '_a%'            -- seconda lettera è 'a'
WHERE codice LIKE 'AB___'        -- inizia con AB + 3 caratteri qualsiasi
-- % = zero o più caratteri qualsiasi
-- _ = esattamente un carattere qualsiasi

Case-insensitive (PostgreSQL):

WHERE nome ILIKE 'm%'   -- trova sia 'Mario' che 'mario'

NULL:

WHERE email IS NULL
WHERE telefono IS NOT NULL