数据库基础练习题(完整版)
数据库基础练习题(完整版)
这份练习题包含大量理论和实操题目,覆盖MySQL数据库的核心知识点,适合面试复习和技能提升。答案隐藏在每个问题下方的折叠框中,点击即可查看。
這份題目不是面試寶典,背書以面試寶典爲主,這個更多的是可以作爲自我檢測和抽查的一個部分,本站所有題目均在側欄展示,可以精準定位到對應的位置
這是份面試題筆試題均在的文章,可以加强自我使用數據庫部分的技能加强
一、理论简答题
1. 请解释数据库事务的ACID属性,并说明每个属性的作用。
查看答案
原子性(Atomicity):事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):事务一旦提交,其对数据库的修改就是永久性的。
2. MySQL中有哪些常见的存储引擎?InnoDB和MyISAM的主要区别是什么?
查看答案
常见存储引擎:InnoDB、MyISAM、Memory、Archive、Federated等。
InnoDB和MyISAM的主要区别:
- InnoDB支持事务,MyISAM不支持
- InnoDB支持行级锁,MyISAM支持表级锁
- InnoDB支持外键,MyISAM不支持
- InnoDB支持MVCC(多版本并发控制),MyISAM不支持
- InnoDB的索引和数据存储在一起,MyISAM的索引和数据分开存储
- InnoDB适合写操作多的场景,MyISAM适合读操作多的场景
3. 什么是索引?索引的优缺点是什么?MySQL支持哪些类型的索引?
查看答案
索引:是帮助MySQL高效获取数据的数据结构,类似于书籍的目录。
优点:
- 提高查询速度
- 减少I/O操作
- 可以加速表与表之间的连接
缺点:
- 占用存储空间
- 降低插入、更新、删除操作的速度
- 维护索引需要额外开销
MySQL支持的索引类型:
- 主键索引(PRIMARY)
- 唯一索引(UNIQUE)
- 普通索引(INDEX)
- 全文索引(FULLTEXT)
- 联合索引
4. 数据库三大范式是什么?请分别简要说明。
查看答案
第一范式(1NF):列不可再分,确保每列的值都是原子的。
第二范式(2NF):在1NF的基础上,非主属性完全依赖于主键,不能部分依赖。
第三范式(3NF):在2NF的基础上,非主属性不依赖于其他非主属性,消除传递依赖。
5. 并发事务可能带来哪些问题?MySQL的事务隔离级别有哪些?默认隔离级别是什么?
查看答案
并发事务问题:
- 脏读:读取到未提交的数据
- 不可重复读:同一事务内多次读取同一数据,结果不一致
- 幻读:同一事务内多次查询,结果集的行数不一致
- 丢失修改:多个事务同时修改同一数据,导致某些修改丢失
事务隔离级别:
- READ-UNCOMMITTED(读取未提交)
- READ-COMMITTED(读取已提交)
- REPEATABLE-READ(可重复读):MySQL的默认隔离级别
- SERIALIZABLE(可串行化)
6. 什么是脏读、不可重复读和幻读?如何避免这些问题?
查看答案
脏读:一个事务读取到另一个事务未提交的数据。避免方法:提高隔离级别到READ-COMMITTED及以上。
不可重复读:同一事务内多次读取同一数据,由于其他事务的修改导致结果不一致。避免方法:提高隔离级别到REPEATABLE-READ及以上。
幻读:同一事务内多次查询,由于其他事务的插入或删除导致结果集的行数不一致。避免方法:提高隔离级别到SERIALIZABLE。
7. 请解释主键、外键和唯一索引的区别。
查看答案
主键:唯一标识一条记录,不能重复,不能为空,一个表只能有一个主键。
外键:指向另一个表的主键,用于建立表与表之间的关系,可以重复,可以为空,一个表可以有多个外键。
唯一索引:确保列的值唯一,可以为空,一个表可以有多个唯一索引。
8. 什么是视图?视图的优缺点是什么?
查看答案
视图:是一种虚拟的表,基于查询结果集创建,不存储实际数据。
优点:
- 简化查询操作
- 隐藏复杂的查询逻辑
- 提供数据安全性
- 实现逻辑数据独立性
缺点:
- 性能可能不如直接查询表
- 修改视图有很多限制
- 维护视图需要额外开销
9. SQL优化有哪些常用方法?请列举至少5种。
查看答案
- 避免使用SELECT *,只查询需要的列
- 合理使用索引
- 避免在WHERE子句中使用函数或表达式
- 避免使用IN和NOT IN,改用EXISTS和NOT EXISTS
- 优化JOIN操作,确保连接条件有索引
- 避免在WHERE子句中使用!=或<>
- 合理使用分页查询(LIMIT)
- 避免使用OR,改用UNION或UNION ALL
- 定期分析表和优化表
- 合理设计数据库表结构,遵循三大范式
10. 内连接、左连接和右连接的区别是什么?请用SQL语句举例说明。
查看答案
内连接(INNER JOIN):只返回两个表中匹配的行。1
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
左连接(LEFT JOIN):返回左表的所有行,以及右表中匹配的行,右表中不匹配的行用NULL填充。1
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
右连接(RIGHT JOIN):返回右表的所有行,以及左表中匹配的行,左表中不匹配的行用NULL填充。1
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
11. 什么是SQL注入?如何防止SQL注入?
查看答案
SQL注入:是一种攻击方式,攻击者通过在输入中插入SQL代码,使数据库执行恶意的SQL语句。
防止方法:
- 使用参数化查询(预处理语句)
- 对用户输入进行过滤和转义
- 限制数据库用户的权限
- 使用ORM框架
- 避免使用动态SQL
12. 什么是存储过程?存储过程的优缺点是什么?
查看答案
存储过程:是一组预编译的SQL语句,保存在数据库中,可以被多次调用。
优点:
- 提高性能,减少网络传输
- 重用性好
- 安全性高
- 简化复杂操作
缺点:
- 移植性差
- 调试困难
- 维护成本高
- 可能导致数据库服务器负载过高
13. 什么是触发器?触发器的使用场景有哪些?
查看答案
触发器:是一种特殊的存储过程,当表发生INSERT、UPDATE、DELETE操作时自动执行。
使用场景:
- 数据验证
- 数据审计
- 数据同步
- 自动生成派生列
- 强制业务规则
14. 数据库备份和恢复的方法有哪些?
查看答案
备份方法:
- 物理备份:直接复制数据库文件
- 逻辑备份:使用工具(如mysqldump)导出SQL语句
- 增量备份:只备份上次备份后更改的数据
- 全量备份:备份所有数据
恢复方法:
- 物理恢复:复制备份文件到数据库目录
- 逻辑恢复:使用mysql命令执行备份的SQL文件
- 点恢复:恢复到指定时间点的数据
15. 什么是数据库分区?分区的类型有哪些?
查看答案
数据库分区:是将大表的数据分成多个小的物理区域,提高查询性能和管理效率。
分区类型:
- 范围分区(RANGE)
- 列表分区(LIST)
- 哈希分区(HASH)
- 键分区(KEY)
二、SQL操作题
1. 请写出创建以下员工表的SQL语句:
- 表名:employees
- 字段:id(主键,自增)、name(非空)、age(整数)、gender(男/女)、salary(小数)、hire_date(日期)
查看答案
1
2
3
4
5
6
7
8CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
gender ENUM('男', '女'),
salary DECIMAL(10, 2),
hire_date DATE
);
2. 请写出向employees表中插入3条测试数据的SQL语句。
查看答案
1 | INSERT INTO employees (name, age, gender, salary, hire_date) VALUES |
3. 写出查询工资大于5000的员工姓名、年龄和部门名称的SQL语句(假设存在部门表departments,包含id和name字段)。
查看答案
1 | SELECT e.name, e.age, d.name AS department_name |
4. 写出更新employees表中id=101的员工工资增加10%的SQL语句。
查看答案
1 | UPDATE employees |
5. 写出删除employees表中年龄大于60岁员工记录的SQL语句。
查看答案
1 | DELETE FROM employees |
6. 写出查询每个部门平均工资的SQL语句,要求显示部门名称和平均工资,并按平均工资降序排序。
查看答案
1 | SELECT d.name AS department_name, AVG(e.salary) AS avg_salary |
7. 写出查询员工表中年龄最大的前三名员工信息的SQL语句。
查看答案
1 | SELECT * |
8. 写出创建employees表中name字段普通索引的SQL语句。
查看答案
1 | CREATE INDEX idx_employees_name ON employees(name); |
9. 写出使用子查询查找工资高于公司平均工资的员工信息的SQL语句。
查看答案
1 | SELECT * |
10. 写出创建一个视图,包含员工姓名、部门名称和入职年份的SQL语句。
查看答案
1 | CREATE VIEW employee_info AS |
11. 写出查询入职日期在2022年1月1日至2023年12月31日之间的员工信息的SQL语句。
查看答案
1 | SELECT * |
12. 写出查询姓名以’张’开头的员工信息的SQL语句。
查看答案
1 | SELECT * |
13. 写出查询每个部门不同性别的员工人数的SQL语句。
查看答案
1 | SELECT d.name AS department_name, e.gender, COUNT(*) AS count |
14. 写出查询员工表中工资最高的员工信息的SQL语句。
查看答案
1 | SELECT * |
15. 写出删除employees表中所有记录的SQL语句(保留表结构)。
查看答案
1 | TRUNCATE TABLE employees; |
三、综合应用题
1. 设计一个简单的学生选课系统数据库,包含学生表、课程表和选课表,写出创建这三个表的SQL语句,并设置适当的主键、外键和约束。
查看答案
1 | -- 学生表 |
2. 针对上述学生选课系统,写出查询每个学生所选课程数量和平均成绩的SQL语句。
查看答案
1 | SELECT s.id, s.name, COUNT(cs.course_id) AS course_count, AVG(cs.score) AS avg_score |
3. 写出一个事务,实现从A账户向B账户转账1000元的功能,确保事务的ACID属性。
查看答案
1 | START TRANSACTION; |
4. 设计一个简单的博客系统数据库,包含用户表、文章表和评论表,写出创建这三个表的SQL语句,并设置适当的主键、外键和约束。
查看答案
1 | -- 用户表 |
5. 针对上述博客系统,写出查询每篇文章的标题、作者名和评论数量的SQL语句。
查看答案
1 | SELECT a.title, u.username, COUNT(c.id) AS comment_count |