🔍 DQL — Data Query Language

MariaDB · Ogni query spiegata con il suo obiettivo

1️⃣ SELECT — Leggere colonne specifiche

Voglio estrarre solo alcune colonne da una tabella
SELECT nome, email
FROM utenti;
Voglio estrarre TUTTE le colonne da una tabella
SELECT *
FROM utenti;

2️⃣ WHERE — Filtrare i risultati

Voglio solo gli utenti maggiorenni di Roma
SELECT nome, eta
FROM utenti
WHERE eta > 18
  AND citta = 'Roma';
OperatoreObiettivoEsempio
= != < >Confronto esatto / diversoeta != 18
BETWEENValori in un intervalloeta BETWEEN 18 AND 30
IN (…)Valori dentro una listacitta IN ('Roma','Milano')
LIKECercare un pattern nel testonome LIKE 'M%'
IS NULLTrovare valori vuotiemail IS NULL
💡 LIKE 'M%' → inizia con M  |  LIKE '%o' → finisce con o  |  LIKE '%mi%' → contiene "mi"

3️⃣ ORDER BY & LIMIT — Ordinare e limitare

Voglio i 10 prodotti più cari, dal più costoso al meno costoso
SELECT nome, prezzo
FROM prodotti
ORDER BY prezzo DESC
LIMIT 10;
Voglio ordinare per cognome e poi per nome, entrambi crescenti
SELECT nome, cognome
FROM utenti
ORDER BY cognome ASC, nome ASC;

4️⃣ AS — Rinominare le colonne nel risultato

Voglio che le colonne del risultato abbiano nomi più leggibili
SELECT nome AS nome_utente,
       prezzo * 1.22 AS prezzo_ivato
FROM prodotti;

5️⃣ DISTINCT — Eliminare i duplicati

Voglio la lista delle città senza ripetizioni
SELECT DISTINCT citta
FROM utenti;

6️⃣ Funzioni aggregate — Calcoli sui dati

Voglio sapere quanti prodotti ci sono, il prezzo medio, il minimo e il massimo
SELECT
  COUNT(*)        AS totale_prodotti,
  AVG(prezzo)         AS prezzo_medio,
  MIN(prezzo)         AS prezzo_minimo,
  MAX(prezzo)         AS prezzo_massimo
FROM prodotti;

7️⃣ GROUP BY & HAVING — Raggruppare e filtrare gruppi

Voglio contare quanti utenti ci sono per ogni città
SELECT citta, COUNT(*) AS n_utenti
FROM utenti
GROUP BY citta;
Voglio contare quanti utenti ci sono per ogni città con più di 5 utenti
SELECT citta, COUNT(*) AS n_utenti
FROM utenti
GROUP BY citta
HAVING COUNT(*) > 5;
💡 WHERE filtra le righe PRIMA del raggruppamento · HAVING filtra i gruppi DOPO

8️⃣ JOIN — Unire dati da più tabelle

Voglio il nome dell'utente e la data del suo ordine (dati da 2 tabelle)
SELECT u.nome, o.data_ordine
FROM utenti u
INNER JOIN ordini o ON u.id = o.utente_id;
JOINObiettivo
INNER JOINSolo righe che esistono in entrambe le tabelle
LEFT JOINTutte le righe della tabella sinistra + match a destra
RIGHT JOINTutte le righe della tabella destra + match a sinistra

9️⃣ Subquery — Usare il risultato di una query dentro un'altra

Voglio i nomi degli utenti che hanno fatto almeno un ordine sopra i 100€
SELECT nome
FROM utenti
WHERE id IN (
    SELECT utente_id
    FROM ordini
    WHERE totale > 100
);

🔟 UNION — Unire i risultati di due query

Voglio un'unica lista di nomi presi sia da clienti che da fornitori (senza duplicati)
SELECT nome FROM clienti
UNION
SELECT nome FROM fornitori;
💡 UNION rimuove i duplicati · usa UNION ALL se vuoi tenerli

🧠 Procedimento — Scrivi la query in 5 domande

Parti dal tuo obiettivo e rispondi a queste domande in ordine. Ogni risposta = un pezzo della query.

1
COSA voglio vedere nel risultato?
→ Scrivi SELECT colonna1, colonna2, ...
2
DA DOVE prendo i dati?
→ Scrivi FROM nome_tabella
3
DEVO FILTRARE qualcosa? (es. solo utenti di Roma, solo prezzi > 10…)
→ Scrivi WHERE condizione
Se no → salta al punto 4
4
DEVO RAGGRUPPARE o fare calcoli per gruppo? (es. conto utenti per città…)
→ Scrivi GROUP BY colonna + eventuale HAVING
Se no → salta al punto 5
5
COME ORDINO i risultati? Quanti ne voglio?
→ Scrivi ORDER BY colonna ASC/DESC + LIMIT n
Esempio rapido:
"Voglio i nomi dei clienti di Milano, ordinati per nome"

1️⃣ COSA → SELECT nome
2️⃣ DA DOVE → FROM clienti
3️⃣ FILTRO → WHERE citta = 'Milano'
4️⃣ RAGGRUPPO → no, salto
5️⃣ ORDINE → ORDER BY nome ASC

🔑 SELECT nome FROM clienti WHERE citta = 'Milano' ORDER BY nome ASC;

📋 Casi Tipici — Obiettivo → Query Pronta

🎯 Obiettivo ✅ Query Soluzione
SELECT Mostrami nome e email di tutti gli utenti
SELECT nome, email FROM utenti;
SELECT Mostrami tutti i dati dei prodotti
SELECT * FROM prodotti;
WHERE Trova tutti gli utenti con età maggiore di 25 anni
SELECT * FROM utenti WHERE eta > 25;
WHERE Trova i prodotti con prezzo tra 10€ e 50€
SELECT * FROM prodotti WHERE prezzo BETWEEN 10 AND 50;
WHERE Trova gli utenti il cui nome inizia con "Mar"
SELECT * FROM utenti WHERE nome LIKE 'Mar%';
WHERE Trova gli utenti senza email
SELECT * FROM utenti WHERE email IS NULL;
WHERE Trova i prodotti di categoria "Elettronica" O "Informatica"
SELECT * FROM prodotti WHERE categoria IN ('Elettronica', 'Informatica');
ORDER Mostra i 5 prodotti più cari
SELECT nome, prezzo FROM prodotti ORDER BY prezzo DESC LIMIT 5;
AGG Quanti utenti ci sono in totale?
SELECT COUNT(*) FROM utenti;
AGG Qual è il prezzo medio dei prodotti?
SELECT AVG(prezzo) FROM prodotti;
GROUP Quanti utenti ci sono per ogni città?
SELECT citta, COUNT(*) AS n_utenti FROM utenti GROUP BY citta;
GROUP Qual è il prezzo massimo per ogni categoria?
SELECT categoria, MAX(prezzo) FROM prodotti GROUP BY categoria;
HAVING Mostra solo le categorie con più di 3 prodotti
SELECT categoria, COUNT(*) FROM prodotti GROUP BY categoria HAVING COUNT(*) > 3;
JOIN Mostra nome utente e data ordine per ogni ordine
SELECT u.nome, o.data_ordine
FROM utenti u
INNER JOIN ordini o ON u.id = o.utente_id;
JOIN Mostra TUTTI gli utenti anche se non hanno mai ordinato
SELECT u.nome, o.data_ordine
FROM utenti u
LEFT JOIN ordini o ON u.id = o.utente_id;
DISTINCT Quali sono le categorie diverse dei prodotti?
SELECT DISTINCT categoria FROM prodotti;
AS Mostra il prezzo IVA inclusa (prezzo × 1.22) con nome "Prezzo Finale"
SELECT nome, prezzo * 1.22 AS 'Prezzo Finale' FROM prodotti;
SUB Trova gli utenti che hanno fatto almeno un ordine
SELECT nome FROM utenti
WHERE id IN (SELECT utente_id FROM ordini);
UNION Unisci i nomi di clienti e fornitori in un'unica lista
SELECT nome FROM clienti
UNION
SELECT nome FROM fornitori;
WHERE Trova i prodotti il cui nome contiene "phone"
SELECT * FROM prodotti WHERE nome LIKE '%phone%';