🗃️ Tutorial SQL MariaDB

Guida completa e graduale alle query fondamentali

📊 Tabella di Riferimento

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
📝 Nota: Questa tabella contiene 10 prodotti con informazioni su nome, categoria, prezzo, quantità disponibile e fornitore. La useremo per tutti gli esempi seguenti.

1 SELECT e FROM

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;

Esempio 1: Selezionare tutte le colonne

L'asterisco (*) è un carattere speciale che significa "tutte le colonne".

Query:

SELECT * FROM prodotti;

Risultato: Restituisce TUTTE le righe e TUTTE le colonne della tabella (vedi tabella di riferimento sopra)

Esempio 2: Selezionare colonne specifiche

È buona pratica selezionare solo le colonne di cui si ha effettivamente bisogno.

Query:

SELECT nome, prezzo FROM prodotti;

Risultato:

nome prezzo
Laptop HP899.99
Mouse Wireless29.99
Tastiera Meccanica89.99
Monitor 27"349.99
Webcam HD79.99
SSD 1TB109.99
RAM 16GB69.99
Stampante Laser199.99
Cuffie Bluetooth149.99
Tablet Samsung449.99

Esempio 3: Selezionare una singola colonna

Query:

SELECT categoria FROM prodotti;

Risultato:

categoria
Elettronica
Accessori
Accessori
Elettronica
Accessori
Componenti
Componenti
Elettronica
Accessori
Elettronica

Esempio 4: SELECT DISTINCT - Valori unici

Usando DISTINCT si eliminano i duplicati dai risultati.

Query:

SELECT DISTINCT categoria FROM prodotti;

Risultato:

categoria
Elettronica
Accessori
Componenti
💡 Consiglio: Evita di usare SELECT * in produzione. Seleziona solo le colonne necessarie per migliorare le prestazioni.

2 WHERE - Filtrare i Risultati

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;

Operatori di Confronto

Operatore Descrizione Esempio
=Uguale aprezzo = 100
<> o !=Diverso dacategoria <> 'Accessori'
>Maggiore diprezzo > 50
<Minore diquantita < 20
>=Maggiore o ugualeprezzo >= 100
<=Minore o ugualequantita <= 50

Esempio 1: Confronto con valore numerico

Query: Prodotti con prezzo maggiore di 100€

SELECT nome, prezzo
FROM prodotti
WHERE prezzo > 100;

Risultato:

nome prezzo
Laptop HP899.99
Monitor 27"349.99
SSD 1TB109.99
Stampante Laser199.99
Cuffie Bluetooth149.99
Tablet Samsung449.99

Esempio 2: Confronto con stringa di testo

I valori testuali devono essere racchiusi tra apici singoli ('') o doppi ("").

Query: Prodotti della categoria "Accessori"

SELECT nome, categoria, prezzo
FROM prodotti
WHERE categoria = 'Accessori';

Risultato:

nome categoria prezzo
Mouse WirelessAccessori29.99
Tastiera MeccanicaAccessori89.99
Webcam HDAccessori79.99
Cuffie BluetoothAccessori149.99

Esempio 3: Condizioni multiple con AND

AND richiede che TUTTE le condizioni siano vere.

Query: Prodotti "Accessori" con prezzo inferiore a 100€

SELECT nome, categoria, prezzo
FROM prodotti
WHERE categoria = 'Accessori' AND prezzo < 100;

Risultato:

nome categoria prezzo
Mouse WirelessAccessori29.99
Tastiera MeccanicaAccessori89.99
Webcam HDAccessori79.99

Esempio 4: Condizioni multiple con OR

OR richiede che ALMENO UNA condizione sia vera.

Query: Prodotti "Elettronica" oppure con prezzo minore di 50€

SELECT nome, categoria, prezzo
FROM prodotti
WHERE categoria = 'Elettronica' OR prezzo < 50;

Risultato:

nome categoria prezzo
Laptop HPElettronica899.99
Mouse WirelessAccessori29.99
Monitor 27"Elettronica349.99
Stampante LaserElettronica199.99
Tablet SamsungElettronica449.99

Esempio 5: BETWEEN - Intervallo di valori

Query: Prodotti con prezzo tra 50€ e 150€

SELECT nome, prezzo
FROM prodotti
WHERE prezzo BETWEEN 50 AND 150;

Risultato:

nome prezzo
Tastiera Meccanica89.99
Webcam HD79.99
SSD 1TB109.99
RAM 16GB69.99
Cuffie Bluetooth149.99

Esempio 6: IN - Lista di valori

Query: Prodotti dei fornitori TechStore o StoragePlus

SELECT nome, fornitore
FROM prodotti
WHERE fornitore IN ('TechStore', 'StoragePlus');

Risultato:

nome fornitore
Laptop HPTechStore
Mouse WirelessTechStore
Webcam HDTechStore
SSD 1TBStoragePlus
RAM 16GBStoragePlus
Tablet SamsungTechStore
📝 Nota: Le condizioni WHERE sono case-sensitive in MariaDB di default. 'accessori' ≠ 'Accessori'. Usa la funzione LOWER() o UPPER() per confronti case-insensitive.

3 AS - Rinominare Colonne (Alias)

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;

Esempio 1: Alias semplice per una colonna

Query:

SELECT nome AS nome_prodotto,
       prezzo AS prezzo_euro
FROM prodotti
WHERE categoria = 'Componenti';

Risultato:

nome_prodotto prezzo_euro
SSD 1TB109.99
RAM 16GB69.99

Esempio 2: Alias con spazi (usando apici)

Se l'alias contiene spazi, deve essere racchiuso tra apici o virgolette.

Query:

SELECT nome AS 'Nome Prodotto',
       prezzo AS 'Prezzo (€)',
       quantita AS 'Pezzi Disponibili'
FROM prodotti
WHERE quantita < 20;

Risultato:

Nome Prodotto Prezzo (€) Pezzi Disponibili
Laptop HP899.9915
Stampante Laser199.9912
Tablet Samsung449.9918

Esempio 3: Alias per espressioni calcolate

Gli alias sono particolarmente utili quando si creano colonne calcolate.

Query: Calcolo del valore totale in magazzino

SELECT nome,
       prezzo,
       quantita,
       prezzo * quantita AS valore_magazzino
FROM prodotti
WHERE categoria = 'Elettronica';

Risultato:

nome prezzo quantita valore_magazzino
Laptop HP899.991513499.85
Monitor 27"349.99227699.78
Stampante Laser199.99122399.88
Tablet Samsung449.99188099.82
💡 Consiglio: La parola chiave AS è opzionale: puoi scrivere SELECT nome prodotto invece di SELECT nome AS prodotto. Tuttavia, usare AS rende il codice più leggibile.

4 ORDER BY - Ordinare i Risultati

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];

Esempio 1: Ordinamento ascendente (predefinito)

Query: Prodotti ordinati per prezzo (dal più economico)

SELECT nome, prezzo
FROM prodotti
ORDER BY prezzo ASC;

Risultato:

nome prezzo
Mouse Wireless29.99
RAM 16GB69.99
Webcam HD79.99
Tastiera Meccanica89.99
SSD 1TB109.99
Cuffie Bluetooth149.99
Stampante Laser199.99
Monitor 27"349.99
Tablet Samsung449.99
Laptop HP899.99

Esempio 2: Ordinamento discendente

Query: Prodotti ordinati per quantità (dalla più alta)

SELECT nome, quantita
FROM prodotti
ORDER BY quantita DESC;

Risultato:

nome quantita
Mouse Wireless150
RAM 16GB80
Webcam HD60
Tastiera Meccanica45
Cuffie Bluetooth40
SSD 1TB35
Monitor 27"22
Tablet Samsung18
Laptop HP15
Stampante Laser12

Esempio 3: Ordinamento su più colonne

È possibile ordinare per più colonne: prima si ordina per la prima colonna, poi per la seconda in caso di valori uguali.

Query: Prodotti ordinati per categoria, poi per prezzo

SELECT nome, categoria, prezzo
FROM prodotti
ORDER BY categoria ASC, prezzo DESC;

Risultato:

nome categoria prezzo
Cuffie BluetoothAccessori149.99
Tastiera MeccanicaAccessori89.99
Webcam HDAccessori79.99
Mouse WirelessAccessori29.99
SSD 1TBComponenti109.99
RAM 16GBComponenti69.99
Laptop HPElettronica899.99
Tablet SamsungElettronica449.99
Monitor 27"Elettronica349.99
Stampante LaserElettronica199.99

Esempio 4: Ordinamento alfabetico

Query: Prodotti in ordine alfabetico

SELECT nome, fornitore
FROM prodotti
ORDER BY nome ASC;

Risultato:

nome fornitore
Cuffie BluetoothAudioMax
Laptop HPTechStore
Monitor 27"DisplayPro
Mouse WirelessTechStore
RAM 16GBStoragePlus
SSD 1TBStoragePlus
Stampante LaserPrintWorld
Tablet SamsungTechStore
Tastiera MeccanicaKeyMaster
Webcam HDTechStore
📝 Nota: Se non specifichi ASC o DESC, l'ordinamento predefinito è ASC (ascendente).

5 LIMIT - Limitare i Risultati

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;

Esempio 1: Primi N risultati

Query: I 5 prodotti più costosi

SELECT nome, prezzo
FROM prodotti
ORDER BY prezzo DESC
LIMIT 5;

Risultato:

nome prezzo
Laptop HP899.99
Tablet Samsung449.99
Monitor 27"349.99
Stampante Laser199.99
Cuffie Bluetooth149.99

Esempio 2: I 3 prodotti più economici

Query:

SELECT nome, prezzo
FROM prodotti
ORDER BY prezzo ASC
LIMIT 3;

Risultato:

nome prezzo
Mouse Wireless29.99
RAM 16GB69.99
Webcam HD79.99

Esempio 3: LIMIT con OFFSET (paginazione)

L'offset indica quante righe saltare prima di iniziare a restituire i risultati. Sintassi: LIMIT offset, count

Query: Prodotti dalla posizione 4 alla 6 (salta i primi 3)

SELECT nome, prezzo
FROM prodotti
ORDER BY prezzo DESC
LIMIT 3, 3;

Risultato: (salta i primi 3, mostra i successivi 3)

nome prezzo
Stampante Laser199.99
Cuffie Bluetooth149.99
SSD 1TB109.99
💡 Paginazione: Per implementare la paginazione (es. 10 elementi per pagina):
  • Pagina 1: LIMIT 0, 10
  • Pagina 2: LIMIT 10, 10
  • Pagina 3: LIMIT 20, 10
Formula: LIMIT (pagina - 1) * elementi_per_pagina, elementi_per_pagina

6 LIKE - Ricerca con Pattern

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';

Esempio 1: Inizia con... (prefisso)

Query: Prodotti il cui nome inizia con "S"

SELECT nome, categoria
FROM prodotti
WHERE nome LIKE 'S%';

Risultato:

nome categoria
SSD 1TBComponenti
Stampante LaserElettronica

Esempio 2: Finisce con... (suffisso)

Query: Prodotti il cui nome finisce con "B"

SELECT nome, categoria
FROM prodotti
WHERE nome LIKE '%B';

Risultato:

nome categoria
SSD 1TBComponenti
RAM 16GBComponenti

Esempio 3: Contiene... (sottostringa)

Query: Prodotti che contengono "Blue" nel nome

SELECT nome, prezzo
FROM prodotti
WHERE nome LIKE '%Blue%';

Risultato:

nome prezzo
Cuffie Bluetooth149.99

Esempio 4: Pattern più complessi

Query: Prodotti che contengono "a" nel nome

SELECT nome
FROM prodotti
WHERE nome LIKE '%a%';

Risultato:

nome
Laptop HP
Tastiera Meccanica
Webcam HD
Stampante Laser
Tablet Samsung

Esempio 5: Usando underscore (_)

Query: Prodotti con esattamente 5 caratteri dopo "RAM"

SELECT nome
FROM prodotti
WHERE nome LIKE '%RAM-----';

Risultato:

nome
RAM 16GB

Esempio 6: NOT LIKE - Escludere pattern

Query: Prodotti che NON iniziano con "M"

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
⚠️ Attenzione: L'operatore LIKE può essere lento su grandi dataset, specialmente con pattern che iniziano con % (es. '%testo'). In questi casi, considera l'uso di uno strumento più avanzato come gli indici FULLTEXT (https://www.mrw.it/lez/ricerche-full-text-mysql/).

7 Funzioni Aggregate: MIN, MAX, AVG, SUM, COUNT

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

MIN() - Valore Minimo

Query: Prezzo più basso

SELECT MIN(prezzo) AS prezzo_minimo
FROM prodotti;

Risultato:

prezzo_minimo
29.99

Query: Prezzo minimo per categoria "Elettronica"

SELECT MIN(prezzo) AS prezzo_minimo
FROM prodotti
WHERE categoria = 'Elettronica';

Risultato:

prezzo_minimo
199.99

MAX() - Valore Massimo

Query: Prezzo più alto e quantità massima

SELECT MAX(prezzo) AS prezzo_massimo,
       MAX(quantita) AS quantita_massima
FROM prodotti;

Risultato:

prezzo_massimo quantita_massima
899.99150

AVG() - Media

Query: Prezzo medio di tutti i prodotti

SELECT AVG(prezzo) AS prezzo_medio
FROM prodotti;

Risultato:

prezzo_medio
242.989

Query: Prezzo medio arrotondato con ROUND()

SELECT ROUND(AVG(prezzo), 2) AS prezzo_medio
FROM prodotti;

Risultato:

prezzo_medio
242.99

SUM() - Somma

Query: Valore totale del magazzino

SELECT SUM(prezzo * quantita) AS valore_totale_magazzino
FROM prodotti;

Risultato:

valore_totale_magazzino
54459.05

Query: Quantità totale per categoria "Accessori"

SELECT SUM(quantita) AS totale_pezzi
FROM prodotti
WHERE categoria = 'Accessori';

Risultato:

totale_pezzi
295

COUNT() - Conteggio

Query: Numero totale di prodotti

SELECT COUNT(*) AS numero_prodotti
FROM prodotti;

Risultato:

numero_prodotti
10

Query: Numero di prodotti per fornitore TechStore

SELECT COUNT(*) AS prodotti_techstore
FROM prodotti
WHERE fornitore = 'TechStore';

Risultato:

prodotti_techstore
4

Combinare più funzioni aggregate

Query: Riepilogo statistico dei prezzi

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
📝 Nota: COUNT(*) conta tutte le righe, incluse quelle con valori NULL. COUNT(colonna) conta solo le righe dove quella specifica colonna non è NULL.

8 Query Combinate - Esempi Avanzati

Ora mettiamo insieme tutte le clausole apprese per creare query più complesse e utili nella pratica.

Esempio 1: Report prodotti economici

Query: I 5 prodotti più economici della categoria Accessori, ordinati per nome

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 Wireless29.99150
Webcam HD79.9960
Tastiera Meccanica89.9945

Esempio 2: Ricerca con pattern e ordinamento

Query: Prodotti che contengono numeri nel nome, ordinati per valore magazzino

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.99227699.78
RAM 16GB69.99805599.20
SSD 1TB109.99353849.65

Esempio 3: Statistiche filtrate

Query: Statistiche dei prodotti con prezzo tra 50€ e 200€

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

Esempio 4: Query complessa con tutte le clausole

Query: Top 3 prodotti più costosi di TechStore con "a" nel nome

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
💡 Ordine delle clausole SQL:

L'ordine corretto delle clausole in una query SELECT è:

  1. SELECT - quali colonne
  2. FROM - da quale tabella
  3. WHERE - condizioni di filtro
  4. ORDER BY - ordinamento
  5. LIMIT - limitazione risultati

📋 Riepilogo Rapido

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(*)