MIN, MAX e aggregazione non numerica
Aggregare date e stringhe e comprendere il significato di MIN applicato al testo
MIN, MAX e aggregazione non numerica è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.
MIN e MAX oltre i numeri
I candidati presumono che MIN e MAX funzionino solo sui numeri. Gli intervistatori amano chiedere: "Che cosa restituisce MAX(name)? E MIN(order_date)?"
La verità è che MIN e MAX funzionano con qualsiasi tipo ordinabile — numeri, date e stringhe. La vera competenza verificata è comprendere le regole di ordinamento di ciascun tipo.
Il caso numerico
Parta dal caso più familiare. Nelle colonne numeriche, MIN restituisce il valore più piccolo e MAX quello più grande. È semplice.
Come le altre funzioni di aggregazione, MIN e MAX ignorano i NULL. Un NULL non è mai il valore minimo o massimo: viene semplicemente ignorato. Se ogni valore è NULL, entrambe restituiscono NULL.
SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;MIN e MAX sulle date
Le date e i timestamp sono completamente ordinabili, quindi MIN(order_date) restituisce la data più antica e MAX(order_date) quella più recente.
In questo modo si risponde a «quando è stato effettuato il primo ordine?» (MIN) e «qual è l’attività più recente?» (MAX) senza ordinare e limitare i risultati. È la soluzione idiomatica basata sugli insiemi.
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS latest_order
FROM orders;Intervallo di date in un'unica query
Una domanda successiva comune è: «Da quanto tempo questo cliente è attivo?» Si combinano MIN e MAX e poi si calcola la differenza.
In questo modo si calcola l'intervallo tra il primo e l'ultimo ordine. La sintassi esatta della sottrazione varia a seconda del dialetto, ma l'idea di MIN/MAX è universale e dimostra che si possono esprimere gli intervalli in modo dichiarativo.
SELECT
customer_id,
MIN(order_date) AS first_order,
MAX(order_date) AS last_order,
MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;MIN e MAX sulle stringhe
Ecco l'aspetto che sorprende molte persone. Sulle colonne testuali, MIN e MAX usano un ordinamento lessicografico (alfabetico) basato sulla collation della colonna.
Quindi MIN(name) restituisce il nome che viene prima nell'ordinamento alfabetico e MAX(name) quello che viene dopo. MIN sull'insieme {'Carol', 'Alice', 'Bob'} restituisce 'Alice'; MAX restituisce 'Carol'.
SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'Collation e distinzione tra maiuscole e minuscole
L'ordinamento delle stringhe dipende dalla collation, che controlla la distinzione tra maiuscole e minuscole e le regole locali. Con molte collation predefinite, le lettere maiuscole possono venire prima delle minuscole, quindi MAX di {'apple', 'Banana'} potrebbe riservare sorprese.
In un colloquio, specifichi che i risultati di MIN/MAX sulle stringhe dipendono dalla collation. Questa precisazione distingue una risposta imparata a memoria da una comprensione autentica.
Cosa NON significa MIN(text)
Un'idea errata frequente è che MIN(name) restituisca la stringa più corta o che MAX(name) restituisca quella più lunga. Non è così. Si tratta esclusivamente dell'ordine di ordinamento, non della lunghezza.
Se serve davvero la stringa più lunga, si ordina per LENGTH(name) e si seleziona la prima riga, oppure si usa MAX(LENGTH(name)) per ottenere solo la lunghezza. Non bisogna confondere l'ordinamento dei valori con la lunghezza.
SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;MIN/MAX non combinano le colonne
Un'insidia importante: MIN e MAX operano indipendentemente su una singola colonna. Non restituiscono l'intera riga che contiene il valore minimo o massimo.
Se si scrive SELECT MIN(salary), name senza GROUP BY, non si ottiene il nome della persona con lo stipendio più basso — si ottiene un errore oppure un nome arbitrario, a seconda del dialetto. Per recuperare l'intera riga, si usano ORDER BY + LIMIT oppure una funzione finestra.
-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;Riepilogo del comportamento di NULL per MIN/MAX
Come SUM e AVG, MIN e MAX ignorano i NULL. Un NULL non è né il valore più piccolo né quello più grande.
- Valori misti + NULL: i NULL vengono ignorati e vengono restituiti il minimo e il massimo effettivi.
- Solo NULL o nessuna riga: MIN e MAX restituiscono NULL.
Questa coerenza tra le funzioni di aggregazione è un punto chiaro da ricordare: «Tutte le funzioni di aggregazione standard ignorano i NULL».
Inserirlo in un raggruppamento
MIN e MAX sono particolarmente utili con GROUP BY per trovare gli estremi di ogni gruppo. «Stipendio più alto per reparto» è un esempio classico.
Il risultato contiene una riga per reparto con lo stipendio massimo di quel reparto. Ricordi: viene restituito il valore, non il dipendente. Abbinare il nome al valore è un problema separato e molto comune.
SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;Come rispondere con sicurezza
Una risposta efficace in un colloquio è: «MIN e MAX funzionano su qualsiasi tipo ordinabile. Per i numeri indicano il valore più piccolo e quello più grande; per le date la più antica e la più recente; per le stringhe usano l'ordine alfabetico determinato dalla collation della colonna. Ignorano i NULL e restituiscono NULL solo quando non esiste alcun valore non NULL. Restituiscono un singolo valore, non l'intera riga, quindi per recuperare la riga userei ORDER BY con LIMIT oppure una funzione finestra.»
Verifica rapida
Rifletta sull'aggregazione di stringhe.
Riepilogo
Tutto ciò che riguarda MIN e MAX:
- Funzionano su qualsiasi tipo ordinabile: numeri, date e stringhe.
- Per le stringhe usano l'ordine alfabetico/della collation, non la lunghezza.
- Date: MIN = la più antica, MAX = la più recente.
- Ignorano i NULL; se tutti i valori sono NULL o non ci sono righe, restituiscono NULL.
- Restituiscono un valore, non l'intera riga — per quella si usano ORDER BY + LIMIT.
Prossimo argomento: cosa succede quando si usano funzioni di aggregazione senza GROUP BY.
Domande Frequenti
La lezione «MIN, MAX e aggregazione non numerica» è gratuita?
Sì — il testo completo di «MIN, MAX e aggregazione non numerica» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.
Cosa imparerò in «MIN, MAX e aggregazione non numerica»?
Aggregare date e stringhe e comprendere il significato di MIN applicato al testo Eserciti Coding Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Coding Interview Prep?
Non è richiesta alcuna esperienza precedente. Coding Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «MIN, MAX e aggregazione non numerica»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Coding Interview Prep?
Sì. Ogni lezione Coding Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- COUNT(*) contro COUNT(column) e COUNT(DISTINCT)
- SUM e AVG con i NULL
- MIN, MAX e aggregazione non numerica
- Aggregati senza GROUP BY