Ao realizar consultas complexas no SQL, subconsultas são uma técnica altamente eficaz. No entanto, ao querer ordenar o resultado de uma subconsulta em uma ordem específica, é preciso tomar cuidado ao utilizar a cláusula ORDER BY. Neste artigo, explicaremos em detalhes como ordenar o resultado de uma subconsulta utilizando ORDER BY.
Uso básico de subconsultas
Uma subconsulta é uma consulta que é usada dentro de outra consulta. Subconsultas são cercadas por parênteses e utilizadas como parte de instruções SQL como SELECT, INSERT, UPDATE e DELETE. O uso de subconsultas permite construir consultas mais complexas e extrair dados com base em condições específicas.
Estrutura básica de uma subconsulta
Uma subconsulta possui a seguinte estrutura:
SELECT column1, column2
FROM (SELECT column1, column2 FROM table WHERE condition) AS subquery_alias;
Como mostrado acima, é possível executar uma nova consulta utilizando os resultados de outra consulta por meio de subconsultas.
Uso básico de ORDER BY
A cláusula ORDER BY é utilizada para ordenar o conjunto de resultados de uma consulta em uma ordem específica. Normalmente, os dados são classificados em ordem ascendente (ASC) ou descendente (DESC).
Estrutura básica da cláusula ORDER BY
A cláusula ORDER BY é colocada no final da instrução SELECT e é utilizada da seguinte forma:
SELECT column1, column2
FROM table
WHERE condition
ORDER BY column1 ASC, column2 DESC;
Exemplo de uso de ORDER BY
Por exemplo, a seguinte consulta obtém os nomes dos funcionários da tabela employees
, ordenados em ordem alfabética:
SELECT first_name, last_name
FROM employees
ORDER BY last_name ASC, first_name ASC;
Com o uso da cláusula ORDER BY, é possível organizar o conjunto de resultados na ordem desejada.
Restrições ao usar ORDER BY em subconsultas
Há algumas restrições ao usar a cláusula ORDER BY dentro de subconsultas. Em particular, se a subconsulta não retornar diretamente o resultado, a cláusula ORDER BY não terá efeito.
Invalidação da cláusula ORDER BY em subconsultas
Mesmo que uma cláusula ORDER BY seja usada dentro de uma subconsulta, a consulta externa pode ignorar essa ordem. Por exemplo, na consulta abaixo, a cláusula ORDER BY na subconsulta é ignorada:
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name) AS subquery;
Nesse caso, como a consulta externa não contém uma cláusula ORDER BY, o conjunto de resultados permanece sem ordenação.
Considerações ao usar ORDER BY em subconsultas
O uso de ORDER BY dentro de uma subconsulta só é aplicável quando combinado com cláusulas como TOP ou LIMIT. Por exemplo, podemos utilizá-lo com a cláusula LIMIT da seguinte forma:
SELECT *
FROM (SELECT first_name, last_name FROM employees ORDER BY last_name LIMIT 10) AS subquery;
Nesse caso, a ordenação é realizada dentro da subconsulta e os 10 primeiros resultados são retornados para a consulta externa.
Como ordenar o resultado de uma subconsulta com ORDER BY
Para ordenar o resultado de uma subconsulta em uma ordem específica, é necessário utilizar a cláusula ORDER BY na consulta externa. Dessa forma, todo o conjunto de resultados da subconsulta será ordenado.
Método básico para ordenar o resultado de uma subconsulta
Primeiro, recupera-se os dados necessários na subconsulta e, em seguida, utiliza-se a cláusula ORDER BY na consulta externa para ordenar o resultado. Veja um exemplo abaixo:
SELECT *
FROM (
SELECT first_name, last_name, hire_date
FROM employees
WHERE department_id = 10
) AS subquery
ORDER BY hire_date DESC;
Nessa consulta, são recuperados os funcionários com department_id
igual a 10 na subconsulta, e o resultado é ordenado por hire_date
em ordem descendente.
Exemplo prático
Por exemplo, para obter as vendas de uma categoria específica e ordenar o resultado pelo valor total de vendas, podemos utilizar a seguinte consulta:
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;
Nessa consulta, o total de vendas para a categoria Electronics
é calculado e o resultado é ordenado em ordem decrescente de vendas.
Dicas ao usar ORDER BY em subconsultas
Mesmo que a cláusula ORDER BY seja usada dentro de uma subconsulta, ela não será respeitada pela consulta externa. Portanto, sempre use a cláusula ORDER BY na consulta externa para garantir a ordenação correta dos resultados da subconsulta.
Exemplos de consultas SQL com subconsultas
A seguir estão alguns exemplos de consultas SQL que utilizam subconsultas, o que ajuda a entender como combinar subconsultas com a cláusula ORDER BY.
Ordenação de funcionários por data de contratação
A consulta abaixo exibe os funcionários de um determinado departamento ordenados por data de contratação:
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;
Essa consulta extrai os funcionários com o department_id
igual a 10 na subconsulta e os ordena por data de contratação em ordem decrescente.
Ordenação de dados de vendas
A consulta a seguir agrega os dados de vendas de uma categoria de produto específica e os ordena pelo valor total de vendas:
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;
Nessa consulta, o total de vendas para cada produto na categoria Electronics
é calculado e o resultado é ordenado em ordem decrescente de vendas.
Lista de clientes com o pedido mais recente
A consulta abaixo recupera a lista de clientes com suas datas de pedidos mais recentes e os ordena por data do pedido:
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;
Essa consulta obtém a data do pedido mais recente de cada cliente na subconsulta e ordena o resultado por data do pedido em ordem decrescente.
Produtos principais por categoria ordenados por vendas
A consulta abaixo obtém os produtos principais de cada categoria com base nas vendas e os exibe em ordem de vendas:
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;
Essa consulta classifica os produtos de cada categoria com base no valor total de vendas, seleciona o produto principal e o ordena em ordem decrescente de vendas.
Com esses exemplos, agora você deve entender como usar subconsultas e a cláusula ORDER BY em conjunto. O uso correto de subconsultas permite realizar consultas e ordenações complexas de forma eficiente.
Conclusão
Subconsultas são uma ferramenta poderosa na construção de consultas SQL complexas. Elas são particularmente úteis quando é necessário filtrar uma parte dos dados e realizar um processamento adicional com base nesses resultados. No entanto, é importante lembrar que a cláusula ORDER BY dentro de uma subconsulta não afeta a consulta externa. Portanto, a ordenação final deve ser feita na consulta externa para garantir que os resultados da subconsulta sejam exibidos na ordem desejada. A combinação de subconsultas e ORDER BY permite realizar consultas complexas de forma fácil e eficiente.