0Pricing
Coding Interview Prep · Lezione

Ordinamento su più colonne e posizione dei NULL

Combinare ASC e DESC e capire come NULLS FIRST/LAST varia tra i database

Ordinamento su più colonne e posizione dei NULL è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 1 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.

Perché l'ordinamento compare nei colloqui

Gli intervistatori passano presto a ORDER BY perché così verificano se si comprende che un insieme di risultati SQL è non ordinato per impostazione predefinita. Senza un ordinamento esplicito, il database è libero di restituire le righe nell'ordine che preferisce.

Una domanda introduttiva frequente è: "Come garantisce che le righe vengano restituite in un ordine specifico?" L'unica risposta corretta è una clausola ORDER BY esplicita. Affidarsi all'ordine di inserimento, all'ordine della chiave primaria o all'ordine dell'indice è un classico errore da principiante.

In questa lezione imparerà a gestire gli ordinamenti su più colonne e la domanda insidiosa su dove finiscono i valori NULL.

Nozioni di base su ASC e DESC

ORDER BY ordina in senso crescente (ASC) per impostazione predefinita. È sufficiente usare DESC per invertire l'ordine. La direzione si applica a ogni colonna, non all'intera clausola.

Consiglio per il colloquio: specifichi che ASC è il valore predefinito implicito, quindi non è necessario scriverlo. Molti candidati pensano erroneamente che un solo DESC inverta l'ordine di tutte le colonne.

SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;

Ordinamento su più colonne

Elencare diverse colonne separate da virgole. SQL ordina in base alla prima colonna, poi risolve i pareggi con la seconda e così via. È utile pensarlo come una catena di criteri di spareggio.

L'esempio ordina prima per reparto in ordine alfabetico e, all'interno di ogni reparto, per stipendio dal più alto al più basso.

  • Ordinamento principale: department crescente
  • Criterio di spareggio: salary decrescente
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;

Combinare ASC e DESC

Una trappola frequente nei colloqui: ogni colonna ha una direzione propria. Scrivere ORDER BY a, b DESC ordina a in senso crescente e b in senso decrescente, non entrambe le colonne in senso decrescente.

Se si desidera ordinare entrambe le colonne in senso decrescente, è necessario scrivere ORDER BY a DESC, b DESC. Occorre essere espliciti quando la domanda combina direzioni diverse.

SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;

Dove finiscono i valori NULL?

Questo è il cuore della lezione. NULL significa sconosciuto, quindi lo standard non impone una posizione e i database non concordano sul comportamento predefinito:

  • PostgreSQL & Oracle: i valori NULL vengono ordinati per ultimi in ASC e per primi in DESC.
  • MySQL & SQL Server: i valori NULL vengono ordinati per primi in ASC e per ultimi in DESC (sono trattati come il valore più piccolo).

Agli intervistatori piace molto chiedere: "Dove compaiono i valori NULL in questo ordinamento?" La risposta corretta è: dipende dal motore, a meno che non si controlli esplicitamente il comportamento.

Controllare esplicitamente la posizione dei NULL

Per rendere deterministica la posizione indipendentemente dai valori predefiniti del motore, usare NULLS FIRST o NULLS LAST. PostgreSQL, Oracle e SQLite supportano direttamente questa sintassi.

La query seguente forza le date di assunzione sconosciute in fondo, anche se la colonna è ordinata in senso crescente.

SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;

Simulare NULLS LAST in MySQL

MySQL non supporta la parola chiave NULLS LAST. La soluzione portabile consiste nell'usare una chiave di ordinamento iniziale che indichi se il valore è NULL.

L'espressione hire_date IS NULL restituisce 0 per le date effettive e 1 per i valori NULL. Ordinare questa espressione in senso crescente spinge i valori NULL alla fine; la seconda chiave ordina poi le date effettive.

SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;

Simulare NULLS FIRST in SQL Server

Anche SQL Server non supporta NULLS FIRST/LAST. Usare un'espressione CASE come chiave di ordinamento iniziale. Qui ai valori NULL viene assegnato il rango 0, quindi compaiono per primi.

Vale la pena memorizzare questo schema: una colonna indicatrice calcolata, posizionata prima della colonna di ordinamento effettiva, consente di controllare completamente la posizione dei valori NULL in qualsiasi dialetto.

SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
         hire_date ASC;

Esempio svolto: classifica

Supponga di creare una classifica: prima il punteggio più alto e, a parità di punteggio, il giocatore che si è registrato prima. I giocatori che non hanno mai ottenuto un punteggio (punteggio NULL) devono comparire in fondo.

L'ordinamento richiede tre chiavi: un indicatore dei valori NULL, il punteggio in ordine decrescente e la data di registrazione in ordine crescente come criterio di spareggio.

SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
         score DESC,
         signup_date ASC;

Nota sulla stabilità dell'ordinamento

Un'altra domanda molto comune è: "Se due righe hanno valori uguali per ogni chiave di ORDER BY, in quale ordine vengono restituite?"

Risposta: non definito. Gli ordinamenti SQL non sono garantiti stabili, quindi le righe uguali possono comparire in qualsiasi ordine relativo, che può anche cambiare tra un'esecuzione e l'altra o dopo una modifica dell'indice.

La soluzione consiste nell'aggiungere un criterio di spareggio completamente univoco, di solito una chiave primaria, così da rendere il risultato riproducibile.

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;

Nota sulle prestazioni dell'ordinamento

L'ordinamento può essere costoso. Se ORDER BY corrisponde a un indice esistente con lo stesso ordine delle colonne e le stesse direzioni, il motore può leggere le righe già ordinate ed evitare un passaggio di ordinamento separato.

Direzioni non corrispondenti (per esempio, quando l'indice è interamente crescente ma una colonna viene ordinata in senso decrescente) di solito impediscono questo vantaggio e costringono a un ordinamento in memoria o su disco. Menzionare il collegamento tra ordine dell'indice e costo dell'ordinamento dimostra maturità durante un colloquio.

Verifica rapida

Verifichi di aver compreso le regole delle direzioni negli ordinamenti su più colonne.

Riepilogo

Punti chiave sull'ordinamento su più colonne e sulla posizione dei valori NULL:

  • Gli insiemi di risultati non sono ordinati se non si aggiunge ORDER BY.
  • La direzione è specifica per ogni colonna; ASC è il valore predefinito.
  • La posizione dei valori NULL varia in base al motore: ultimi in ASC per Postgres/Oracle, primi in ASC per MySQL/SQL Server.
  • Usare NULLS FIRST/LAST dove supportato, oppure un indicatore iniziale IS NULL / CASE negli altri casi.
  • Aggiungere un criterio di spareggio univoco, come la chiave primaria, per ottenere un ordine riproducibile.

Domande Frequenti

La lezione «Ordinamento su più colonne e posizione dei NULL» è gratuita?

Sì — il testo completo di «Ordinamento su più colonne e posizione dei NULL» è 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 «Ordinamento su più colonne e posizione dei NULL»?

Combinare ASC e DESC e capire come NULLS FIRST/LAST varia tra i database 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 1 di 4.

Quanto tempo richiede la lezione «Ordinamento su più colonne e posizione dei NULL»?

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

  1. Ordinamento su più colonne e posizione dei NULL
  2. LIMIT, OFFSET e FETCH FIRST
  3. Restituire in modo affidabile le righe Top-N
  4. Ordinare per espressioni e alias
← Torna a Coding Interview Prep