SQL 面试基础题占面试八成以上,很多候选人不是不会,是答不全、答不顺。这篇把板块 1 的 15 道基础必问整理成可背的速查,附执行顺序、易错点与答案框架,建议收藏。
一、SELECT 基本查询与执行顺序
语法:SELECT 列 FROM 表 WHERE 条件 ORDER BY 列 LIMIT N
执行顺序(高频考点,务必背):
sql
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
二、WHERE 与 HAVING 的区别(必考)
WHERE:分组前过滤行,不能跟聚合函数。
HAVING:分组后过滤组,能跟聚合函数。
示例:
sql
SELECT dept, COUNT(*) FROM emp
WHERE salary > 5000
GROUP BY dept HAVING COUNT(*) > 3;
三、JOIN 家族
| 连接类型 | 保留行范围 | 无匹配时结果 | MySQL 是否原生支持 | 典型使用场景 |
|---|---|---|---|---|
| INNER JOIN | 只保留两表匹配的行 | 不保留无匹配行 | 是 | 取两表交集数据,如订单与客户匹配 |
| LEFT JOIN | 保留左表全部行,右表只取匹配行 | 右表列填 NULL | 是 | 以左表为主,查右表补充信息,如员工及其部门 |
| RIGHT JOIN | 保留右表全部行,左表只取匹配行 | 左表列填 NULL | 是 | 以右表为主,查左表补充信息 |
| FULL JOIN | 保留两表全部行 | 无匹配一侧填 NULL | 否(用 UNION 模拟) | 合并两表全量数据,找出两侧不匹配的记录 |
下面通过一个完整的实战示例,直观对比四种连接的区别。先准备两张表:员工表 emp 和部门表 dept。
sql
-- 建表语句
CREATE TABLE dept (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE emp (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT
);
-- 示例数据
INSERT INTO dept VALUES (1, '研发部'), (2, '市场部'), (3, '财务部');
INSERT INTO emp VALUES (101, '张三', 1), (102, '李四', 1), (103, '王五', 2), (104, '赵六', NULL);
1. INNER JOIN 内连接:只返回两表匹配的行,赵六(无部门)和财务部(无员工)都不会出现。
sql
SELECT e.emp_name, d.dept_name
FROM emp e
INNER JOIN dept d ON e.dept_id = d.dept_id;
-- 结果:张三-研发部、李四-研发部、王五-市场部
2. LEFT JOIN 左连接:保留左表 emp 全部行,赵六没有匹配部门,dept_name 显示为 NULL。
sql
SELECT e.emp_name, d.dept_name
FROM emp e
LEFT JOIN dept d ON e.dept_id = d.dept_id;
-- 结果:张三-研发部、李四-研发部、王五-市场部、赵六-NULL
3. RIGHT JOIN 右连接:保留右表 dept 全部行,财务部没有匹配员工,emp_name 显示为 NULL。
sql
SELECT e.emp_name, d.dept_name
FROM emp e
RIGHT JOIN dept d ON e.dept_id = d.dept_id;
-- 结果:张三-研发部、李四-研发部、王五-市场部、NULL-财务部
4. FULL JOIN 全连接:MySQL 不原生支持,用 LEFT JOIN 和 RIGHT JOIN 的 UNION 模拟,保留两表全部行,无匹配一侧为 NULL。
sql
SELECT e.emp_name, d.dept_name
FROM emp e
LEFT JOIN dept d ON e.dept_id = d.dept_id
UNION
SELECT e.emp_name, d.dept_name
FROM emp e
RIGHT JOIN dept d ON e.dept_id = d.dept_id;
-- 结果:张三-研发部、李四-研发部、王五-市场部、赵六-NULL、NULL-财务部
四、GROUP BY / ORDER BY / LIMIT 分页
GROUP BY 分组统计;ORDER BY 排序(DESC 降序);LIMIT 分页:LIMIT 10 OFFSET 20 取第 21-30 条。
五、聚合函数与条件过滤
COUNT、SUM、AVG、MAX、MIN;LIKE 模糊(张%、%三%、王_);IN / BETWEEN / IS NULL 范围与空值。
六、自连接:员工找领导
SELECT e.name, m.name AS leader FROM emp e LEFT JOIN emp m ON e.leader_id = m.id;
七、板块1 易错点总结
1、执行顺序记反(最常见翻车点)。
2、WHERE 误用聚合函数。
3、LEFT JOIN 后误加 WHERE 右表条件导致变内连接。
4、HAVING 与 WHERE 混淆。
5、NULL 判断用 IS NULL 而非 = NULL。
板块1是地基,板块2(窗口函数/索引/事务)与板块3(真实场景题)后续更新,关注不迷路。