推荐答案
在 Presto 中,SELECT
语句用于从数据库表中检索数据。以下是一个基本的 SELECT
语句的示例:
SELECT column1, column2, ... FROM table_name WHERE condition;
示例
假设我们有一个名为 employees
的表,包含 id
, name
, 和 salary
列。我们可以使用以下 SELECT
语句来检索所有员工的姓名和薪水:
SELECT name, salary FROM employees;
如果我们只想检索薪水大于 50000 的员工,可以使用 WHERE
子句:
SELECT name, salary FROM employees WHERE salary > 50000;
本题详细解读
1. SELECT
语句的基本结构
SELECT
语句的基本结构包括以下几个部分:
SELECT
:指定要检索的列。FROM
:指定要检索数据的表。WHERE
(可选):指定检索数据的条件。
2. 检索所有列
如果你想检索表中的所有列,可以使用 *
通配符:
SELECT * FROM employees;
3. 使用别名
你可以为列或表指定别名,以便在查询结果中显示更具描述性的名称:
SELECT name AS employee_name, salary AS employee_salary FROM employees;
4. 排序结果
你可以使用 ORDER BY
子句对结果进行排序。默认情况下,排序是升序的,但你可以使用 DESC
关键字进行降序排序:
SELECT name, salary FROM employees ORDER BY salary DESC;
5. 限制结果数量
你可以使用 LIMIT
子句来限制返回的行数:
SELECT name, salary FROM employees LIMIT 10;
6. 聚合函数
Presto 支持多种聚合函数,如 COUNT
, SUM
, AVG
, MIN
, 和 MAX
。例如,计算所有员工的平均薪水:
SELECT AVG(salary) AS average_salary FROM employees;
7. 分组
你可以使用 GROUP BY
子句对结果进行分组。例如,按部门分组并计算每个部门的平均薪水:
SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department;
8. 过滤分组结果
你可以使用 HAVING
子句来过滤分组后的结果。例如,只显示平均薪水大于 50000 的部门:
SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department HAVING AVG(salary) > 50000;
9. 连接表
Presto 支持多种连接操作,如 INNER JOIN
, LEFT JOIN
, RIGHT JOIN
, 和 FULL OUTER JOIN
。例如,连接 employees
表和 departments
表:
SELECT e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.id;
10. 子查询
你可以在 SELECT
语句中使用子查询。例如,检索薪水高于平均薪水的员工:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
11. 使用 WITH
子句
WITH
子句允许你定义一个临时表,以便在查询中重复使用。例如:
WITH high_salary_employees AS ( SELECT name, salary FROM employees WHERE salary > 50000 ) SELECT * FROM high_salary_employees;
12. 使用 UNION
和 UNION ALL
你可以使用 UNION
或 UNION ALL
来合并多个 SELECT
语句的结果。UNION
会去除重复行,而 UNION ALL
会保留所有行:
SELECT name FROM employees UNION SELECT name FROM contractors;
13. 使用 CASE
表达式
CASE
表达式允许你在 SELECT
语句中进行条件判断。例如,根据薪水范围给员工分类:
SELECT name, salary, CASE WHEN salary > 100000 THEN 'High' WHEN salary > 50000 THEN 'Medium' ELSE 'Low' END AS salary_level FROM employees;
14. 使用 DISTINCT
去重
你可以使用 DISTINCT
关键字来去除结果中的重复行:
SELECT DISTINCT department FROM employees;
15. 使用 LIKE
进行模式匹配
你可以使用 LIKE
操作符进行模式匹配。例如,检索名字以 "J" 开头的员工:
SELECT name FROM employees WHERE name LIKE 'J%';
16. 使用 IN
操作符
你可以使用 IN
操作符来匹配多个值。例如,检索部门为 "Sales" 或 "Marketing" 的员工:
SELECT name, department FROM employees WHERE department IN ('Sales', 'Marketing');
17. 使用 BETWEEN
操作符
你可以使用 BETWEEN
操作符来检索某个范围内的值。例如,检索薪水在 30000 到 60000 之间的员工:
SELECT name, salary FROM employees WHERE salary BETWEEN 30000 AND 60000;
18. 使用 IS NULL
和 IS NOT NULL
你可以使用 IS NULL
和 IS NOT NULL
来检查列是否为 NULL
。例如,检索没有分配部门的员工:
SELECT name FROM employees WHERE department IS NULL;
19. 使用 EXISTS
子查询
你可以使用 EXISTS
子查询来检查是否存在满足条件的行。例如,检索有下属的员工:
SELECT name FROM employees e WHERE EXISTS ( SELECT 1 FROM subordinates s WHERE s.manager_id = e.id );
20. 使用 WINDOW
函数
Presto 支持窗口函数,允许你在查询结果中进行复杂的计算。例如,计算每个员工的薪水在部门中的排名:
SELECT name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;