Lezione 10: Gestire i Duplicati e Rinominare i Risultati con DISTINCT e Alias in MySQL

Impara a eliminare i duplicati dai risultati di una query con DISTINCT e a rendere i tuoi report più leggibili utilizzando gli Alias (AS).

Introduzione alla Lezione 10

Benvenuti alla decima lezione del nostro corso "Impara MySQL in 45 lezioni". Nelle lezioni precedenti abbiamo imparato come selezionare dati da una tabella e come filtrare i risultati utilizzando la clausola WHERE. Tuttavia, quando lavoriamo con database reali, ci troviamo spesso di fronte a due problemi comuni: l'eccesso di dati ridondanti e nomi di colonne che non sono chiari o professionali per chi dovrà leggere il report finale.

In questa lezione esploreremo due strumenti fondamentali del linguaggio SQL: l'operatore DISTINCT e l'uso degli Alias. Sebbene sembrino semplici, l'uso corretto di queste funzionalità permette di trasformare una query grezza in un vero e proprio strumento di analisi dati, migliorando sia l'efficienza dell'estrazione che la leggibilità dell'output.

L'operatore DISTINCT: Eliminare i Duplicati

Immaginiamo di avere una tabella chiamata clienti che contiene una colonna citta. Se abbiamo 1000 clienti, ma molti di loro vivono nella stessa città, una semplice query come SELECT citta FROM clienti; ci restituirà 1000 righe, molte delle quali identiche (ad esempio, "Roma" potrebbe apparire 200 volte).

Questo comportamento è corretto dal punto di vista tecnico, ma è inutile se il nostro obiettivo è sapere quali città sono rappresentate nel nostro database, non quanti clienti ci sono per ogni città.

Come funziona DISTINCT

L'operatore DISTINCT viene inserito immediatamente dopo la parola chiave SELECT. La sua funzione è quella di istruire MySQL a scansionare i risultati e a restituire solo i valori univoci. Se due o più righe hanno lo stesso valore per le colonne selezionate, MySQL ne mostrerà solo una.

Perché usare DISTINCT?

  1. Analisi dei dati: Per ottenere l'elenco delle categorie di prodotti presenti in un e-commerce senza ripetizioni.
  2. Ottimizzazione della lettura: Ridurre il volume di dati trasferiti dal server al client quando i duplicati non sono necessari.
  3. Validazione: Verificare rapidamente quanti valori diversi esistono in una determinata colonna.

Esempio di codice: DISTINCT

Consideriamo una tabella ordini con le seguenti colonne: id_ordine, data_ordine, id_cliente.

-- Query standard: restituisce tutti gli id_cliente per ogni ordine effettuato
SELECT id_cliente FROM ordini;

-- Query con DISTINCT: restituisce l'elenco dei clienti che hanno effettuato almeno un ordine, senza ripetizioni
SELECT DISTINCT id_cliente FROM ordini;

In questo esempio, se il cliente con ID 5 ha effettuato 10 ordini, la prima query mostrerà il numero 5 per dieci volte. La seconda query, grazie a DISTINCT, mostrerà il numero 5 una sola volta. È fondamentale notare che DISTINCT agisce sull'intera riga selezionata: se selezionassimo SELECT DISTINCT id_cliente, data_ordine, MySQL eliminerebbe i duplicati solo se entrambi i valori fossero identici.

Gli Alias: Dare un nome ai risultati con AS

Spesso, i nomi delle colonne nel database sono tecnici, abbreviati o scritti in inglese (es. usr_first_name_v2). Se dobbiamo esportare questi dati in un report per un cliente o mostrarli in una tabella HTML su un sito web, questi nomi non sono appropriati.

Qui entrano in gioco gli Alias. Un alias è un nome temporaneo assegnato a una colonna o a una tabella per la durata di una singola query. Si definisce utilizzando la parola chiave AS.

Perché usare gli Alias?

L'uso degli alias non modifica la struttura della tabella nel database; cambia solo il modo in cui l'intestazione della colonna appare nel set di risultati.

  • Leggibilità: Trasformare prod_price_discounted in Prezzo Scontato.
  • Chiarezza nelle operazioni: Quando eseguiamo calcoli (come somme o medie), MySQL assegna un nome automatico al risultato (es. COUNT(*)). L'alias ci permette di dare un nome significativo, come Totale_Ordini.
  • Semplificazione: In query complesse con più tabelle (JOIN), gli alias aiutano a distinguere colonne con lo stesso nome provenienti da tabelle diverse.

Esempio di codice: Alias sulle colonne

Vediamo come applicare gli alias in una query pratica.

-- Senza alias: l'intestazione sarà 'nome', 'cognome' e 'email'
SELECT nome, cognome, email FROM utenti;

-- Con alias: l'intestazione sarà più professionale e chiara
SELECT 
    nome AS 'Nome Utente', 
    cognome AS 'Cognome Utente', 
    email AS 'Indirizzo Email'
FROM utenti;

In questo caso, abbiamo utilizzato le virgolette singole per l'alias perché contengono spazi. Se l'alias è un'unica parola (es. nome AS utente), le virgolette non sono obbligatorie, ma sono consigliate per mantenere la coerenza.

Combinare DISTINCT e Alias

La vera potenza di questi strumenti emerge quando vengono utilizzati insieme. Immaginiamo di voler creare un report che elenchi tutte le categorie di prodotti disponibili nel nostro magazzino, ma vogliamo che l'intestazione della colonna sia chiara per l'ufficio marketing.

Esempio di codice: Combinazione

-- Vogliamo l'elenco univoco delle categorie, rinominando la colonna
SELECT DISTINCT categoria AS 'Categoria Prodotto' 
FROM prodotti 
ORDER BY `Categoria Prodotto` ASC;

In questa query, MySQL prima filtra i valori univoci della colonna categoria e poi rinomina l'intestazione della colonna risultante in "Categoria Prodotto". Infine, ordiniamo i risultati alfabeticamente utilizzando l'alias stesso nella clausola ORDER BY (una funzionalità supportata da MySQL).

Esempi Pratici e Casi d'Uso Reali

Per consolidare questi concetti, analizziamo due scenari tipici dello sviluppo web.

Caso 1: Gestione di un Blog

Supponiamo di avere una tabella articoli con una colonna tag. Molti articoli condividono lo stesso tag (es. "MySQL", "Web Design"). Se vogliamo creare una sidebar nel sito che mostri tutti i tag esistenti per permettere all'utente di filtrare i contenuti, non possiamo mostrare ogni singola istanza del tag.

Query corretta: SELECT DISTINCT tag AS 'Argomento' FROM articoli;

Questo restituirà una lista pulita di argomenti univoci, pronta per essere iterata in un ciclo PHP o JavaScript per generare i link della sidebar.

Caso 2: Report di Vendite

Immaginiamo di dover calcolare il totale degli ordini per un cliente specifico utilizzando una funzione di aggregazione come SUM().

Query senza alias: SELECT SUM(totale) FROM ordini WHERE cliente_id = 10; Il risultato avrà un'intestazione come SUM(totale), che è scomoda da gestire nel codice applicativo.

Query con alias: SELECT SUM(totale) AS spesa_totale FROM ordini WHERE cliente_id = 10; Ora, nel codice PHP, potrai accedere al valore semplicemente chiamando la chiave spesa_totale dall'array dei risultati.

Errori comuni e FAQ

L'errore del "DISTINCT su più colonne"

Un errore frequente per i principianti è pensare che DISTINCT possa essere applicato a una sola colonna mentre se ne selezionano altre.

Sbagliato: SELECT DISTINCT nome, email FROM utenti; (Se l'utente ha lo stesso nome ma email diverse, appariranno entrambi. Se ha lo stesso nome e stessa email, apparirà una volta sola).

Se vuoi i valori univoci di una sola colonna ma vuoi comunque recuperare altre informazioni, dovrai utilizzare tecniche più avanzate come GROUP BY o sotto-query, che vedremo nelle lezioni successive.

Alias e Clausola WHERE

Un altro dubbio comune riguarda l'uso dell'alias nella clausola WHERE.

Errore: SELECT nome AS n FROM utenti WHERE n = 'Mario';

Questo genererà un errore perché MySQL elabora la clausola WHERE prima di assegnare gli alias nella clausola SELECT. Per filtrare i dati, devi usare il nome originale della colonna: SELECT nome AS n FROM utenti WHERE nome = 'Mario';

Prossimi Passi

Ora che hai padroneggiato l'eliminazione dei duplicati con DISTINCT e la rinomina delle colonne con AS, sei pronto per affrontare concetti più complessi di manipolazione dei dati.

Per approfondire, ti suggeriamo di:

  1. Esercitarti: Prova a creare una tabella di test con dati ripetuti e sperimenta diverse combinazioni di DISTINCT.
  2. Studiare le Funzioni di Aggregazione: Scopri come COUNT(), SUM() e AVG() lavorano perfettamente insieme agli alias per creare report statistici.
  3. Esplorare GROUP BY: Se DISTINCT ti sembra limitato, la clausola GROUP BY è l'evoluzione naturale per raggruppare i dati in modo più potente.

Nella prossima lezione, vedremo come utilizzare le funzioni di aggregazione per estrarre statistiche preziose dai tuoi database!