4 – Query di Selezione
SELECT: selezione e filtro dei dati (base)
Schema di lavoro (tabella di esempio)
Usiamo una tabella chiamata prodotti con questa struttura:
CREATE TABLE prodotti (
id INTEGER PRIMARY KEY,
nome VARCHAR(100),
categoria VARCHAR(50),
prezzo DECIMAL(10,2),
disponibilita INTEGER,
data_inserimento DATE
);
Dati di esempio (INSERT)
Ecco alcuni record di prova che puoi inserire per seguire gli esempi:
INSERT INTO prodotti (id, nome, categoria, prezzo, disponibilita, data_inserimento) VALUES
(1, 'Maglietta Basic', 'Abbigliamento', 19.90, 120, '2024-01-15'),
(2, 'Sneakers Run', 'Calzature', 89.50, 45, '2024-02-10'),
(3, 'Zaino Trek', 'Accessori', 59.00, 30, '2024-03-05'),
(4, 'Giacca Invernale', 'Abbigliamento', 149.00, 12, '2023-11-20'),
(5, 'Cappello Lana', 'Accessori', 25.00, 0, '2024-01-05'),
(6, 'Sandali Mare', 'Calzature', 34.90, 60, '2024-05-01'),
(7, 'Felpa con Cappuccio', 'Abbigliamento', 49.90, 80, '2024-04-12'),
(8, 'Calze Sport', 'Accessori', 7.50, 200, '2024-06-02');
SELECT base
Selezionare tutte le colonne da tutti i prodotti:
SELECT * FROM prodotti;
Selezionare solo alcune colonne (id, nome, prezzo):
SELECT id, nome, prezzo FROM prodotti;
Uso della clausola WHERE (filtrare righe)
Esempio: prodotti della categoria 'Abbigliamento':
SELECT * FROM prodotti
WHERE categoria = 'Abbigliamento';
Esempio: prodotti con prezzo maggiore di 50 euro:
SELECT id, nome, prezzo FROM prodotti
WHERE prezzo > 50;
Operatori di confronto utili: =, <>, !=, >, <, >=, <=
Operatori logici: AND, OR, NOT
Combinare più condizioni:
Esempio: prodotti in stock (disponibilita > 0) e prezzo <= 50:
SELECT id, nome, categoria, prezzo, disponibilita FROM prodotti
WHERE disponibilita > 0 AND prezzo <= 50;
Esempio: prodotti della categoria 'Accessori' oppure 'Calzature':
SELECT id, nome, categoria FROM prodotti
WHERE categoria = 'Accessori' OR categoria = 'Calzature';
Esempio: prodotti NON disponibili (disponibilita = 0):
SELECT id, nome FROM prodotti
WHERE NOT (disponibilita > 0);
Uso delle espressioni complesse:
Esempio: prodotti con prezzo tra 20 e 100 e appartenenti a 'Calzature' o 'Abbigliamento':
SELECT id, nome, categoria, prezzo FROM prodotti
WHERE prezzo BETWEEN 20 AND 100
AND (categoria = 'Calzature' OR categoria = 'Abbigliamento');
Nota: BETWEEN è inclusivo (equivale a prezzo >= 20 AND prezzo <= 100).
Ordinamento dei risultati: ORDER BY
Ordinare i prodotti per prezzo crescente:
SELECT id, nome, prezzo FROM prodotti
ORDER BY prezzo ASC;
Ordinare per categoria (asc) e poi per prezzo (desc):
SELECT id, nome, categoria, prezzo FROM prodotti
ORDER BY categoria ASC, prezzo DESC;
Limitazione dei risultati: LIMIT (o TOP)
Mostrare solo i primi 5 prodotti più economici:
SELECT id, nome, prezzo FROM prodotti
ORDER BY prezzo ASC
LIMIT 5;
In SQL Server si usa TOP: SELECT TOP 5 ...
Alias delle colonne: AS
Rinominare colonne nel risultato con alias leggibili:
SELECT id AS codice, nome AS prodotto, prezzo AS prezzo_euro FROM prodotti;
Alias su espressioni:
Calcolare prezzo scontato del 10% e mostrare con alias:
SELECT id, nome, prezzo, (prezzo * 0.90) AS prezzo_scontato FROM prodotti;
Esempi combinati: query pratiche
-
Estrarre nome, categoria e prezzo dei prodotti disponibili (disponibilita > 0), ordinati per disponibilita decrescente:
SELECT nome, categoria, prezzo, disponibilita
FROM prodotti
WHERE disponibilita > 0
ORDER BY disponibilita DESC;
-
Estrarre i 3 prodotti più recenti (per data_inserimento):
SELECT id, nome, data_inserimento
FROM prodotti
ORDER BY data_inserimento DESC
LIMIT 3;
-
Lista prodotti 'Abbigliamento' con prezzo compreso tra 20 e 100, mostrando prezzo scontato 15%:
SELECT id, nome, prezzo, (prezzo * 0.85) AS prezzo_sconto15
FROM prodotti
WHERE categoria = 'Abbigliamento'
AND prezzo BETWEEN 20 AND 100
ORDER BY prezzo ASC;
Esercizio proposto (con soluzione completa)
Esercizio: dalla tabella prodotti estrai gli articoli che:
• appartengono alle categorie 'Abbigliamento' o 'Calzature';
• sono disponibili (disponibilita > 0);
• hanno prezzo inferiore a 100 euro;
• mostra il risultato con colonne id, nome, categoria, prezzo e prezzo_scontato al 10%;
• ordina i risultati per prezzo crescente;
• limita l'output ai primi 5 record.
Query risolutiva:
SELECT id,
nome,
categoria,
prezzo,
(prezzo * 0.90) AS prezzo_scontato
FROM prodotti
WHERE (categoria = 'Abbigliamento' OR categoria = 'Calzature')
AND disponibilita > 0
AND prezzo < 100
ORDER BY prezzo ASC
LIMIT 5;
Esecuzione sui dati di esempio: risultati attesi
Dati di partenza rilevanti (dalla tabella di esempio):
id nome categoria prezzo disponibilita
1 Maglietta Basic Abbigliamento 19.90 120
7 Felpa con Cappuccio Abbigliamento 49.90 80
2 Sneakers Run Calzature 89.50 45
6 Sandali Mare Calzature 34.90 60
4 Giacca Invernale Abbigliamento 149.00 12 <-- esclusa (prezzo >=100)
Applicando la query otteniamo (ordinati per prezzo crescente):
id | nome | categoria | prezzo | prezzo_scontato
1 | Maglietta Basic | Abbigliamento | 19.90 | 17.91
6 | Sandali Mare | Calzature | 34.90 | 31.41
7 | Felpa con Cappuccio | Abbigliamento | 49.90 | 44.91
2 | Sneakers Run | Calzature | 89.50 | 80.55
(Questi sono 4 record; LIMIT 5 non taglia nulla se i risultati sono meno di 5.)
Calcoli:
prezzo_scontato = prezzo * 0.90
es. Maglietta Basic: 19.90 * 0.90 = 17.91
Suggerimenti pratici e best practice
• Valida sempre i tipi di dato: confronto numerico su campo testo porta errori.
• Usa gli indici sulle colonne usate frequentemente in WHERE e ORDER BY (es. categoria, prezzo) per migliorare prestazioni.
• Per confronti case-insensitive con stringhe, valuta LOWER(categoria) = 'abbigliamento' o funzioni del DBMS.
• Evita SELECT * in produzione: specifica sempre le colonne richieste.
• Per paginazione, combina ORDER BY con LIMIT e OFFSET (es. LIMIT 10 OFFSET 20).
Estensioni utili (cenni)
• LIKE per filtri testuali (es. WHERE nome LIKE '%Sneakers%').
• IN per condizioni multiple: WHERE categoria IN ('Abbigliamento','Calzature').
• IS NULL / IS NOT NULL per valori mancanti.
• Funzioni di aggregazione e GROUP BY per riepiloghi (es. COUNT, AVG, SUM) — trattati nei moduli successivi.

Nessun commento:
Posta un commento