今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
在 MySQL 面试中,增删操作是数据库管理中的基础内容,通常会有一些相关的面试题。以下是一些围绕 MySQL 中增删操作的典型面试题,及其参考答案。
一、基础增删操作问题
1. 如何在 MySQL 中插入一条数据?
-
问题描述 :请写出一条向表
users
中插入用户数据的 SQL 语句。 -
答案 :
sqlINSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com');
2. 如何在 MySQL 中删除一条数据?
-
问题描述 :假设
users
表中存在一条记录,id
为 1,请写出删除该记录的 SQL 语句。 -
答案 :
sqlDELETE FROM users WHERE id = 1;
3. 如何插入多条数据?
-
问题描述 :请写出向
users
表插入多条记录的 SQL 语句。 -
答案 :
sqlINSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com'), ('李四', 30, 'lisi@example.com'), ('王五', 22, 'wangwu@example.com');
4. 如何删除表中的所有数据?
-
问题描述 :请写出清空
users
表中所有记录的 SQL 语句。 -
答案 :
sqlDELETE FROM users;
或者:
sqlTRUNCATE TABLE users;
-
区别 :
DELETE
会逐行删除数据,支持WHERE
子句,删除后可以回滚。TRUNCATE
是一种快速删除表中所有数据的操作,无法回滚且不支持WHERE
。
5. 如何根据某个条件删除多条数据?
-
问题描述 :请写出删除
users
表中年龄大于 30 的用户的 SQL 语句。 -
答案 :
sqlDELETE FROM users WHERE age > 30;
二、进阶增删操作问题
6. 插入时如何避免重复记录?
-
问题描述 :向
users
表中插入用户时,如果已经存在相同的email
,则忽略该条插入操作。请写出 SQL 语句。 -
答案 :
sqlINSERT IGNORE INTO users (name, age, email) VALUES ('李四', 30, 'lisi@example.com');
-
解释 :
INSERT IGNORE
可以忽略插入时的重复键冲突或其他错误,不会影响已经存在的数据。
7. 如何在插入数据时,如果主键冲突则更新?
-
问题描述 :假设
users
表中的email
字段具有唯一性约束。如何在插入新用户时,如果email
已存在,则更新用户的name
和age
? -
答案 :
sqlINSERT INTO users (name, age, email) VALUES ('李四', 30, 'lisi@example.com') ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age);
-
解释 :
ON DUPLICATE KEY UPDATE
会在遇到主键或唯一键冲突时执行更新操作。
8. 删除外键约束的数据时如何避免错误?
- 问题描述:在有外键约束的情况下,删除一条数据会触发外键约束错误。如何安全地删除有关联的记录?
- 答案 :
-
方法一:手动删除外键约束相关表中的记录 ,确保不违反外键约束:
sqlDELETE FROM orders WHERE user_id = 1; DELETE FROM users WHERE id = 1;
-
方法二:设置外键约束为级联删除 ,可以在外键设置中增加
ON DELETE CASCADE
规则,使得删除父表记录时自动删除关联的子表记录。
-
9. 如何限制删除操作的执行范围?
-
问题描述:为了防止意外删除大量数据,如何设置只删除最多 10 条记录?
-
答案 :
sqlDELETE FROM users WHERE age > 30 LIMIT 10;
-
解释 :
LIMIT
限制删除操作的执行条数,避免意外删除大量数据。
三、优化相关的增删操作问题
10. 如何提高大量数据插入的性能?
- 问题描述:如果需要向一个大表中插入数十万甚至上百万条记录,如何提高插入性能?
- 答案 :
-
批量插入 :一次插入多条数据,减少 SQL 语句的执行次数。
sqlINSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com'), ('李四', 30, 'lisi@example.com');
-
禁用索引 :在大批量插入数据之前,可以暂时禁用索引,插入完成后再重新启用索引。
sqlALTER TABLE users DISABLE KEYS; -- 插入数据 ALTER TABLE users ENABLE KEYS;
-
使用事务 :将大量插入操作放入事务中,减少每次操作的提交成本。
sqlSTART TRANSACTION; INSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com'); -- 批量插入更多数据 COMMIT;
-
11. DELETE 和 TRUNCATE 哪个性能更好?
- 问题描述 :在删除大量数据时,使用
DELETE
和TRUNCATE
有什么区别?哪个性能更好? - 答案 :
- 性能 :
TRUNCATE
性能比DELETE
更好,尤其是删除大量数据时。TRUNCATE
不逐行删除记录,而是直接释放表的数据空间,操作较为迅速。 - 回滚 :
DELETE
可以在事务中使用,并支持回滚,而TRUNCATE
无法回滚。 - 触发器 :
DELETE
会触发相关的DELETE
触发器,而TRUNCATE
不会。
- 性能 :
12. 如何避免"幽灵行"问题?
- 问题描述:在高并发环境下,如何在删除或插入数据时避免"幽灵行"问题?
- 答案 :
-
使用事务隔离级别 :可以通过提高事务隔离级别来避免"幽灵行"问题。最常见的是将隔离级别设置为
REPEATABLE READ
或SERIALIZABLE
。sqlSET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-
四、其他相关问题
13. 如何使用 RETURNING
语句获取删除或插入的记录?
-
问题描述:如何在删除或插入操作后获取受影响的记录?
-
答案 :
- 在 MySQL 8.0.19 及更高版本中,
DELETE
和INSERT
支持RETURNING
语句。
sqlDELETE FROM users WHERE age > 30 RETURNING *;
- 在 MySQL 8.0.19 及更高版本中,
14. 如何处理自增主键的插入?
- 问题描述:如何向表中插入数据时跳过自增主键?
- 答案 :
-
可以不指定自增字段,数据库会自动为其分配值。
sqlINSERT INTO users (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com');
-
总结
MySQL 中的增删操作是面试中的常见话题,考察范围从基本的增删语法到复杂的约束处理、事务和性能优化等。熟悉各种增删场景及其优化方法,可以帮助你更好地应对 MySQL 面试中的相关问题。
... ...
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。