推荐答案
在 Presto 中,ORDER BY
子句用于对查询结果进行排序。你可以根据一个或多个列对结果进行升序或降序排列。以下是一个简单的示例:
SELECT name, age FROM employees ORDER BY age DESC, name ASC;
在这个示例中,employees
表中的数据首先按照 age
列进行降序排序,如果 age
相同,则按照 name
列进行升序排序。
本题详细解读
1. ORDER BY
子句的基本用法
ORDER BY
子句通常用于 SELECT
语句的末尾,用于指定查询结果的排序方式。你可以指定一个或多个列作为排序依据,并且可以为每个列指定升序(ASC
)或降序(DESC
)排序。
2. 单列排序
如果你只需要根据一个列进行排序,可以简单地指定该列的名称和排序方向。例如:
SELECT name, salary FROM employees ORDER BY salary DESC;
在这个例子中,查询结果将按照 salary
列的降序排列。
3. 多列排序
当需要根据多个列进行排序时,可以在 ORDER BY
子句中列出多个列,并为每个列指定排序方向。Presto 会首先按照第一个列进行排序,如果第一个列的值相同,则按照第二个列进行排序,以此类推。
SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
在这个例子中,查询结果首先按照 department
列的升序排列,如果 department
相同,则按照 salary
列的降序排列。
4. 排序方向
ASC
:升序排序(默认值)。DESC
:降序排序。
如果你不指定排序方向,Presto 默认使用升序排序。
5. 排序与 NULL 值
在 Presto 中,NULL
值在排序时被视为最小值。因此,在升序排序中,NULL
值会出现在最前面;在降序排序中,NULL
值会出现在最后面。
6. 排序与 LIMIT 结合
ORDER BY
子句通常与 LIMIT
子句结合使用,以获取排序后的前 N 条记录。例如:
SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10;
这个查询将返回 employees
表中薪水最高的 10 名员工。
7. 排序与窗口函数
在某些情况下,你可能需要在窗口函数中使用 ORDER BY
子句来定义窗口的排序方式。例如:
SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
在这个例子中,RANK()
窗口函数会根据 salary
列的降序排列为每个员工分配一个排名。
8. 排序与 DISTINCT
如果你在查询中使用了 DISTINCT
,ORDER BY
子句仍然可以正常工作。例如:
SELECT DISTINCT department FROM employees ORDER BY department ASC;
这个查询将返回 employees
表中所有不同的部门,并按部门名称升序排列。
9. 排序与子查询
ORDER BY
子句也可以用于子查询中,以对子查询的结果进行排序。例如:
SELECT name, salary FROM ( SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10 ) AS top_employees;
在这个例子中,子查询首先返回薪水最高的 10 名员工,然后外部查询对这些员工进行进一步处理。
10. 排序与 JOIN
在涉及多个表的查询中,ORDER BY
子句可以用于对连接后的结果进行排序。例如:
SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id ORDER BY d.department_name ASC, e.name ASC;
这个查询将返回员工及其所属部门的名称,并按照部门名称和员工名称的升序排列。
11. 排序与 GROUP BY
在使用 GROUP BY
子句时,ORDER BY
子句可以用于对分组后的结果进行排序。例如:
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department ORDER BY employee_count DESC;
这个查询将返回每个部门的员工数量,并按照员工数量的降序排列。
12. 排序与 CASE 表达式
你可以使用 CASE
表达式在 ORDER BY
子句中进行条件排序。例如:
SELECT name, salary FROM employees ORDER BY CASE WHEN salary > 100000 THEN 1 ELSE 2 END, salary DESC;
在这个例子中,查询结果首先按照薪水是否大于 100000 进行排序,然后按照薪水的降序排列。
13. 排序与函数
你可以在 ORDER BY
子句中使用函数来对结果进行排序。例如:
SELECT name, LENGTH(name) AS name_length FROM employees ORDER BY name_length DESC;
这个查询将返回员工名称及其长度,并按照名称长度的降序排列。
14. 排序与别名
在 ORDER BY
子句中,你可以使用列别名来引用查询结果中的列。例如:
SELECT name, salary * 12 AS annual_salary FROM employees ORDER BY annual_salary DESC;
这个查询将返回员工的年薪,并按照年薪的降序排列。
15. 排序与表达式
你可以在 ORDER BY
子句中使用表达式来对结果进行排序。例如:
SELECT name, salary, salary * 0.1 AS bonus FROM employees ORDER BY bonus DESC;
这个查询将返回员工的奖金(薪水的 10%),并按照奖金的降序排列。
16. 排序与 NULLS FIRST/LAST
在 Presto 中,你可以使用 NULLS FIRST
或 NULLS LAST
来指定 NULL
值在排序中的位置。例如:
SELECT name, salary FROM employees ORDER BY salary DESC NULLS LAST;
这个查询将返回员工的薪水,并按照薪水的降序排列,NULL
值将出现在最后。
17. 排序与复杂表达式
你可以在 ORDER BY
子句中使用复杂的表达式来对结果进行排序。例如:
SELECT name, salary, (salary * 0.1) + (bonus * 0.2) AS total_compensation FROM employees ORDER BY total_compensation DESC;
这个查询将返回员工的总薪酬(薪水的 10% 加上奖金的 20%),并按照总薪酬的降序排列。
18. 排序与 UNION
在使用 UNION
操作符时,ORDER BY
子句可以用于对合并后的结果进行排序。例如:
SELECT name, salary FROM employees UNION SELECT name, salary FROM contractors ORDER BY salary DESC;
这个查询将返回员工和合同工的薪水,并按照薪水的降序排列。
19. 排序与 INTERSECT
在使用 INTERSECT
操作符时,ORDER BY
子句可以用于对交集结果进行排序。例如:
SELECT name, salary FROM employees INTERSECT SELECT name, salary FROM managers ORDER BY salary DESC;
这个查询将返回既是员工又是经理的人员的薪水,并按照薪水的降序排列。
20. 排序与 EXCEPT
在使用 EXCEPT
操作符时,ORDER BY
子句可以用于对差集结果进行排序。例如:
SELECT name, salary FROM employees EXCEPT SELECT name, salary FROM managers ORDER BY salary DESC;
这个查询将返回是员工但不是经理的人员的薪水,并按照薪水的降序排列。