Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

Prontuario di base di SQL

Scarica questo prontuario di 2 pagine sulle Basi di SQL in formato PDF o PNG, stampalo e attaccalo alla tua scrivania.

Il Cheat Sheet di SQL per principianti fornisce la sintassi di tutte le clausole di base, mostra come scrivere le diverse condizioni e contiene esempi.

Opzioni di scaricamento:

Prima pagina del prontuario sulle basi di SQL Seconda pagina del prontuario sulle basi di SQL

Puoi leggere i contenuti anche qui:

SQL, o Structured Query Language, è un linguaggio per comunicare con i database. Viene utilizzato per selezionare dati specifici e creare report complessi. Oggi SQL è diventato un linguaggio universale per i dati, usato praticamente in tutte le tecnologie che elaborano dati.

Dati d'esempio

DATI D'ESEMPIO

Query su una singola tabella

Recuperare tutte le colonne dalla tabella paesi:

SELECT *
FROM paesi;

Visualizzare le colonne id e nome dalla tabella citta:

SELECT id, nome
FROM citta;

Ottenere i nomi delle città ordinati in base alla colonna classificazione in ordine ascendente:

SELECT nome
FROM citta
ORDER BY classificazione ASC;

Selezionare i nomi delle città ordinati in base alla colonna classificazione in ordine discendente:

SELECT nome
FROM citta
ORDER BY classificazione DESC;

Alias

Colonne

SELECT nome AS nome_citta
FROM citta;

Tabelle

SELECT pa.nome, ci.nome
FROM citta AS ci
JOIN paesi AS pa
  ON ci.id_paese = pa.id;

Risultati di filtraggio

Operatori di confronto

Selezionare i nomi delle città con classificazione maggiore di 3:

SELECT nome
FROM citta
WHERE classificazione > 3;

Ottenere i nomi delle città che non sono né Berlino né Madrid:

SELECT nome
FROM citta
WHERE nome != 'Berlino'
  AND nome != 'Madrid';

Operatori di testo

Ricerca di nomi di città che iniziano con una "P" o finiscono con una "s":

SELECT nome
FROM citta
WHERE nome LIKE 'P%'
  OR nome LIKE '%s';

Ricerca di nomi di città che iniziano con qualsiasi lettera seguita da "ublino" (come Dublino in Irlanda o Lublino in Polonia):

SELECT nome
FROM citta
WHERE nome LIKE '_ublino';

Altri operatori

Selezionare i nomi delle città con una popolazione compresa tra 500.000 e 5 milioni di abitanti:

SELECT nome
FROM citta
WHERE popolazione BETWEEN 500000 AND 5000000;

Visualizzare i nomi delle città che non hanno un valore di classificazione:

SELECT nome
FROM citta
WHERE classificazione IS NOT NULL;

Ottenere i nomi delle città situate in Paesi il cui identificatore è 1, 4, 7 o 8:

SELECT nome
FROM citta
WHERE id_paese IN (1, 4, 7, 8);

Query su più tabelle

INNER JOIN

JOIN (o con il nome completo INNER JOIN) restituisce le righe con valori che corrispondono in entrambe le tabelle.

SELECT citta.nome, paesi.nome
FROM citta
[INNER] JOIN paesi
  ON citta.id_paese = paesi.id;
INNER JOIN

LEFT JOIN

LEFT JOIN restituisce tutte le righe della tabella di sinistra con le righe corrispondenti della tabella di destra. Se non ci sono righe corrispondenti, i valori restituiti dalla seconda tabella saranno NULL.

SELECT citta.nome, paesi.nome
FROM citta
LEFT JOIN paesi
  ON citta.id_paese = paesi.id;
LEFT JOIN

RIGHT JOIN

RIGHT JOIN restituisce tutte le righe della tabella di destra con le righe corrispondenti della tabella di sinistra. Se non ci sono righe corrispondenti, i valori restituiti dalla seconda tabella saranno NULL.

SELECT citta.nome, paesi.nome
FROM citta
RIGHT JOIN paesi
  ON citta.id_paese = paesi.id;
RIGHT JOIN

FULL JOIN

FULL JOIN (o con il nome completo FULL OUTER JOIN) restituisce tutte le righe di entrambe le tabelle - se non c'è una riga corrispondente nella seconda tabella, vengono restituiti i valori NULL.

SELECT citta.nome, paesi.nome
FROM citta
FULL [OUTER] JOIN paesi
  ON citta.id_paese = paesi.id;
FULL JOIN

CROSS JOIN

CROSS JOIN restituisce tutte le possibili combinazioni di righe delle due tabelle. Sono disponibili due sintassi.

SELECT citta.nome, paesi.nome
FROM citta
CROSS JOIN paesi;

SELECT citta.nome, paesi.nome
FROM citta, paesi;
CROSS JOIN

NATURAL JOIN

NATURAL JOIN collega le tabelle in base a tutte le colonne con lo stesso nome.

SELECT citta.nome, paesi.nome
FROM citta
NATURAL JOIN paesi;
NATURAL JOIN

NATURAL JOIN utilizza queste colonne per abbinare le righe:
citta.id, citta.nome, paesi.id, paesi.nome.
NATURAL JOIN è usato molto raramente nella pratica.

Aggregazione e raggruppamento

GROUP BY raggruppa le righe con gli stessi valori nelle colonne specificate. Genera sommatorie (aggregati) per ogni combinazione unica di valori.

Aggregazione e raggruppamento

Funzioni di aggregazione

  • avg(espr) – valore medio delle righe del gruppo
  • count(espr) – numero di valori per le righe del gruppo
  • max(espr) – valore massimo del gruppo
  • min(espr) – valore minimo del gruppo
  • sum(espr) – somma dei valori del gruppo

Esempio di query

Trovare il numero di città:

SELECT COUNT(*)
FROM citta;

Trovare il numero di città con un punteggio non nullo:

SELECT COUNT(classificazione)
FROM citta;

Trovare il numero di valori distinti per i Paesi:

SELECT COUNT(DISTINCT id_paese)
FROM citta;

Trovare i Paesi con la popolazione più piccola e più grande:

SELECT MIN(popolazione), MAX(popolazione)
FROM paesi;

Determinare la popolazione totale delle città nei rispettivi Paesi:

SELECT id_paese, SUM(popolazione)
FROM citta
GROUP BY id_paese;

Determinare la classificazione media delle città nei rispettivi Paesi, se la media è superiore a 3,0:

SELECT id_paese, AVG(classificazione)
FROM citta
GROUP BY id_paese
HAVING AVG(classificazione) > 3.0;

Subquery

Una subquery è una query annidata in un'altra query o in un'altra subquery. Esistono diversi tipi di sottoquery.

Valore singolo

La subquery più semplice restituisce esattamente una colonna e una riga. Può essere utilizzata con gli operatori di confronto =, <, <=, > o >=.

Questa query viene utilizzata per trovare le città che hanno la stessa classificazione di Parigi:

SELECT nome
FROM citta
WHERE classificazione = (
  SELECT classificazione
  FROM citta
  WHERE nome = 'Parigi'
);

Valori multipli

Una sottoquery può anche restituire più colonne o più righe. Queste sottoquery possono essere utilizzate con gli operatori IN, EXISTS, ALL o ANY.

Questa query trova le città dei Paesi con più di 20 milioni di abitanti:

SELECT nome
FROM citta
WHERE id_paese IN (
  SELECT id_paese
  FROM paese
  WHERE popolazione > 20000000
);

Subquery correlata

Una sottoquery correlata si riferisce alle tabelle inserite nella query esterna. Una sottoquery correlata dipende dalla query esterna. Non può essere eseguita indipendentemente dalla query esterna.

Questa query cerca le città la cui popolazione è superiore alla popolazione media del Paese:

SELECT *
FROM citta citta_principale
WHERE popolazione > (
  SELECT AVG(popolazione)
  FROM citta citta_media
  WHERE citta_media.id_paese = citta_principale.id_paese
);

Questa query cerca i Paesi con almeno una città:

SELECT nome
FROM paesi
WHERE EXISTS (
  SELECT *
  FROM citta
  WHERE id_paese = paesi.id
);

Operazioni di set

Le operazioni di set vengono utilizzate per combinare i risultati di due o più query in un unico risultato. Le query combinate devono restituire lo stesso numero di colonne e tipi di dati compatibili. I nomi delle colonne corrispondenti possono essere diversi.

Operazioni di set

UNION

UNION combina i risultati di due set di dati ed esclude i duplicati. UNION ALL non esclude le righe duplicate.

Questa query visualizza i ciclisti e i pattinatori tedeschi:

SELECT nome
FROM ciclismo
WHERE paese = 'DE'
UNION / UNION ALL
SELECT nome
FROM pattinaggio
WHERE paese = 'DE';
UNION

INTERSECT

INTERSECT restituisce solo le righe che compaiono in entrambi gli insiemi di risultati.

Questa ricerca mostra i ciclisti tedeschi che sono anche pattinatori tedeschi allo stesso tempo:

SELECT nome
FROM ciclismo
WHERE paese = 'DE'
INTERSECT
SELECT nome
FROM pattinaggio
WHERE paese = 'DE';
INTERSECT

EXCEPT

EXCEPT restituisce solo le righe che compaiono nel primo insieme di risultati, ma non nel secondo.

Questa query visualizza i ciclisti tedeschi, a meno che non siano anche pattinatori tedeschi allo stesso tempo:

SELECT nome
FROM ciclismo
WHERE paese = 'DE'
EXCEPT / MINUS
SELECT nome
FROM pattinaggio
WHERE paese = 'DE';
EXCEPT