常见SQL面试题
以下是一些常见的 SQL 面试题,按难度和主题分类整理:
基础题
- 什么是主键?主键是表中用于唯一标识每一行数据的字段(或字段组合),具有唯一性和非空约束。
- SQL 中的 JOIN 有哪些类型?内连接(INNER JOIN):返回两个表中匹配的行。左连接(LEFT JOIN):返回左表所有行,以及右表匹配的行,无匹配则为 NULL。右连接(RIGHT JOIN):返回右表所有行,以及左表匹配的行,无匹配则为 NULL。全连接(FULL JOIN):返回两表的所有行,不匹配的部分用 NULL 填充。交叉连接(CROSS JOIN):返回两表的笛卡尔积。
- 什么是索引?它有什么作用?索引是一种快速访问数据库表中记录的数据结构。它提高了查询效率,但会降低插入、更新的速度。
- 解释一下 GROUP BY 和 HAVING 的区别?GROUP BY 用于对数据进行分组,通常与聚合函数一起使用。HAVING 用于过滤分组后的结果,而 WHERE 用于过滤原始数据。
- 什么是子查询?子查询是指嵌套在其他 SQL 查询中的查询语句,常用于作为条件筛选数据。
进阶题
- 如何优化 SQL 查询性能?使用索引;避免 SELECT *;减少不必要的 JOIN;使用 EXPLAIN 分析执行计划;对大表分页时使用 LIMIT/OFFSET。
- 窗口函数是什么?举几个常用例子。窗口函数允许在一组相关行上执行计算,而不减少输出行数。常见窗口函数包括:ROW_NUMBER():给每行分配一个唯一的序号;RANK():根据排序分配排名,相同值并列后跳过后续排名;DENSE_RANK():类似 RANK,但不跳过后续排名;NTILE(n):将数据分成 n 个桶;SUM() OVER():累计求和等。
- 什么是事务?它的 ACID 属性是什么?事务是一个逻辑操作单元,其 ACID 特性如下:A(Atomicity)原子性:事务要么全部完成,要么全部失败回滚;C(Consistency)一致性:事务完成后,数据库从一个一致状态进入另一个一致状态;I(Isolation)隔离性:事务之间互不干扰;D(Durability)持久性:事务一旦提交,修改永久保存到数据库。
- 什么是视图?它的优缺点是什么?视图是从一个或多个表导出的虚拟表,简化复杂查询。优点:封装复杂逻辑;提供安全性;简化查询。缺点:可能影响性能;更新受限。
- 解释 UNION 和 UNION ALL 的区别。UNION 合并两个查询结果,并去重;UNION ALL 合并两个查询结果,保留重复项。
实战题
- 编写 SQL 查询找出每个部门工资最高的员工。SELECT d.name AS Department, e.name AS Employee, e.salary FROM Employee e JOIN Department d ON e.departmentId = d.id WHERE (e.departmentId, e.salary) IN ( SELECT departmentId, MAX(salary) FROM Employee GROUP BY departmentId );
- 写一个 SQL 查询找出连续登录三天的用户。WITH login_dates AS ( SELECT user_id, login_date, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) AS rn FROM Logins ), grouped_dates AS ( SELECT user_id, DATE_SUB(login_date, INTERVAL rn DAY) AS grp FROM login_dates ) SELECT DISTINCT user_id FROM grouped_dates GROUP BY user_id, grp HAVING COUNT(*) >= 3;
- 如何查找重复记录?SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name HAVING COUNT(*) > 1;
- 删除重复记录,保留一条。DELETE t1 FROM table_name t1 JOIN table_name t2 ON t1.column_name = t2.column_name AND t1.id > t2.id;
- 实现分页查询。SELECT * FROM table_name ORDER BY id LIMIT 10 OFFSET 20;
发表评论 (审核通过后显示评论):