数据库复习
题型分布
| 题型 | 题数×分值 | 总分 |
|---|---|---|
| 选择题 | 15×1分 | 15分 |
| 填空题 | 15×1分 | 15分 |
| 判断题 | 10×1分 | 10分 |
| 简答题 | 5×4分 | 20分 |
| 代码操作题 | - | 40分 |
02-数据库考试 知识点汇总
👆👆👆 先自己背几遍
选择题(十五题)
1. 考察数据库系统概述
题目:数据库系统(DBS)主要由四个部分组成,下列选项中不属于这四部分的是______。
A. 数据库 (DB) B. 数据库管理员 (DBA)
C. 操作系统 (OS) D. 数据库管理系统 (DBMS)
**解析:**DBS由硬件系统、软件系统(DBMS、OS等)、数据库(DB)、数据库用户(DBA、开发者、终端用户)组成。
虽然OS是软件系统的一部分,但通常在选项中“数据库用户/DBA”是核心组件之一,而OS是底层支撑。
题目: MySQL 自带的数据库中,主要用于保存 MySQL 服务器维护的所有其他数据库信息(如表名、列名等元数据)的是______。
A. world B. mysql C. performance_schema D. information_schema
解析: mysql数据库存储用户账户和权限信息;information_schema存储所有数据库的元数据(表名、列名等);performance_schema存储性能监控数据。
题目: 用于查看当前正在操作的数据库的命令是______。
A. SHOW DATABASES; B. USE DATABASE; C. SELECT DATABASE(); D. SHOW TABLES;
解析: SELECT DATABASE() 返回当前使用的数据库名;SHOW DATABASES 显示所有数据库;USE 用于切换数据库;SHOW TABLES 显示当前数据库的所有表。
2. 考察三级模式与数据独立性
题目:在数据库的三级模式结构中,当模式(全局逻辑结构)改变时,通过修改______映像,可以保持外模式不变,从而实现数据的逻辑独立性。
A. 外模式/模式 B. 模式/内模式
C. 内模式/外模式 D. 逻辑/物理
**解析:**当模式改变时,修改“外模式/模式映像”可保持外模式不变,实现逻辑独立性。
- 当模式改变时,只需修改外模式/模式映像,外模式不变 → 逻辑独立性
- 当内模式改变时,只需修改模式/内模式映像,模式不变 → 物理独立性
题目:数据库系统的三级模式结构中,一个数据库系统的内模式可以有_________。
A.只能有一个 B.最多有两个
C.可以有多个 D.有三个
解析: 在数据库系统的三级模式结构中:
- 外模式(用户模式): 可以有多个(对应不同的用户视图)。
- 模式(逻辑模式): 只能有一个(全局逻辑视图)。
- 内模式(存储模式): 只能有一个。
原因: 内模式描述的是数据在物理存储介质上的实际存储方式(如文件结构、索引方式等)。一个数据库在物理上只能有一种特定的存储结构,因此内模式是唯一的。
3. 考察E-R图转换
题目: 在将E-R图转换为关系模式时,M:N(多对多)联系必须转换为______。
A. 一个新的独立关系模式(表) B. 归并到M端实体对应的表中
C. 归并到N端实体对应的表中 D. 作为一个字段添加到任一表中
解析: m:n联系必须转换为一个新的独立关系模式,新表的主码由两端实体的主码组合而成。1:n联系则是在"n"端加外键。
4. 考察关系完整性与约束
题目: 确保表中每行数据唯一的约束是______。
A. DEFAULT B. CHECK C. FOREIGN KEY D. PRIMARY KEY
解析: 主码(Primary Key)唯一标识每一行记录,且不能为NULL。DEFAULT设置默认值,CHECK进行条件检查,FOREIGN KEY建立表间关联。
**题目:**关于数据表的外键约束描述不正确的是_________
A.外键约束可以保证数据表之间数据的一致性
B.一个数据表可以定义多个外键约束
C.可以在主表中定义外键约束
D.只有主表中定义了主键或唯一键才能在从表中定义外键约束
解析:
- A 项正确:外键约束的主要目的就是维护参照完整性,保证数据表之间数据的一致性。
- B 项正确:一个数据表可以包含多个外键,分别引用不同表(或同一个表)的主键。
- C 项错误:在主从表关系中,外键约束是定义在从表(子表)上的,用于引用主表(父表)的主键或唯一键。主表是被引用的对象,不需要在主表中定义外键来约束从表。
- D 项正确:这是建立外键约束的前提条件。外键引用的字段必须是主表中的主键(Primary Key)或者唯一键(Unique Key),否则无法确定引用的唯一性。
5. 考察SQL语言分类
题目:下列SQL命令中,用于修改数据库表结构的命令是______。
A. UPDATE B. ALTER C. INSERT D. GRANT
解析:
UPDATE和INSERT是数据操作语言(DML),GRANT是数据控制语言(DCL)。ALTER用于修改数据库或表结构,属于数据定义语言(DDL)。
题目: 在 MySQL 命令行中,不可以用来结束一条 SQL 语句的符号是______。
A. ; B. \g C. \G D. .
解析: 分号(;)是标准结束符,\g等同于分号,\G以垂直格式显示结果。点号(.)不能作为SQL语句结束符。
6. 考察SQL查询
题目:若要查询商品名称中包含“电子”二字的所有商品,WHERE子句应写作______。
A. WHERE name LIKE '电子' B. WHERE name = '电子'
C. WHERE name LIKE '%电子%' D. WHERE name LIKE '_电子'
解析:
%代表任意个字符。%电子%表示中间包含“电子”。_仅代表一个字符。
题目: 在SQL查询中,若要对分组后的结果进行筛选(例如筛选选课门数大于3的学生),应使用______子句。
A. WHERE B. ORDER BY C. GROUP BY D. HAVING
解析: WHERE在分组前筛选行,HAVING在分组后筛选组,且HAVING必须跟在GROUP BY之后。
题目: 使用 ______ 关键字可以将多个查询结果集合并到一起,并自动去除重复记录。
A. UNION ALL B. UNION C. JOIN D. CONCAT
解析: UNION合并结果集并自动去重,UNION ALL保留所有记录(含重复)。JOIN用于连接表,CONCAT用于连接字符串。
题目: 在 SQL 中,使用 < 运算符与 NULL 值进行比较(如 age < NULL),结果是______。
A. NULL B. TRUE C. FALSE D. 0
解析: 任何与NULL的算术或比较运算,结果都是NULL。判断NULL应使用IS NULL或IS NOT NULL。
题目: 语句 SELECT 0 OR (4>3); 的运行结果是______。
A. 0 B. 1 C. NULL D. False
解析: 4>3为真即1,0 OR 1 结果为 1。MySQL中逻辑运算返回0或1。
**题目:**在数据分组查询中,SELECT 子句的列表只能是_________
A.数据表中的字段
B.字段表达式
C.分组字段或聚合函数指定的列
D.分组字段
解析:
在标准的 SQL 分组查询(
GROUP BY)中,SELECT子句后的字段列表受到严格限制,只能包含以下两类:
- 分组字段:即
GROUP BY子句中出现的字段。因为这些字段在每一组中是唯一的、确定的。- 聚合函数指定的列:如
COUNT(),SUM(),AVG(),MAX(),MIN()等。这些函数将一组内的多行数据统计为一个结果。为什么不能选 A 或 B? 如果
SELECT列表中包含了一个既没有被分组,也没有被聚合的字段(例如:按“班级”分组,但想查询“学生姓名”),数据库将无法确定在显示该组(班级)的一行结果时,到底该显示哪一个学生的姓名(因为一个班级有多个学生)。这违背了 SQL 的确定性原则。
7. 考察聚合函数
题目: SQL 中执行最小值运算的函数是______。
A. MIN() B. LEAST() C. SMALL() D. LOWER()
解析: MIN()是聚合函数,用于求某一列的最小值;LEAST()是普通函数,用于取参数列表中的最小值,如 LEAST(10, 2, 5) 返回2。LOWER()用于转换小写。
8. 考察连接查询
题目:执行连接查询时,若希望返回左表的所有记录,即使右表中没有匹配的记录(右表字段显示为NULL),应使用______。
A. INNER JOIN B. LEFT JOIN
C. RIGHT JOIN D. CROSS JOIN
**解析:**LEFT JOIN返回左表所有记录,右表无匹配则为NULL;INNER JOIN只返回两表中匹配的记录;RIGHT JOIN返回右表所有记录。
9. 考察视图
题目:关于视图(View)的描述,下列哪项是错误的?
A. 视图是虚拟表,不存储实际数据 B. 视图可以简化复杂的SQL查询
C. 视图的数据可以直接修改,没有任何限制 D. 视图的定义存储在数据库中
**解析:**虽然视图可以更新,但更新有限制条件(如不能包含GROUP BY、聚合函数、DISTINCT等),且可使用WITH CHECK OPTION进一步限制。
题目: 关于查看视图,下列说法正确的是______。
A. 使用 DESC 和 SHOW 查看视图,显示结果完全相同
B. 使用 DESC 和 SHOW 查看视图,显示结果不相同
C. 不能使用 DESC 查看视图
D. 视图没有结构,无法查看
解析: DESC 视图名 显示视图的列结构;SHOW CREATE VIEW 视图名 显示视图的创建语句,两者内容不同。
10. 考察权限管理
题目:在MySQL中,用于授予用户权限的关键字是______。
A. REVOKE B. CREATE C. GRANT D. ALTER
解析:
GRANT用于授权,REVOKE用于回收权限,CREATE USER用于创建用户。
11. 考察事务
题目:事务的ACID特性中,“原子性”(Atomicity)是指______。
A. 事务提交后永久生效 B. 事务执行前后数据状态保持一致
C. 事务的操作要么全做,要么全不做 D. 并发事务之间互不干扰
**解析:**A是持久性(Durability),B是一致性(Consistency),D是隔离性(Isolation),C是原子性(Atomicity)。
题目: MySQL 默认的事务隔离级别是______。
A. READ UNCOMMITTED B. READ COMMITTED C. REPEATABLE READ D. SERIALIZABLE
解析: MySQL默认隔离级别是REPEATABLE READ(可重复读),可以防止脏读和不可重复读。
题目: 下列哪项不是事务的标准状态?
A. 活动的 (Active) B. 提交的 (Committed) C. 失败的 (Failed) D. 挂起的 (Pending)
解析: 事务的标准状态包括:活动的、部分提交的、失败的、中止的、提交的。"挂起的"不是标准状态。
题目: 发生"丢失更新"的情况是指______。
A. 两个事务同时读取数据 B. 两个事务同时更新,一个覆盖了另一个
C. 一个事务读取了另一个事务未提交的数据 D. 事务提交失败
解析: 丢失更新是指两事务同时读取同一数据并修改,后提交的覆盖了先提交的修改。C描述的是脏读。
12. 考察范式
题目:第三范式(3NF)在2NF的基础上,消除了非主属性对主码的______。
A. 部分函数依赖 B. 传递函数依赖 C. 完全函数依赖 D. 多值依赖
**解析:**2NF消除部分依赖,3NF消除传递依赖。
题目:关系模式 R 属于第三范式的条件是_________。
A.不存在部分函数依赖 B.不存在传递函数依赖
C.每个属性都是不可再分 D.以上三个条件都满足
13. 考察MySQL编程(变量、函数)
题目:在MySQL中,系统变量通常以______字符开头。
A. @ B. @@ C. # D. $
**解析:**用户变量/局部变量通常以@开头,系统变量前缀为@@(如@@version)。
题目: 下列函数中,能将多个参数连接成一个字符串并返回的是______。
A. CONCAT() B. SUBSTRING() C. TRIM() D. LENGTH()
解析: CONCAT()连接字符串,SUBSTRING()截取子串,TRIM()去除空格,LENGTH()返回长度。
题目: 返回一个 0 到 1 之间的随机浮点数的函数是______。
A. ABS() B. ROUND() C. RAND() D. FLOOR()
解析: RAND()返回0-1之间的随机数,ABS()取绝对值,ROUND()四舍五入,FLOOR()向下取整。
14. 考察触发器
题目:触发器(Trigger)不能在以下哪种事件发生时执行?
A. SELECT B. INSERT C. UPDATE D. DELETE
**解析:**触发事件关键字包括INSERT、UPDATE和DELETE,不包含SELECT。触发器用于数据修改操作。
15. 考察Python连接
题目:在使用Python的pymysql库连接数据库后,用于执行SQL语句的对象是______。
A. connection B. cursor C. execute D. fetchall
**解析:**先获取cursor = conn.cursor(),然后通过cursor对象的execute()方法执行SQL,fetchall()用于获取结果。
题目: Python 所有的数据库接口程序(如 pymysql)都遵守 ______ 规范。
A. Python SQL Standard B. Python DB API C. JDBC D. ODBC
解析: Python DB API是Python数据库接口的标准规范,pymysql、sqlite3等都遵守此规范。JDBC是Java的,ODBC是通用的数据库连接接口。
16. 考察字符编码
题目: 如果数据库主要支持中文,数据量大且对性能要求较高,建议选择的字符编码是______。
A. utf8 B. utf8mb4 C. gbk D. latin1
解析: GBK是双字节编码,比UTF8(三/四字节)更省空间且处理中文更快,但通用性不如UTF8。utf8mb4支持完整的Unicode(包括emoji)。
填空题(十五题)
1. 考察数据库系统概述
题目: 数据库系统的数据具有整体结构化、______高、冗余度低和数据独立性高等特点。
答案:共享性 题目: 数据模型的三要素包括数据结构、_________和数据完整性约束。
答案:数据操作
题目: 将数据库从 SQL SERVER 中删除,但使数据库中的数据文件和事务日志文件保持不变的 操作是_________。
答案:分离数据库
2. 考察三级模式
题目: 数据库系统的三级模式结构包括外模式、模式和______。
答案:内模式
3. 考察关系完整性
题目: 关系模型的完整性约束包括实体完整性、______完整性和用户自定义完整性。
答案:参照
4. 考察SQL约束
题目: 定义表结构时,若要求某列的值不能为空,应使用 ______ 约束。
答案:NOT NULL
题目: 在数据表中保证指定列数据正确性的约束是_________。
答案:CHECK
5. 考察SQL删除
题目: 在SQL中,删除数据表中的数据(仅删除行)使用的命令是______,而删除整个数据库使用的命令是 DROP DATABASE。
答案:DELETE 题目: SQL中,删除数据表中所有记录且不记录日志(速度更快)的命令是______。
答案:TRUNCATE
解析: DELETE逐行删除并记录日志,可回滚;TRUNCATE直接清空表,不记日志,速度快但不可回滚。
题目: 删除数据库使用的 SQL 命令动词是_________。
答案:DROP
6. SQL查询
题目: 若想查询成绩表并按成绩从高到低排序,应在ORDER BY子句后使用关键字______。
答案:DESC
解析: DESC表示降序(从高到低),ASC表示升序(从低到高,默认)。
题目: 在 SQL 查询中,使用正则表达式进行匹配的关键字是 ______。
答案:REGEXP
解析: LIKE用于简单模糊匹配,REGEXP用于正则表达式匹配,功能更强大。
题目: 语句 "SELECT 20/5*2;" 的运行结果是 ______。
答案:8.0000
解析: MySQL除法默认返回浮点数,20/5=4.0000,4.0000*2=8.0000。
**题目:**在 T-SQL 中,可以同时输出多个变量的语句是_________。
答案:SELECT
7. 考察权限管理
题目: 使用GRANT语句授权时,通过添加______子句,可以使被授权用户具备将权限转移给其他用户的能力。
答案:WITH GRANT OPTION
8. 考察用户管理
题目: MySQL中,创建用户并设置密码的关键字是______和IDENTIFIED BY。
答案:CREATE USER
9. 考察视图
题目: 创建视图时,若需强制通过视图修改数据时必须满足视图定义的条件,应在定义中包含______子句。
答案:WITH CHECK OPTION
10. 考察事务
题目: 事务的四个特性简称为ACID,其中I代表______性。
答案:隔离 (Isolation)
11. 考察备份与恢复
题目: ______备份是指备份上次完整备份之后所有发生变化的数据。
答案:差异 解析: 完整备份:备份全部;差异备份:备份上次完整备份后的变化;增量备份:备份上次任意备份后的变化。
题目: 数据库恢复的基础是______文件,它记录了数据库的所有变更操作。
答案:日志(或 Redo Log/Binlog)
12. 考察范式
题目: 第二范式(2NF)解决了非主属性对主码的______函数依赖问题。
答案:部分
13. 考察MySQL编程
题目: 在MySQL中,单行注释可以使用字符“#”或者“______”。
答案:-- (注意--后有空格)
题目: MySQL 中,系统变量分为全局变量(Global)和 ______ 变量两类。
答案:会话 (Session)
14. 考察存储过程与函数
题目: MySQL 存储过程中,用于接收外部传入值的参数类型是 ______,用于输出值的参数类型是 OUT。
答案:IN
解析: 存储过程参数类型:IN(输入)、OUT(输出)、INOUT(输入输出)。
题目: 创建存储函数时使用的关键字是 ______。
答案:CREATE FUNCTION
15. 考察触发器
题目: 触发器定义中,指定触发时机的关键字包括______和AFTER。
答案:BEFORE 解析: BEFORE在操作执行前触发,AFTER在操作执行后触发。
判断题(十题)
1. 考察数据库系统概述
题目: 与文件系统相比,数据库系统的数据冗余度更大,数据一致性更差。 ( )
答案:×
**解析:**数据库系统的特点是共享性高、冗余度低、数据一致性好。
2. 考察约束
题目: 一个数据表中可以定义多个主码(Primary Key)。 ( )
答案:×
**解析:**一个表只能定义一个PRIMARY KEY,但可以有多个UNIQUE约束。
**题目:**一个数据表可以定义多个唯一键约束。 ( )
答案:√ 题目: 关系数据库中,两表之间是一对多关系时,通常在"一"的一方建立外键指向"多"的一方。 ( )
答案:×
解析: 应该在"多"的一方建立外键指向"一"的一方。口诀:"多端加外键"。
**题目:**一个关系模式中外码只能有一个。 ( )
答案:×
3. 考察SQL语法
题目: 在INSERT语句中,如果省略了字段列表,则VALUES后的值列表必须包含表中所有字段的值,且顺序必须与表结构一致。 ( )
答案:√
题目: 使用 UPDATE 语句如果不带 WHERE 条件,会更新数据表中的所有记录。 ( )
答案:√
解析: 同理,DELETE不带WHERE会删除所有记录,这是危险操作。
题目: 在 MySQL 中定义字段别名时,AS 关键字是必须的,不能省略。 ( )
答案:×
解析: AS可以省略,用空格隔开即可,如 SELECT cn 课程名 FROM c;
题目: SELECT * FROM tb_student LIMIT 30; 语句的作用是显示表中第 30 行记录。 ( )
答案:×
解析: LIMIT 30 是显示前30行记录,不是第30行。
4. 考察连接查询与子查询
题目: 在进行连接查询时,INNER JOIN 会返回两表中不匹配的记录,并将不匹配的字段设为NULL。 ( )
答案:×
**解析:**这是LEFT JOIN或RIGHT JOIN的特性,INNER JOIN只返回匹配记录。
题目: 子查询只能出现在 SELECT 语句的 WHERE 子句中。 ( )
答案:×
解析: 子查询也可以出现在 FROM 子句(作为派生表)、SELECT 列表中。
5. 考察视图
题目: 视图是一个虚表,它占用物理存储空间来存储数据副本。 ( )
答案:×
解析: 视图不占用物理存储空间存数据,只存储定义(SQL语句),数据动态从基表获取。
6. 考察事务
题目: "脏读"是指一个事务读取了另一个事务尚未提交的数据。 ( )
答案:√
解析: 脏读、不可重复读、幻读是并发事务的三种问题。
7. 考察WHERE与HAVING
题目: WHERE子句和HAVING子句都可以用于筛选数据,且它们可以互换使用。 ( )
答案:×
解析: WHERE过滤行(分组前执行),HAVING过滤组(分组后执行),不能互换。HAVING必须与GROUP BY一起使用。
8. 考察范式
题目: 如果一个表只有两个字段(学号,姓名),且学号是主键,那么这个表一定满足第二范式(2NF)。 ( )
答案:√
解析: 2NF是消除非主属性对主码的"部分"依赖。如果主码是单字段(如学号),不存在组合主键,自然不存在部分依赖,所以自动满足2NF。
9. 考察变量
在MySQL中,局部变量通常以“@@”开头,系统变量以“@”开头。 ( )
答案:×
**解析:**说反了。系统变量以@@开头(如@@version),用户变量/局部变量以@开头。
10. 考察存储过程与函数
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,可以被重复调用。 ( )
答案:√
**解析:**符合存储过程的定义。
题目: MySQL 中存储函数必须返回一个值。 ( )
答案:√
解析: 存储函数必须有RETURN语句返回值,存储过程可以不返回值。
11. 考察触发器
题目: 触发器的核心作用是自动执行预设操作,必须通过 CALL 语句来调用。 ( )
答案:×
解析: 触发器是在特定事件(INSERT/UPDATE/DELETE)发生时自动触发执行的,不能用CALL调用。CALL用于调用存储过程。
12.考察模式
题目: 数据库系统中内模式是由 DBMS 完成。 ( )
答案:√
13. 考察sql
**题目:**在数据表中,使用 T-SQL 语句查询时查询字段顺序不能改变。 ( )
答案:×
**题目:**任何两个表中的数据都可以使用 T-SQL 语句进行内连接查询。 ( )
答案:×
14.考察索引
题目: 一个表可以同时拥有多个聚集索引。 ( )
答案:×
解析: 一个表只能有一个聚集索引,因为数据只能有一种物理排列方式。
简答题(五题)
1. 考察数据库系统基础与架构
考察点: 数据库的基本概念、与旧技术的对比、核心架构。
- 题目: 请简述数据库系统的三级模式结构及其如何实现数据独立性。
三级模式:外模式(用户视图)、模式(全局逻辑结构)、内模式(物理存储结构)
数据独立性实现:
- 当模式改变时,只需修改外模式/模式映像,外模式不变 → 逻辑独立性
- 当内模式改变时,只需修改模式/内模式映像,模式不变 → 物理独立性
- 题目: 请简述数据库系统与文件系统的主要区别。(数据库系统阶段数据管理的特点)
文件系统中数据记录内有结构但整体无结构,共享性差、冗余度大,数据独立性差,由应用程序管理和控制数据。
数据库系统中数据整体结构化,共享性高、冗余度低,数据独立性高,由DBMS统一管理并提供安全性、完整性、并发控制等功能。
- 题目: 联系的定义及分类。(属于ER模型基础)
定义: 现实世界中事物内部或事物之间的联系在信息世界中的反映(即实体集之间的逻辑关系)。
分类:
- 一对一 (1:1): 如班长与班级。
- 一对多 (1:n): 如班级与学生。
- 多对多 (m:n): 如学生与课程。
2. 关系数据库设计理论(范式)
考察点: 如何规范化设计数据库,减少冗余和异常。
- 题目: 请简述第二范式(2NF)的定义及其解决的问题。
第二范式是指在满足1NF的基础上,非主属性完全函数依赖于主码,即消除非主属性对主码的部分函数依赖。
解决的问题:
(1)消除非主属性对主码的部分函数依赖 (2)减少数据冗余 (3)避免插入异常、删除异常、更新异常
- 题目: 请简述第三范式(3NF)的定义及其作用。
定义:在2NF基础上,消除非主属性对主码的传递函数依赖(即不存在 A→B→C 的传递依赖)
作用:
(1)进一步减少数据冗余 (2)提高数据一致性 (3)便于数据维护
3. SQL 查询与操作
考察点: SQL语言的核心逻辑,表连接与查询优化概念。
- 题目: 请列举并简要说明 INNER JOIN 和 LEFT JOIN 的区别。
INNER JOIN是内连接,只返回两表中匹配的记录,不匹配的记录不显示。
LEFT JOIN是左外连接,返回左表所有记录,如果右表没有匹配的记录则显示为NULL。
- 题目: 请简述 SQL 查询中子查询与连接查询的主要区别。
子查询是嵌套的SELECT语句,从内向外逐层执行,结果通常来自一个表,适用于条件值来自其他表的场景,可能执行较慢。
连接查询是多表通过JOIN连接,同时处理多表,结果可来自多个表,适用于需要显示多表字段的场景,通常性能更高。
4. 数据库对象(视图、表)
考察点: 虚拟表(视图)与实体表及其应用场景。
- 题目: 简述 MySQL 中表和视图的本质区别以及在实际应用中如何选择使用它们。
数据表是实际存储数据的物理结构,占用存储空间,存储真实数据,可直接修改。
视图是虚拟表,只存储查询定义的SQL语句,不存储实际数据,数据动态从基表获取,更新有限制条件。
选择建议:需要永久存储数据用表,需要简化查询、限制访问或提供不同视角时用视图。
5. 数据库编程(存储过程、函数、触发器)
考察点: 数据库的高级功能和自动化逻辑。
- 题目: 请从参数类型、调用方式两个方面简述存储过程与存储函数的区别。
参数类型:
- 存储过程: 支持
IN(输入)、OUT(输出)、INOUT(输入输出)三种类型。- 存储函数: 通常只支持
IN(输入)参数。调用方式:
- 存储过程: 使用
CALL语句独立调用。- 存储函数: 作为表达式的一部分在 SQL 语句中调用(如
SELECT func_name() FROM table)。(补充:函数必须返回值,过程可以不返回)
- 题目: 触发器的作用。
触发器是一种在特定事件(INSERT/UPDATE/DELETE)发生时自动执行的特殊存储过程。主要作用有:
- 安全性约束: 强制实施复杂的业务规则和约束。
- 数据完整性: 实现级联更新或删除。
- 审计与日志: 自动记录数据变动历史。
- 数据校验: 在写入数据前进行合法性检查。
6. 事务管理
考察点: 数据的一致性与并发控制。
- 题目: 事务的 ACID 特性。
A - 原子性 (Atomicity): 事务是不可分割的最小工作单位,要么全部成功,要么全部失败回滚。
C - 一致性 (Consistency): 事务执行前后,数据库必须从一个一致性状态变到另一个一致性状态。
I - 隔离性 (Isolation): 并发执行的事务之间互不干扰,一个事务的中间状态对其他事务不可见。
D - 持久性 (Durability): 事务一旦提交,对数据的修改就是永久的,即使系统故障也不会丢失。
7. 安全与用户管理
考察点: 权限控制、账户维护(DCL)。
- 题目 1.5: MySQL 中可以授予的权限有哪几种。
数据操作权限: 如
SELECT,INSERT,UPDATE,DELETE(针对表数据)。数据定义权限: 如
CREATE,ALTER,DROP,INDEX(针对库表结构)。管理权限: 如
CREATE USER,GRANT OPTION,SHUTDOWN,ALL PRIVILEGES(针对服务器管理)。
- 题目: 请简述 MySQL 用户管理的基本操作包括哪些。
MySQL用户管理基本操作包括:使用CREATE USER创建用户,使用DROP USER删除用户,使用ALTER USER修改用户密码,使用GRANT授予权限,使用REVOKE回收权限,使用SHOW GRANTS查看用户权限。
代码操作题
练习一:超市商品供应链管理系统
某超市商品供应链管理系统数据库的E-R图如下
包含三个实体:商品、仓库和供应商
实体间关系为:
一个供应商可供应多种商品(每种商品仅由一个供应商供应);
一个仓库可存放多种商品,一种商品可存放在多个仓库。
请按要求完成下面的操作。
(1)将E-R图转换为关系模式,用下划线标出每个关系模式的主码。
供应商 (编号, 名称, 电话, 地址)
商品 (商品编号, 商品名称, 生产日期, 类别, 单价, 供应商编号)
仓库 (仓库编号, 仓库名称, 容量, 负责人, 地址)
储存 (商品编号, 仓库编号 ,库存量)
- 考查内容: 概念模型(E-R图)向逻辑模型(关系表)的转换规则。
- 难点: 外键放在哪里?是否需要新建表?
【通用解题公式:如何应对变形题】
遇到 E-R 图转关系模式,只需记住三条铁律:
- 实体转表: 矩形框(实体)直接变成一张表,属性照抄。
- 1:N 关系(一对多): 不建新表。
- 口诀: “多端加外键”。把“1”那端的主码加到“N”那端的表中作为外键。
- 本题应用: 供应商(1) -> 商品(N)。所以在“商品”表中加“供应商编号”。
- M:N 关系(多对多):
- 必建新表。
- 口诀: “新表两主码”。新表的属性 = 两端实体的主码 + 关系本身的属性(如本题的“库存量”)。
- 主码: 两个外键组合在一起构成联合主码。
- 本题应用: 商品(M) <-> 仓库(N)。新建“储存”表,包含“商品编号”、“仓库编号”和“库存量”。
(2)使用SQL语句查询"日用品类"商品的所有信息。
SELECT * FROM 商品 WHERE 类别 = '日用品类';
【通用公式】
- 精确查询:
SELECT * FROM 表名 WHERE 字段名 = '值';
(3)查询北京供应商的名称、地址及联系电话。
SELECT 名称, 地址, 电话 FROM 供应商 WHERE 地址 = '北京';
可以只查出某几个字段
【通用公式】
- 精确查询(只查某几个字段):
SELECT 字段名1,字段名2,字段名3…… FROM 表名 WHERE 字段名 = '值';
(4)使用SQL语句查询商品名称中包含"电子"的商品信息。
SELECT * FROM 商品 WHERE 商品名称 LIKE '%电子%';
【通用公式】
- 模糊查询: 只要题目出现“包含”、“xx地”、“姓x”,立刻用
LIKE。 - 通配符:
%代表任意个字符。%电子%表示中间有电子就行。
(5)使用SQL语句按类别统计商品平均单价,并根据平均单价降序排序。
SELECT 类别, AVG(单价) FROM 商品 GROUP BY 类别 ORDER BY AVG(单价) DESC;
【考点解析】
- 分组(GROUP BY): 题目出现“按...统计”、“每...的...”,必须用 GROUP BY。
- 聚合函数: 平均(
AVG),总和(SUM),最大(MAX),计数(COUNT)。 - 排序(ORDER BY): 降序是
DESC,升序是ASC(默认,可不写)。
【通用公式】
SELECT 分组字段, 聚合函数(统计字段)
FROM 表
GROUP BY 分组字段
ORDER BY 排序字段 DESC;
(6)使用SQL语句查询商品信息表中与"笔记本电脑"生产日期相同的商品信息。
SELECT * FROM 商品 WHERE 生产日期 = ( SELECT 生产日期 FROM 商品 WHERE 商品名称 = '笔记本电脑' );
【考点解析】
- 考查内容: 子查询(Subquery)。
- 思路: 分两步想。
- 第一步:找笔记本电脑的日期(作为子查询)。
- 第二步:找谁的日期等于这个日期(作为主查询)。
【通用公式】
SELECT * FROM 表
WHERE 字段 = (
SELECT 字段 FROM 表 WHERE 已知条件
);
(7)请根据超市商品供应链管理系统的关系模式,按下面题目要求完成操作:
使用SQL语句创建存储过程,名称为CK_XX,根据仓库编号查询仓库的信息,若输入仓库编号不存在,返回"无匹配数据"提示,并执行此存储过程。
"说明:执行存储过程时仓库编号写"ck0058"。
DELIMITER &&
CREATE PROCEDURE CK_XX(IN P_ID CHAR(6)) BEGIN SELECT COUNT(*) INTO @num FROM 仓库 WHERE 仓库编号 = P_ID;
IF @num > 0 THEN SELECT * FROM 仓库 WHERE 仓库编号 = P_ID; ELSE SELECT '无匹配数据'; END IF;
END &&
DELIMITER ;
CALL CK_XX('ck0058');
-- 1. 修改结束符
-- 默认结束符是分号(;),但在存储过程中需要写分号,为了不让数据库误以为语句结束了,
-- 我们先把结束符改成 && (或者 //,$ 等都可以,只要不常用即可)
DELIMITER &&
-- 2. 定义存储过程
-- 格式:CREATE PROCEDURE 名字(IN 参数名 类型)
-- 注意:参数类型要足够长,比如 CHAR(10) 或 VARCHAR(20)
-- 由题目决定 如本题ck0058长度为6 所以用CHAR(6)
CREATE PROCEDURE CK_XX(IN P_ID VARCHAR(20))
BEGIN
-- 3. 核心步骤:计数判断法
-- 作用:去表里数一数,ID等于参数的记录有几条?
-- 关键点:INTO @num 表示把数出来的结果(0或1)存进变量 @num 里
SELECT COUNT(*) INTO @num FROM 仓库 WHERE 仓库编号 = P_ID;
-- 4. 逻辑分支:根据数量决定做什么
-- 如果 @num 大于 0,说明找到了数据(存在)
IF @num > 0 THEN
-- 题目要求:存在时显示信息
SELECT * FROM 仓库 WHERE 仓库编号 = P_ID;
ELSE
-- 题目要求:不存在时显示提示
-- 直接 SELECT 一个字符串,就会在前台显示为一行字
SELECT '无匹配数据';
END IF;
-- 5. 结束定义
-- 必须使用第1步定义的那个特殊结束符 &&
END &&
-- 6. 恢复结束符
-- 这一步很重要!把结束符改回分号(;),否则后面没法写普通SQL了
DELIMITER ;
-- 7. 调用
-- 格式:CALL 过程名('实参')
CALL CK_XX('ck0058');
【通用公式模板】
DELIMITER &&
CREATE PROCEDURE 过程名(IN 参数名 参数类型) BEGIN -- 第一步:数一数有几个(核心) SELECT COUNT(*) INTO @num FROM 表名 WHERE 主键 = 参数名;
-- 第二步:根据数量写 IF IF @num > 0 THEN -- 存在时的操作(比如查询、更新) SELECT ...; ELSE -- 不存在时的操作(比如报错) SELECT '提示信息'; END IF; END &&
DELIMITER ;
-- 调用
CALL 过程名('实参');
练习二:教学管理系统
包含实体:专业、教师、学生、课程
关系:开课(专业-课程 1:N)、教学(教师-课程 M:N)、选修(学生-课程 M:N)
- 将 E-R 图转换为关系模式,用下划线标出每个关系模式的主码。
专业 (专业号, 专业名)
教师 (职工号, 姓名, 性别)
学生 (学号, 姓名, 性别, 年龄)
课程 (课程号, 课程名, 学分, 专业号)
教学 (课程号, 职工号, 教师评价)
选修 (课程号, 学号, 成绩)
- 实体直接转表: 专业、教师、学生、课程(课程是实体,先转出来)。
- 1:N 关系处理:
- 关系:
开课(专业 1 —— N 课程)。 - 规则:把“1”端的主码(专业号)放到“N”端(课程)里做外键。所以
课程表最后多了个专业号。
- 关系:
- M:N 关系处理:
- 关系:
教学(课程 M —— N 教师)、选修(课程 M —— N 学生)。 - 规则:必须新建表。
- 教学表: 主码 = 课程号 + 职工号。属性 = 教师评价。
- 选修表: 主码 = 课程号 + 学号。属性 = 成绩。
- 关系:
- 使用 SQL 语句查询男教师的所有信息。
SELECT * FROM 教师 WHERE 性别 = '男';
- 使用 SQL 语句查询女学生且年龄在 18-21 岁之间的学生姓名、性别、年龄。
SELECT 姓名, 性别, 年龄 FROM 学生 WHERE 性别 = '女' AND 年龄 BETWEEN 18 AND 21;
- 使用 SQL 语句查询学生姓名中包含“龙”字的学生信息。
SELECT * FROM 学生 WHERE 姓名 LIKE '%龙%';
- 包含某字:
LIKE '%字%' - 以某字开头(姓龙):
LIKE '龙%' - 以某字结尾(叫龙):
LIKE '%龙'
练习三:图书馆借阅管理系统
某图书馆借阅管理数据库的E-R图包含三个实体:书籍、借书人、出版社,实体间关系为:
1、将 E-R 图转换为关系模式,用下划线标出每个关系模式的主码。
出版社 (出版社名, 地址, 邮编, 电话, 电话编号)
书籍 (书号, 书名, 分类, 库存数量, 存放位置, 出版社名)
借书人 (借书证号, 姓名, 单位, 联系电话)
借阅 (借书证号, 书号, 借书日期, 还书日期)
- 1:N 关系(出版): 出版社(1) -> 书籍(N)。
- 把“1”端的主码(出版社名)放入“N”端(书籍)做外键。
- M:N 关系(借阅): 必须新建表。
- 主码是联合主码(借书证号 + 书号),通常还要加上“借书日期”,防止同一个人多次借同一本书导致主键冲突。
2、查询“机械工业出版社”出版的所有书籍信息,显示书名、书号、库存数量、存放位置,仅保留库存数量大于 5 的书籍记录。
SELECT 书名, 书号, 库存数量, 存放位置 FROM 书籍 WHERE 出版社名 = '机械工业出版社' AND 库存数量 > 5;
【通用公式】 WHERE 条件1 AND 条件2
3、统计“计算机科学”类书籍的总借阅次数,结果列名为“计算机科学类书籍总借阅次数”。
SELECT COUNT(*) AS 计算机科学类书籍总借阅次数 FROM 借阅 a JOIN 书籍 b ON a.书号 = b.书号 WHERE b.分类 = '计算机科学';
【解析】
- 陷阱: “借阅次数”是在
借阅表中数的,但“计算机科学”这个分类是在书籍表中的。 - 方案: 必须把两张表连起来(JOIN),然后过滤分类,最后 COUNT。
4、查询“张伟”所有借阅记录,显示书名、借书日期、还书日期、出版社名,按借书日期降序排序。若还书日期为空,则显示“未还书”。
SELECT b.书名, r.借书日期, IFNULL(r.还书日期, '未还书') AS 还书日期, b.出版社名 FROM 借书人 u JOIN 借阅 r ON u.借书证号 = r.借书证号 JOIN 书籍 b ON r.书号 = b.书号 WHERE u.姓名 = '张伟' ORDER BY r.借书日期 DESC;
【解析】
- 四表关联? 不,是三表。借书人 -> 借阅 -> 书籍。(题目要出版社名,所以其实这里书籍表里有出版社名,如果出版社名只在出版社表,那就得连四张表)。
- IFNULL函数: 题目要求“为空显示xxx”,MySQL中使用
IFNULL(字段, '默认值'),SQL Server 使用ISNULL(),Oracle 使用NVL()。考试一般默认为 MySQL。
5、将书号“TP311.12”的库存增加“50”,存放位置改为“4楼5区”。
UPDATE 书籍 SET 库存数量 = 库存数量 + 50, 存放位置 = '4楼5区' WHERE 书号 = 'TP311.12';
【解析】
- 增加: 写法是
字段 = 字段 + 50,不要写成字段 = 50。
6、删除 2024年12月31日 前借出且至今未还(还书日期为空)的所有借阅记录。
DELETE FROM 借阅 WHERE 借书日期 < '2024-12-31' AND 还书日期 IS NULL;
【解析】
- 日期比较: 直接用
<或>符号。 - 空值判断: 必须用
IS NULL,千万不能写= NULL。
7、用 SQL 语句创建存储过程,名称为 JY_CX。根据借书证号查询该借书人的所有借阅记录(包括书名、借书日期、还书日期、库存数量),若输入借书证号不存在,返回“无匹配借阅数据”提示。执行此存储过程,参数填写“JY_0001”。
DELIMITER &&
CREATE PROCEDURE JY_CX(IN P_ID VARCHAR(20)) BEGIN -- 1. 计数判断 SELECT COUNT(*) INTO @num FROM 借书人 WHERE 借书证号 = P_ID;
-- 2. 逻辑分支 IF @num > 0 THEN -- 存在:需要显示书名(在书籍表),所以必须 JOIN SELECT b.书名, r.借书日期, r.还书日期, b.库存数量 FROM 借阅 r JOIN 书籍 b ON r.书号 = b.书号 WHERE r.借书证号 = P_ID; ELSE -- 不存在 SELECT '无匹配借阅数据'; END IF; END &&
DELIMITER ;
-- 调用 CALL JY_CX('JY_0001');
【解析】 “隐蔽的 JOIN”
- 为什么要在存储过程里写 JOIN?
- 输入参数:借书证号。
- 输出要求:书名、库存状态。
- “书名”只在《书籍》表里,借书证号在《借阅》表里。所以存储过程的
IF成功分支里,必须写一个SELECT ... FROM 借阅 JOIN 书籍 ...。
💡 总结:这套题必须掌握的 3 个公式
1. 空值替换公式:
IFNULL(字段名, '要显示的字')—— 用于处理“若为空则显示...”2. 删除空值记录公式:
DELETE FROM 表 WHERE 字段 IS NULL—— 记住是 IS NULL。3. 三表连接查询公式:
SELECT A.名字, C.书名 FROM 用户表 A JOIN 中间表 B ON A.ID = B.用户ID JOIN 物品表 C ON B.物品ID = C.物品ID WHERE A.名字 = '张伟';
练习四:图书销售系统
(1)创建表结构
CREATE TABLE Book (
ID INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增长
Title VARCHAR(100) NOT NULL, -- 非空
Price FLOAT,
PublishDate DATE,
CategoryId INT,
CHECK (Price > 0), -- 检查约束
FOREIGN KEY (CategoryId) REFERENCES Category(ID) -- 外键
);
(2)插入多条数据
INSERT INTO Book (Title, Price, PublishDate, CategoryId) VALUES
('MySQL必知必会', 45.5, '2023-01-01', 1),
('Python编程', 55.0, '2023-05-01', 2);
(3)更新数据:将《MySQL必知必会》的价格上涨 10 元
UPDATE Book
SET Price = Price + 10
WHERE Title = 'MySQL必知必会';
(4)查询操作
-- 1. 排序查询:查询所有图书,按价格从高到低排序
SELECT * FROM Book ORDER BY Price DESC;
-- 2. 分组统计:按CategoryId分组,统计每类图书的平均价格
SELECT CategoryId, AVG(Price) AS AvgPrice
FROM Book
GROUP BY CategoryId;
-- 3. 两表连接:查询图书名称和其对应的分类名称
SELECT Book.Title, Category.Name
FROM Book
JOIN Category ON Book.CategoryId = Category.ID;
(5)视图与索引
-- 1. 创建视图:查询价格大于50的图书名称和价格
CREATE VIEW v_HighPrice AS
SELECT Title, Price
FROM Book
WHERE Price > 50;
-- 2. 创建索引:在Title列上创建普通索引
CREATE INDEX idx_title ON Book(Title);
-- 3. 查看索引
SHOW INDEX FROM Book;
如何画ER图
- 长方形(实体): 名词。代表“人”或“物”(如:学生、课程、仓库)。
- 椭圆形(属性): 特征。代表实体的细节(如:姓名、单价、地址)。
- 注意:主码(ID)要在文字下画下划线。
- 菱形(联系): 动词。代表实体之间的交互(如:选修、供应、管理)。
拿到一段题目文字(比如:“一个学生可以选多门课...”),按以下顺序操作:
第一步:找名词(画长方形)
通读题目,把所有独立存在的对象圈出来。
- 例子: “学生选修课程,教师讲授课程。”
- 画图: 画出“学生”、“课程”、“教师”三个长方形。
第二步:找动词(画菱形)
看这些名词之间是怎么互动的。
- 例子: 学生选修课程。
- 画图: 在学生和课程之间画一个菱形,写上“选修”,用线连起来。
第三步:贴标签(画椭圆)
把题目中提到的细节属性连到对应的长方形上。
- 关键点: 一定要把主码(如学号、课程号)画下划线!这是拿分点。
第四步:定数量(最重要的一步!)
在连线上标出 1:1、1:N 或 M:N。
判定口诀(双向提问法):
- 左边问右边: 一个学生能选几门课? -> 多门(写 N)
- 右边问左边: 一门课能被几个学生选? -> 多个(写 M)
- 结论: 两边都是“多”,那就是 M:N。
如果是这样的情况:
- 左边问右边: 一个班级有几个学生? -> 多个(写 N)
- 右边问左边: 一个学生属于几个班级? -> 一个(写 1)
- 结论: 一边多一边一,那就是 1:N(N写在“多”的那头)。
模拟练习
题目描述:
某工厂有多个车间,每个车间有多名工人,一名工人只属于一个车间。 工人可以生产多种产品,一种产品可以由多名工人生产。 生产时需要记录“工时”。
解题流程:
- 画实体(方框): 车间、工人、产品。
- 画联系(菱形):
- 车间 ——(属于/拥有)—— 工人
- 工人 ——(生产)—— 产品
- 定关系(填字母):
- 车间 vs 工人: 一个车间有多工人(N),一个工人属于1车间(1)。 -> 1:N
- 工人 vs 产品: 一个工人造多产品(M),一个产品由多工人造(N)。 -> M:N
- 加属性(椭圆): 把编号、姓名等加上去。
- 高频考点: 题目中提到的“工时”是属于谁的?
- 解析: “工时”既不属于工人(他没干活就没工时),也不属于产品。它属于“生产”这个动作。所以“工时”这个椭圆要连在“生产”这个菱形上!(这是 M:N 关系特有的考点)。

💬 评论