推荐答案
在 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;