Guida completa e graduale alle query fondamentali
Per tutti gli esempi di questo tutorial, utilizzeremo la seguente tabella chiamata prodotti:
| id | nome | categoria | prezzo | quantita | fornitore |
|---|---|---|---|---|---|
| 1 | Laptop HP | Elettronica | 899.99 | 15 | TechStore |
| 2 | Mouse Wireless | Accessori | 29.99 | 150 | TechStore |
| 3 | Tastiera Meccanica | Accessori | 89.99 | 45 | KeyMaster |
| 4 | Monitor 27" | Elettronica | 349.99 | 22 | DisplayPro |
| 5 | Webcam HD | Accessori | 79.99 | 60 | TechStore |
| 6 | SSD 1TB | Componenti | 109.99 | 35 | StoragePlus |
| 7 | RAM 16GB | Componenti | 69.99 | 80 | StoragePlus |
| 8 | Stampante Laser | Elettronica | 199.99 | 12 | PrintWorld |
| 9 | Cuffie Bluetooth | Accessori | 149.99 | 40 | AudioMax |
| 10 | Tablet Samsung | Elettronica | 449.99 | 18 | TechStore |
Le istruzioni SELECT e FROM sono le fondamenta di ogni query SQL. SELECT specifica quali colonne vogliamo recuperare, mentre FROM indica da quale tabella prenderle.
SELECT colonna1, colonna2, ... FROM nome_tabella;
L'asterisco (*) è un carattere speciale che significa "tutte le colonne".
SELECT * FROM prodotti;
Risultato: Restituisce TUTTE le righe e TUTTE le colonne della tabella (vedi tabella di riferimento sopra)
È buona pratica selezionare solo le colonne di cui si ha effettivamente bisogno.
SELECT nome, prezzo FROM prodotti;
Risultato:
| nome | prezzo |
|---|---|
| Laptop HP | 899.99 |
| Mouse Wireless | 29.99 |
| Tastiera Meccanica | 89.99 |
| Monitor 27" | 349.99 |
| Webcam HD | 79.99 |
| SSD 1TB | 109.99 |
| RAM 16GB | 69.99 |
| Stampante Laser | 199.99 |
| Cuffie Bluetooth | 149.99 |
| Tablet Samsung | 449.99 |
SELECT categoria FROM prodotti;
Risultato:
| categoria |
|---|
| Elettronica |
| Accessori |
| Accessori |
| Elettronica |
| Accessori |
| Componenti |
| Componenti |
| Elettronica |
| Accessori |
| Elettronica |
Usando DISTINCT si eliminano i duplicati dai risultati.
SELECT DISTINCT categoria FROM prodotti;
Risultato:
| categoria |
|---|
| Elettronica |
| Accessori |
| Componenti |
La clausola WHERE permette di filtrare i risultati in base a condizioni specifiche. Solo le righe che soddisfano la condizione vengono restituite.
SELECT colonne FROM tabella WHERE condizione;
| Operatore | Descrizione | Esempio |
|---|---|---|
| = | Uguale a | prezzo = 100 |
| <> o != | Diverso da | categoria <> 'Accessori' |
| > | Maggiore di | prezzo > 50 |
| < | Minore di | quantita < 20 |
| >= | Maggiore o uguale | prezzo >= 100 |
| <= | Minore o uguale | quantita <= 50 |
SELECT nome, prezzo FROM prodotti WHERE prezzo > 100;
Risultato:
| nome | prezzo |
|---|---|
| Laptop HP | 899.99 |
| Monitor 27" | 349.99 |
| SSD 1TB | 109.99 |
| Stampante Laser | 199.99 |
| Cuffie Bluetooth | 149.99 |
| Tablet Samsung | 449.99 |
I valori testuali devono essere racchiusi tra apici singoli ('') o doppi ("").
SELECT nome, categoria, prezzo FROM prodotti WHERE categoria = 'Accessori';
Risultato:
| nome | categoria | prezzo |
|---|---|---|
| Mouse Wireless | Accessori | 29.99 |
| Tastiera Meccanica | Accessori | 89.99 |
| Webcam HD | Accessori | 79.99 |
| Cuffie Bluetooth | Accessori | 149.99 |
AND richiede che TUTTE le condizioni siano vere.
SELECT nome, categoria, prezzo FROM prodotti WHERE categoria = 'Accessori' AND prezzo < 100;
Risultato:
| nome | categoria | prezzo |
|---|---|---|
| Mouse Wireless | Accessori | 29.99 |
| Tastiera Meccanica | Accessori | 89.99 |
| Webcam HD | Accessori | 79.99 |
OR richiede che ALMENO UNA condizione sia vera.
SELECT nome, categoria, prezzo FROM prodotti WHERE categoria = 'Elettronica' OR prezzo < 50;
Risultato:
| nome | categoria | prezzo |
|---|---|---|
| Laptop HP | Elettronica | 899.99 |
| Mouse Wireless | Accessori | 29.99 |
| Monitor 27" | Elettronica | 349.99 |
| Stampante Laser | Elettronica | 199.99 |
| Tablet Samsung | Elettronica | 449.99 |
SELECT nome, prezzo FROM prodotti WHERE prezzo BETWEEN 50 AND 150;
Risultato:
| nome | prezzo |
|---|---|
| Tastiera Meccanica | 89.99 |
| Webcam HD | 79.99 |
| SSD 1TB | 109.99 |
| RAM 16GB | 69.99 |
| Cuffie Bluetooth | 149.99 |
SELECT nome, fornitore FROM prodotti WHERE fornitore IN ('TechStore', 'StoragePlus');
Risultato:
| nome | fornitore |
|---|---|
| Laptop HP | TechStore |
| Mouse Wireless | TechStore |
| Webcam HD | TechStore |
| SSD 1TB | StoragePlus |
| RAM 16GB | StoragePlus |
| Tablet Samsung | TechStore |
La parola chiave AS permette di assegnare un nome temporaneo (alias) a una colonna o a un'espressione nel risultato della query. Questo rende i risultati più leggibili.
SELECT colonna AS nuovo_nome FROM tabella;
SELECT nome AS nome_prodotto, prezzo AS prezzo_euro FROM prodotti WHERE categoria = 'Componenti';
Risultato:
| nome_prodotto | prezzo_euro |
|---|---|
| SSD 1TB | 109.99 |
| RAM 16GB | 69.99 |
Se l'alias contiene spazi, deve essere racchiuso tra apici o virgolette.
SELECT nome AS 'Nome Prodotto', prezzo AS 'Prezzo (€)', quantita AS 'Pezzi Disponibili' FROM prodotti WHERE quantita < 20;
Risultato:
| Nome Prodotto | Prezzo (€) | Pezzi Disponibili |
|---|---|---|
| Laptop HP | 899.99 | 15 |
| Stampante Laser | 199.99 | 12 |
| Tablet Samsung | 449.99 | 18 |
Gli alias sono particolarmente utili quando si creano colonne calcolate.
SELECT nome, prezzo, quantita, prezzo * quantita AS valore_magazzino FROM prodotti WHERE categoria = 'Elettronica';
Risultato:
| nome | prezzo | quantita | valore_magazzino |
|---|---|---|---|
| Laptop HP | 899.99 | 15 | 13499.85 |
| Monitor 27" | 349.99 | 22 | 7699.78 |
| Stampante Laser | 199.99 | 12 | 2399.88 |
| Tablet Samsung | 449.99 | 18 | 8099.82 |
SELECT nome prodotto invece di SELECT nome AS prodotto. Tuttavia, usare AS rende il codice più leggibile.
La clausola ORDER BY permette di ordinare i risultati in base a una o più colonne. L'ordinamento può essere ascendente (ASC) o discendente (DESC).
SELECT colonne FROM tabella ORDER BY colonna [ASC|DESC];
SELECT nome, prezzo FROM prodotti ORDER BY prezzo ASC;
Risultato:
| nome | prezzo |
|---|---|
| Mouse Wireless | 29.99 |
| RAM 16GB | 69.99 |
| Webcam HD | 79.99 |
| Tastiera Meccanica | 89.99 |
| SSD 1TB | 109.99 |
| Cuffie Bluetooth | 149.99 |
| Stampante Laser | 199.99 |
| Monitor 27" | 349.99 |
| Tablet Samsung | 449.99 |
| Laptop HP | 899.99 |
SELECT nome, quantita FROM prodotti ORDER BY quantita DESC;
Risultato:
| nome | quantita |
|---|---|
| Mouse Wireless | 150 |
| RAM 16GB | 80 |
| Webcam HD | 60 |
| Tastiera Meccanica | 45 |
| Cuffie Bluetooth | 40 |
| SSD 1TB | 35 |
| Monitor 27" | 22 |
| Tablet Samsung | 18 |
| Laptop HP | 15 |
| Stampante Laser | 12 |
È possibile ordinare per più colonne: prima si ordina per la prima colonna, poi per la seconda in caso di valori uguali.
SELECT nome, categoria, prezzo FROM prodotti ORDER BY categoria ASC, prezzo DESC;
Risultato:
| nome | categoria | prezzo |
|---|---|---|
| Cuffie Bluetooth | Accessori | 149.99 |
| Tastiera Meccanica | Accessori | 89.99 |
| Webcam HD | Accessori | 79.99 |
| Mouse Wireless | Accessori | 29.99 |
| SSD 1TB | Componenti | 109.99 |
| RAM 16GB | Componenti | 69.99 |
| Laptop HP | Elettronica | 899.99 |
| Tablet Samsung | Elettronica | 449.99 |
| Monitor 27" | Elettronica | 349.99 |
| Stampante Laser | Elettronica | 199.99 |
SELECT nome, fornitore FROM prodotti ORDER BY nome ASC;
Risultato:
| nome | fornitore |
|---|---|
| Cuffie Bluetooth | AudioMax |
| Laptop HP | TechStore |
| Monitor 27" | DisplayPro |
| Mouse Wireless | TechStore |
| RAM 16GB | StoragePlus |
| SSD 1TB | StoragePlus |
| Stampante Laser | PrintWorld |
| Tablet Samsung | TechStore |
| Tastiera Meccanica | KeyMaster |
| Webcam HD | TechStore |
La clausola LIMIT permette di limitare il numero di righe restituite dalla query. È utile per la paginazione o per visualizzare solo i primi N risultati.
SELECT colonne FROM tabella LIMIT numero;
SELECT colonne FROM tabella LIMIT offset, numero;
SELECT nome, prezzo FROM prodotti ORDER BY prezzo DESC LIMIT 5;
Risultato:
| nome | prezzo |
|---|---|
| Laptop HP | 899.99 |
| Tablet Samsung | 449.99 |
| Monitor 27" | 349.99 |
| Stampante Laser | 199.99 |
| Cuffie Bluetooth | 149.99 |
SELECT nome, prezzo FROM prodotti ORDER BY prezzo ASC LIMIT 3;
Risultato:
| nome | prezzo |
|---|---|
| Mouse Wireless | 29.99 |
| RAM 16GB | 69.99 |
| Webcam HD | 79.99 |
L'offset indica quante righe saltare prima di iniziare a restituire i risultati. Sintassi: LIMIT offset, count
SELECT nome, prezzo FROM prodotti ORDER BY prezzo DESC LIMIT 3, 3;
Risultato: (salta i primi 3, mostra i successivi 3)
| nome | prezzo |
|---|---|
| Stampante Laser | 199.99 |
| Cuffie Bluetooth | 149.99 |
| SSD 1TB | 109.99 |
LIMIT 0, 10LIMIT 10, 10LIMIT 20, 10LIMIT (pagina - 1) * elementi_per_pagina, elementi_per_pagina
L'operatore LIKE permette di cercare valori che corrispondono a un pattern (modello). Si usa con due caratteri speciali chiamati wildcard:
| Wildcard | Descrizione | Esempio |
|---|---|---|
| % | Rappresenta zero, uno o più caratteri qualsiasi | 'Ma%' trova "Mario", "Maria", "Marta" |
| _ | Rappresenta esattamente un singolo carattere | 'M_rio' trova "Mario" ma non "Maria" |
SELECT colonne FROM tabella WHERE colonna LIKE 'pattern';
SELECT nome, categoria FROM prodotti WHERE nome LIKE 'S%';
Risultato:
| nome | categoria |
|---|---|
| SSD 1TB | Componenti |
| Stampante Laser | Elettronica |
SELECT nome, categoria FROM prodotti WHERE nome LIKE '%B';
Risultato:
| nome | categoria |
|---|---|
| SSD 1TB | Componenti |
| RAM 16GB | Componenti |
SELECT nome, prezzo FROM prodotti WHERE nome LIKE '%Blue%';
Risultato:
| nome | prezzo |
|---|---|
| Cuffie Bluetooth | 149.99 |
SELECT nome FROM prodotti WHERE nome LIKE '%a%';
Risultato:
| nome |
|---|
| Laptop HP |
| Tastiera Meccanica |
| Webcam HD |
| Stampante Laser |
| Tablet Samsung |
SELECT nome FROM prodotti WHERE nome LIKE '%RAM-----';
Risultato:
| nome |
|---|
| RAM 16GB |
SELECT nome FROM prodotti WHERE nome NOT LIKE 'M%';
Risultato:
| nome |
|---|
| Laptop HP |
| Tastiera Meccanica |
| Webcam HD |
| SSD 1TB |
| RAM 16GB |
| Stampante Laser |
| Cuffie Bluetooth |
| Tablet Samsung |
Le funzioni aggregate eseguono calcoli su un insieme di valori e restituiscono un singolo risultato. Sono fondamentali per l'analisi dei dati.
| Funzione | Descrizione |
|---|---|
| MIN() | Restituisce il valore minimo |
| MAX() | Restituisce il valore massimo |
| AVG() | Calcola la media aritmetica |
| SUM() | Calcola la somma totale |
| COUNT() | Conta il numero di righe |
SELECT MIN(prezzo) AS prezzo_minimo FROM prodotti;
Risultato:
| prezzo_minimo |
|---|
| 29.99 |
SELECT MIN(prezzo) AS prezzo_minimo FROM prodotti WHERE categoria = 'Elettronica';
Risultato:
| prezzo_minimo |
|---|
| 199.99 |
SELECT MAX(prezzo) AS prezzo_massimo, MAX(quantita) AS quantita_massima FROM prodotti;
Risultato:
| prezzo_massimo | quantita_massima |
|---|---|
| 899.99 | 150 |
SELECT AVG(prezzo) AS prezzo_medio FROM prodotti;
Risultato:
| prezzo_medio |
|---|
| 242.989 |
SELECT ROUND(AVG(prezzo), 2) AS prezzo_medio FROM prodotti;
Risultato:
| prezzo_medio |
|---|
| 242.99 |
SELECT SUM(prezzo * quantita) AS valore_totale_magazzino FROM prodotti;
Risultato:
| valore_totale_magazzino |
|---|
| 54459.05 |
SELECT SUM(quantita) AS totale_pezzi FROM prodotti WHERE categoria = 'Accessori';
Risultato:
| totale_pezzi |
|---|
| 295 |
SELECT COUNT(*) AS numero_prodotti FROM prodotti;
Risultato:
| numero_prodotti |
|---|
| 10 |
SELECT COUNT(*) AS prodotti_techstore FROM prodotti WHERE fornitore = 'TechStore';
Risultato:
| prodotti_techstore |
|---|
| 4 |
SELECT COUNT(*) AS totale_prodotti, MIN(prezzo) AS prezzo_minimo, MAX(prezzo) AS prezzo_massimo, ROUND(AVG(prezzo), 2) AS prezzo_medio, SUM(quantita) AS totale_pezzi FROM prodotti;
Risultato:
| totale_prodotti | prezzo_minimo | prezzo_massimo | prezzo_medio | totale_pezzi |
|---|---|---|---|---|
| 10 | 29.99 | 899.99 | 242.99 | 477 |
Ora mettiamo insieme tutte le clausole apprese per creare query più complesse e utili nella pratica.
SELECT nome AS 'Nome Prodotto', prezzo AS 'Prezzo (€)', quantita AS 'Disponibilità' FROM prodotti WHERE categoria = 'Accessori' ORDER BY prezzo ASC LIMIT 3;
Risultato:
| Nome Prodotto | Prezzo (€) | Disponibilità |
|---|---|---|
| Mouse Wireless | 29.99 | 150 |
| Webcam HD | 79.99 | 60 |
| Tastiera Meccanica | 89.99 | 45 |
SELECT nome, prezzo, quantita, prezzo * quantita AS valore_magazzino FROM prodotti WHERE nome LIKE '%1%' OR nome LIKE '%2%' ORDER BY valore_magazzino DESC;
Risultato:
| nome | prezzo | quantita | valore_magazzino |
|---|---|---|---|
| Monitor 27" | 349.99 | 22 | 7699.78 |
| RAM 16GB | 69.99 | 80 | 5599.20 |
| SSD 1TB | 109.99 | 35 | 3849.65 |
SELECT COUNT(*) AS numero_prodotti, MIN(prezzo) AS min_prezzo, MAX(prezzo) AS max_prezzo, ROUND(AVG(prezzo), 2) AS media_prezzo, SUM(quantita) AS totale_pezzi FROM prodotti WHERE prezzo BETWEEN 50 AND 200;
Risultato:
| numero_prodotti | min_prezzo | max_prezzo | media_prezzo | totale_pezzi |
|---|---|---|---|---|
| 6 | 69.99 | 199.99 | 116.66 | 272 |
SELECT id AS codice, nome AS prodotto, categoria, prezzo AS 'prezzo_unitario', quantita, prezzo * quantita AS valore_totale FROM prodotti WHERE fornitore = 'TechStore' AND nome LIKE '%a%' ORDER BY prezzo DESC LIMIT 3;
Risultato:
| codice | prodotto | categoria | prezzo_unitario | quantita | valore_totale |
|---|---|---|---|---|---|
| 10 | Tablet Samsung | Elettronica | 449.99 | 18 | 8099.82 |
| 1 | Laptop HP | Elettronica | 899.99 | 15 | 13499.85 |
| 5 | Webcam HD | Accessori | 79.99 | 60 | 4799.40 |
L'ordine corretto delle clausole in una query SELECT è:
| Clausola/Funzione | Scopo | Esempio |
|---|---|---|
| SELECT | Seleziona colonne | SELECT nome, prezzo |
| FROM | Specifica la tabella | FROM prodotti |
| WHERE | Filtra i risultati | WHERE prezzo > 100 |
| AS | Rinomina colonne | prezzo AS costo |
| ORDER BY | Ordina i risultati | ORDER BY prezzo DESC |
| LIMIT | Limita i risultati | LIMIT 10 |
| LIKE | Ricerca pattern | WHERE nome LIKE '%phone%' |
| MIN() | Valore minimo | SELECT MIN(prezzo) |
| MAX() | Valore massimo | SELECT MAX(prezzo) |
| AVG() | Media | SELECT AVG(prezzo) |
| SUM() | Somma | SELECT SUM(quantita) |
| COUNT() | Conteggio | SELECT COUNT(*) |