引言:那些让我通过大厂面试的MySQL秘籍
在参与校园OJ系统开发时,我真正理解了MySQL不仅是存储工具,更是业务逻辑的实现载体。本文将揭秘课程设计中不会深入,但企业面试必问的四大核心技能。
一、子查询:SQL中的瑞士军刀
1.1 多层嵌套查询实战
开发选课系统时,需要找出选了"数据结构"但没选"算法分析"的学生:
SELECT student_id
FROM course_selection
WHERE course_id = (
SELECT id FROM courses WHERE name='数据结构'
) AND student_id NOT IN (
SELECT student_id FROM course_selection
WHERE course_id = (
SELECT id FROM courses WHERE name='算法分析'
)
);
性能对比:该写法比多次查询+程序处理快3-5倍
1.2 EXISTS的魔法
检查院系是否有学生获奖的优化方案:
SELECT dept_name
FROM departments d
WHERE EXISTS (
SELECT 1 FROM students s
WHERE s.dept_id=d.id AND s.awards>0
);
二、连接查询:数据关系的三维地图
2.1 左连接的特殊应用
统计每个学生的缺勤次数(含零次记录):
SELECT s.name, COUNT(a.id) AS absence_count
FROM students s LEFT JOIN absences a
ON s.id=a.student_id
GROUP BY s.id;
2.2 全连接的隐藏价值
员工-部门关系分析(显示所有关联和游离记录):
SELECT e.emp_name, d.dept_name
FROM employees e FULL JOIN departments d
ON e.dept_id=d.id;
三、键约束:数据世界的交通法规
3.1 主键设计的艺术
CREATE TABLE book_loans (
loan_id INT AUTO_INCREMENT,
book_id INT NOT NULL,
user_id INT NOT NULL,
loan_date DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (loan_id),
UNIQUE KEY (book_id, user_id, loan_date)
);
3.2 外键的级联策略矩阵
策略删除父表记录更新父表键值CASCADE同步删除同步更新SET NULL子表置NULL子表置NULLRESTRICT拒绝操作拒绝操作
四、数据操作:CRUD的进阶技法
4.1 批量插入的三种姿势
/* 方式1:标准多值插入 */
INSERT INTO logs VALUES (NULL,'login'),(NULL,'logout');
/* 方式2:查询结果插入 */
INSERT INTO archive_logs
SELECT * FROM current_logs WHERE create_date<'2025-01-01';
/* 方式3:LOAD DATA导入 */
LOAD DATA INFILE '/tmp/data.csv' INTO TABLE temp_data;
4.2 删除操作的防御编程
START TRANSACTION;
-- 先创建备份
CREATE TABLE deleted_users_backup AS
SELECT * FROM users WHERE status='inactive';
-- 再执行删除
DELETE FROM users WHERE status='inactive';
COMMIT;
结语:给学弟学妹的成长建议
使用MySQL Workbench可视化执行计划
定期练习LeetCode数据库题库
建立自己的SQL代码片段库
阅读《高性能MySQL》第5章

被折叠的 条评论
为什么被折叠?



