1. SQL面试核心问题解析
作为一名数据库开发工程师,我经常参与技术面试,也经常被面试。SQL作为数据库操作的通用语言,几乎出现在所有后端和数据相关岗位的面试中。今天我想分享10个最具代表性的SQL面试问题,这些问题不仅考察基础知识,更能检验实际解决问题的能力。
1.1 WHERE与HAVING的本质区别
很多初学者容易混淆WHERE和HAVING子句,其实它们的核心差异在于执行时机和作用对象:
- WHERE在分组前过滤原始数据行,相当于数据预处理
- HAVING在分组后过滤聚合结果,相当于结果后处理
举个例子,假设我们有一个学生成绩表students,包含student_id、class_id和score字段。现在要找出平均分超过60分的班级:
sql复制-- 方法1:先用WHERE过滤不及格学生,再计算平均分
SELECT class_id, AVG(score) AS avg_score
FROM students
WHERE score >= 60
GROUP BY class_id;
-- 方法2:先计算所有学生的平均分,再过滤班级
SELECT class_id, AVG(score) AS avg_score
FROM students
GROUP BY class_id
HAVING AVG(score) > 60;
关键点:WHERE条件中不能使用聚合函数,而HAVING通常与聚合函数配合使用。在性能上,WHERE通常更高效,因为它减少了需要处理的数据量。
1.2 四种JOIN操作的实战应用
JOIN操作是SQL中最容易出错的部分之一。让我们通过一个员工-部门关系的例子来理解:
sql复制-- 创建测试表
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT REFERENCES departments(dept_id)
);
INNER JOIN(内连接):
sql复制-- 只返回有部门的员工
SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;
LEFT JOIN(左连接):
sql复制-- 返回所有员工,包括没有部门的
SELECT e.emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;
RIGHT JOIN(右连接):
sql复制-- 返回所有部门,包括没有员工的
SELECT e.emp_name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id
