【数据库】SQL面试基础15题,测试/开发必背速查

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(真实场景题)后续更新,关注不迷路。

相关推荐
CS创新实验室1 小时前
数据库突然断电,凭什么没丢数据?——WAL 日志与崩溃恢复
数据库·mysql
ly76892 小时前
PostgreSQL 执行计划深读:从 EXPLAIN 输出到代价模型驱动的 SQL 改写
数据库·sql·postgresql·explain·执行计划·代价模型
Python自动化直播2 小时前
自动化笔记:素材管理、命名、轮换的几条土办法
linux·运维·数据库
xiaomuzuirenzhen2 小时前
2027校招ERP实施顾问:大数据管理与应用专业如何用SQL、BI证明业务能力
大数据·数据库
底层玩家老张3 小时前
从副本集到分片:百亿级文档数据的KES架构边界
数据库·分布式架构·分片·架构选型·文档数据库
ss2733 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql
川石课堂软件测试3 小时前
涨薪技术|0到1学会性能测试第8课-Analysis分析图
服务器·数据库·python·sql·jmeter·mysql·容器
SelectDB技术团队3 小时前
云数仓成本结构拆解:五层计费模型与 Apache Doris 托管形态对照
大数据·数据库·elk·全文检索·snowflake
我命由我123453 小时前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试