1. 2019年SQL题目解析与实战演练
最近整理资料时翻到了2019年的一份SQL练习题集,发现其中不少题目设计巧妙,既考察基础语法又包含实际业务场景的抽象。作为数据库开发中最核心的技能之一,SQL能力直接影响着数据查询效率和应用性能。这份题目覆盖了从基础查询到复杂分析的典型场景,特别适合用来检验和提升SQL编写水平。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础查询题目精讲
2.1 单表查询与条件筛选
基础题目通常考察SELECT语句的基本结构和WHERE条件的使用。例如这道典型题目:
"查询员工表中薪资大于10000且入职时间在2018年之前的员工信息"
sql复制SELECT *
FROM employees
WHERE salary > 10000
AND hire_date < '2018-01-01';
这里有几个关键点需要注意:
- 日期比较时要注意格式一致性,建议使用标准'YYYY-MM-DD'格式
- 多条件组合时合理使用括号明确优先级
- 实际工作中应避免SELECT *,明确列出所需字段
2.2 聚合函数与分组统计
分组统计是SQL的核心功能之一。看这个例子:
"统计各部门的平均薪资,只显示平均薪资超过15000的部门"
sql复制SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 15000;
注意:WHERE过滤行,HAVING过滤分组,这个区别经常在面试中被问到
3. 多表连接实战技巧
3.1 内连接与外连接选择
多表连接是SQL中最容易出错的部分之一。2019年的题目中有这样一道典型题:
"查询所有员工及其部门信息,包括没有部门的员工"
sql复制SELECT e.employee_id, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
这里必须使用LEFT JOIN而非INNER JOIN,才能包含部门ID为NULL的员工记录。实际工作中,约30%的SQL错误源于连接类型选择不当。
3.2 自连接的特殊应用
自连接经常用于处理层级数据,比如这道题:
"查询每个员工及其直接上级的姓名"
sql复制SELECT e.employee_id, e.last_name,
m.last_name as manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;
自连接的关键是给同一张表设置不同的别名,这在组织架构查询中非常常见。
4. 子查询与高级分析
4.1 相关子查询优化
2019年题目中有不少考察子查询的题目,比如:
"查询薪资高于本部门平均薪资的员工"
sql复制SELECT employee_id, last_name, salary, department_id
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
这类相关子查询在MySQL 8.0以下版本性能较差,可以考虑用JOIN重写:
sql复制SELECT e.employee_id, e.last_name, e.salary, e.department_id
FROM employees e
JOIN (
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
) d ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;
4.2 窗口函数应用
虽然2019年时窗口函数还不算普及,但现在已成为SQL必备技能:
"查询每个部门薪资排名前三的员工"
sql复制SELECT *
FROM (
SELECT employee_id, last_name, department_id, salary,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as rank_num
FROM employees
) t
WHERE rank_num <= 3;
窗口函数能极大简化复杂分析查询,是SQL进阶的重要里程碑。
5. 实战中的性能优化
5.1 索引使用原则
在完成题目基础上,实际工作还需考虑性能:
- WHERE条件中的字段应考虑建立索引
- JOIN条件的字段必须有索引
- 避免在索引列上使用函数或运算
sql复制-- 不好的写法
SELECT * FROM employees WHERE YEAR(hire_date) = 2019;
-- 好的写法
SELECT * FROM employees
WHERE hire_date BETWEEN '2019-01-01' AND '2019-12-31';
5.2 执行计划分析
复杂查询应检查执行计划:
sql复制EXPLAIN
SELECT d.department_name, COUNT(e.employee_id)
FROM departments d
LEFT JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_name;
重点关注:
- 是否使用了合适的索引
- 是否有全表扫描
- JOIN操作的顺序是否合理
6. 常见陷阱与最佳实践
6.1 NULL值处理
NULL相关错误在SQL中非常普遍:
sql复制-- 错误:NULL比较不能用=,要用IS NULL
SELECT * FROM employees WHERE commission_pct = NULL;
-- 正确
SELECT * FROM employees WHERE commission_pct IS NULL;
聚合函数如COUNT、SUM等会忽略NULL值,这点需要特别注意。
6.2 事务隔离问题
虽然题目中较少涉及,但实际工作必须了解:
sql复制-- 设置事务隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
-- 查询和更新操作
COMMIT;
不同隔离级别对并发操作的影响巨大,特别是在报表查询和数据处理场景中。
