MySQL da Riga di Comando — Tutorial 9: Subquery (Query Annidate)

Tutorial mysql da riga di comando by Antonio Parisi

In questo nono e ultimo modulo del percorso su MySQL da riga di comando, affrontiamo le Subquery (o query annidate): istruzioni SELECT inserite all’interno di un’altra query principale (SELECT, INSERT, UPDATE o DELETE). Le subquery permettono di risolvere problemi complessi eseguendo calcoli dinamici in un unico passaggio, senza dover dividere l’operazione in più comandi separati.

1. Subquery con Operatori di Confronto nella Clausola WHERE

Immaginiamo di voler trovare tutti gli ordini il cui valore è superiore alla media di tutti gli ordini presenti nel database. Invece di calcolare prima la media e poi inserire a mano il valore ottenuto, lasciamo che sia MySQL a fare tutto in un’unica query:

SQL

SELECT id_ordine, id_cliente, importo_totale 
FROM ordini 
WHERE importo_totale > (SELECT AVG(importo_totale) FROM ordini);

Output previsto

+-----------+------------+----------------+
| id_ordine | id_cliente | importo_totale |
+-----------+------------+----------------+
|         1 |          1 |         134.99 |
|         6 |          3 |         150.00 |
+-----------+------------+----------------+
2 rows in set (0.00 sec)
Come funziona: MySQL esegue prima la query interna tra parentesi (SELECT AVG(importo_totale) FROM ordini) e poi passa il valore calcolato alla query esterna come condizione del WHERE
.

2. Subquery con Operatore IN

L’operatore IN viene utilizzato quando la subquery interna restituisce un elenco di più valori.
Ad esempio, se vogliamo selezionare i dettagli di tutti i clienti che hanno effettuato almeno un ordine:

SQL

SELECT id_cliente, nome, cognome, email 
FROM clienti 
WHERE id_cliente IN (SELECT DISTINCT id_cliente FROM ordini);

Output previsto

+------------+-------+---------+------------------------------------+
| id_cliente | nome  | cognome | email                              |
+------------+-------+---------+------------------------------------+
|          1 | Mario | Rossi   | mario.rossi.aggiornato@esempio.com |
|          3 | Laura | Bianchi | laura.bianchi@esempio.com          |
|          4 | Elena | Neri    | elena.neri@esempio.com             |
+------------+-------+---------+------------------------------------+
3 rows in set (0.01 sec)
(Noterai che il cliente Paolo Gialli, registrato nel Tutorial 6 ma privo di ordini, viene opportunamente escluso dal risultato).

3. Subquery nella Clausola SELECT (Query Correlate)

Possiamo posizionare una subquery direttamente tra i campi da selezionare per generare una colonna calcolata dinamicamente.
Mostriamo l’elenco dei clienti affiancato dal numero totale di ordini effettuati da ciascuno:

SQL

SELECT c.nome, c.cognome, 
       (SELECT COUNT(*) FROM ordini o WHERE o.id_cliente = c.id_cliente) AS totale_ordini 
FROM clienti c;

Output previsto

+-------+---------+---------------+
| nome  | cognome | totale_ordini |
+-------+---------+---------------+
| Mario | Rossi   |             3 |
| Laura | Bianchi |             2 |
| Elena | Neri    |             1 |
| Paolo | Gialli  |             0 |
+-------+---------+---------------+
4 rows in set (0.00 sec)

4. Riepilogo dei Tutorials di MySQL da Riga di Comando

Con questo nono tutorial si chiude la serie introduttiva a MySQL tramite terminale. Durante questo percorso abbiamo trattato:
  1. Connessione e gestione DB: Accesso via XAMPP/CLI, CREATE DATABASE e USE.
  2. DDL (Data Definition Language): Tipi di dato, chiavi primarie, estrene e vincoli (FOREIGN KEY).
  3. DML (Data Manipulation Language): Inserimento dati (INSERT) e interrogazioni con SELECT, WHERE, ORDER BY, LIMIT.
  4. Modifica e cancellazione: UPDATE, DELETE e integrità referenziale (ON DELETE CASCADE).
  5. Aggregazione: COUNT, SUM, AVG, GROUP BY e HAVING.
  6. Relazioni tra tabelle: INNER JOIN, LEFT JOIN e gestione degli alias.
  7. Sicurezza e Backup: mysqldump per esportazione e ripristino su Windows (CMD) e Linux/Mac.
  8. DCL (Data Control Language): Creazione utenti, gestione privilegi con GRANT/REVOKE e FLUSH PRIVILEGES.
  9. Analisi avanzata: Subquery e query annidate.
Antonio Parisi

Antonio Parisi

Cloud Solution Architect



Torna in alto