Le subquery sono uno strumento molto utile per eseguire interrogazioni complesse in SQL. Tuttavia, quando si desidera ordinare i risultati di una subquery in un ordine specifico, è necessario fare attenzione all’uso della clausola ORDER BY. In questo articolo, spiegheremo in dettaglio come ordinare i risultati di una subquery utilizzando ORDER BY.
Uso base delle subquery
Una subquery è una query utilizzata all’interno di un’altra query. Le subquery sono racchiuse tra parentesi e vengono utilizzate come parte di istruzioni SQL come SELECT, INSERT, UPDATE e DELETE. Utilizzare subquery consente di costruire query più complesse e di estrarre dati in base a determinate condizioni.
Struttura di base di una subquery
Una subquery ha la seguente struttura:
SELECT column1, column2
FROM (SELECT column1, column2 FROM table WHERE condition) AS subquery_alias;
Come mostrato, le subquery consentono di eseguire nuove query utilizzando i risultati di altre query.
Uso base della clausola ORDER BY
La clausola ORDER BY viene utilizzata per ordinare i risultati di una query in un ordine specifico. Di solito, si ordina in modo crescente (ASC) o decrescente (DESC).
Struttura di base della clausola ORDER BY
La clausola ORDER BY viene posta alla fine di una query SELECT ed è utilizzata nel seguente modo:
SELECT column1, column2
FROM table
WHERE condition
ORDER BY column1 ASC, column2 DESC;
Esempio di utilizzo di ORDER BY
Ad esempio, la seguente query ordina i nomi dei dipendenti della tabella employees
in ordine alfabetico:
SELECT first_name, last_name
FROM employees
ORDER BY last_name ASC, first_name ASC;
In questo modo, è possibile utilizzare la clausola ORDER BY per ordinare i risultati come desiderato.
Limitazioni di ORDER BY all’interno delle subquery
Quando si utilizza la clausola ORDER BY all’interno di una subquery, esistono alcune limitazioni. In particolare, se la subquery non restituisce direttamente i risultati, la clausola ORDER BY potrebbe non avere effetto.
Invalidazione di ORDER BY nelle subquery
In alcuni casi, anche se si utilizza la clausola ORDER BY all’interno di una subquery, la query esterna potrebbe ignorare quell’ordine. Ad esempio, nella seguente query, la clausola ORDER BY all’interno della subquery viene ignorata:
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name) AS subquery;
In questo caso, poiché la query esterna non contiene una clausola ORDER BY, il set di risultati non viene ordinato.
Punti da tenere a mente quando si utilizza ORDER BY nelle subquery
La clausola ORDER BY all’interno di una subquery è efficace solo quando viene utilizzata in combinazione con clausole come TOP o LIMIT. Ad esempio, è possibile combinare ORDER BY con LIMIT come segue:
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name LIMIT 10) AS subquery;
In questo caso, la subquery ordina i risultati e restituisce solo i primi 10, che vengono poi passati alla query esterna.
Come ordinare i risultati di una subquery con ORDER BY
Per ordinare i risultati di una subquery in un ordine specifico, è necessario utilizzare la clausola ORDER BY all’esterno della subquery. In questo modo, l’intero set di risultati della subquery verrà ordinato.
Metodo base per ordinare i risultati di una subquery
Prima si ottengono i dati necessari tramite una subquery, quindi si utilizza la clausola ORDER BY nella query esterna per ordinarli. Ecco un esempio:
SELECT *
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
In questa query, vengono selezionati i dipendenti con department_id
pari a 10 tramite la subquery e i risultati vengono ordinati per hire_date
in ordine decrescente.
Esempi pratici
Ad esempio, per ottenere i dati di vendita di una specifica categoria di prodotti tramite una subquery e ordinarli per importo delle vendite, si può utilizzare la seguente query:
SELECT product_name, total_sales
FROM (
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales
WHERE category = 'Electronics'
GROUP BY product_name
) AS subquery
ORDER BY total_sales DESC;
In questa query, vengono calcolate le vendite totali per i prodotti della categoria Electronics
e i risultati vengono ordinati per importo delle vendite in ordine decrescente.
Punti chiave quando si utilizza ORDER BY con le subquery
Quando si utilizza ORDER BY all’interno di una subquery, è importante ricordare che l’ordine può essere ignorato dalla query esterna. Pertanto, è necessario utilizzare la clausola ORDER BY nella query esterna per garantire che i risultati vengano ordinati correttamente.
Esempi di query SQL che includono subquery
Di seguito vengono forniti alcuni esempi concreti di query SQL che includono subquery. Questi esempi illustrano come utilizzare correttamente le subquery e combinare la clausola ORDER BY per ottenere i risultati desiderati.
Ordinare i dipendenti per data di assunzione
La seguente query mostra i dipendenti di un determinato dipartimento ordinati per data di assunzione:
SELECT first_name, last_name, hire_date
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
Questa query estrae i dipendenti con department_id
pari a 10 e li ordina per data di assunzione in ordine decrescente.
Ordinare i dati di vendita
La seguente query calcola le vendite per categoria di prodotti e le ordina per importo di vendita:
SELECT product_name, total_sales
FROM (
SELECT product_name, SUM(sales_amount) AS total_sales
FROM sales
WHERE category = 'Electronics'
GROUP BY product_name
) AS subquery
ORDER BY total_sales DESC;
Questa query calcola il totale delle vendite per ogni prodotto della categoria Electronics
e ordina i risultati per importo delle vendite in ordine decrescente.
Elenco dei clienti con gli ordini più recenti
La seguente query mostra l’elenco dei clienti con gli ordini più recenti, ordinati per data dell’ordine:
SELECT customer_name, last_order_date
FROM (
SELECT customer_name, MAX(order_date) AS last_order_date
FROM orders
GROUP BY customer_name
) AS subquery
ORDER BY last_order_date DESC;
Questa query estrae la data dell’ultimo ordine per ogni cliente e ordina i risultati per data dell’ordine in ordine decrescente.
Ordinare i migliori prodotti per categoria
La seguente query estrae i prodotti con le vendite più alte per ciascuna categoria e li ordina per importo delle vendite:
SELECT category, product_name, total_sales
FROM (
SELECT category, product_name, total_sales,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY total_sales DESC) AS rank
FROM (
SELECT category, product_name, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category, product_name
) AS subquery
) AS ranked_products
WHERE rank = 1
ORDER BY total_sales DESC;
Questa query classifica i prodotti per importo delle vendite all’interno di ciascuna categoria, estrae solo i prodotti in cima alla classifica e li ordina per importo delle vendite in ordine decrescente.
Attraverso questi esempi, dovresti aver acquisito una buona comprensione di come utilizzare subquery e clausole ORDER BY insieme per ordinare i risultati di query complesse.
Conclusione
Le subquery sono uno strumento potente per costruire query SQL complesse. Sono particolarmente utili quando si desidera filtrare una parte dei dati ed eseguire ulteriori operazioni sui risultati. Tuttavia, è importante ricordare che la clausola ORDER BY all’interno di una subquery non avrà effetto sulla query esterna, quindi è necessario utilizzare ORDER BY nella query esterna per ordinare i risultati finali. Combinare subquery e ORDER BY consente di gestire efficacemente interrogazioni complesse e di ottenere i dati desiderati in modo efficiente.