--- title: "01-数据库复习" created: 2026-01-11 tags: - 博客 --- # 数据库复习 ## 题型分布 | **题型** | **题数×分值** | **总分** | | --- | --- | --- | | 选择题 | 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是底层支撑。 ![[image-8a8d9b23.png]] **题目:** MySQL 自带的数据库中,主要用于保存 MySQL 服务器维护的所有其他数据库信息(如表名、列名等元数据)的是\_\_\_\_\_\_。 A. world  B. mysql  C. performance\_schema **D. information\_schema** > **解析:** mysql数据库存储用户账户和权限信息;information\_schema存储所有数据库的元数据(表名、列名等);performance\_schema存储性能监控数据。 ![[image-d4029909.png]] **题目:** 用于查看当前正在操作的数据库的命令是\_\_\_\_\_\_。 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.有三个 > **解析:** 在数据库系统的三级模式结构中: > > - **外模式(用户模式):** 可以有**多个**(对应不同的用户视图)。 > - **模式(逻辑模式):** 只能有**一个**(全局逻辑视图)。 > - **内模式(存储模式):** 只能有**一个**。 > > **原因:** 内模式描述的是数据在物理存储介质上的实际存储方式(如文件结构、索引方式等)。一个数据库在物理上只能有一种特定的存储结构,因此内模式是唯一的。 ![[image-a2d95f17.png]] ![[image-77ab582d.png]] ### 3. 考察E-R图转换 ![[image-36c7a4e2.png]] **题目:** 在将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.只有主表中定义了主键或唯一键才能在从表中定义外键约束 > **解析:** > > 1. **A 项正确**:外键约束的主要目的就是维护**参照完整性**,保证数据表之间数据的一致性。 > 2. **B 项正确**:一个数据表可以包含多个外键,分别引用不同表(或同一个表)的主键。 > 3. **C 项错误**:在主从表关系中,外键约束是定义在**从表(子表)上的,用于引用主表(父表)的主键**或唯一键。主表是被引用的对象,不需要在主表中定义外键来约束从表。 > 4. **D 项正确**:这是建立外键约束的前提条件。外键引用的字段必须是主表中的**主键**(Primary Key)或者**唯一键**(Unique Key),否则无法确定引用的唯一性。 ### 5. 考察SQL语言分类 **题目**:下列SQL命令中,用于修改数据库表结构的命令是\_\_\_\_\_\_。 A. UPDATE **B. ALTER** C. INSERT D. GRANT > **解析:**`UPDATE`和`INSERT`是数据操作语言(DML), `GRANT`是数据控制语言(DCL)。`ALTER`用于修改数据库或表结构,属于数据定义语言(DDL)。 ![[image-52901c2c.png]] **题目:** 在 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` 子句后的字段列表受到严格限制,只能包含以下两类: > > 1. **分组字段**:即 `GROUP BY` 子句中出现的字段。因为这些字段在每一组中是唯一的、确定的。 > 2. **聚合函数指定的列**:如 `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)。 ![[image-708b5cf5.png]] **题目:** 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.以上三个条件都满足** ![[image-055d9575.png]] ### 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** ![[image-9d03fd2b.png]] ### 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在操作执行后触发。 ![[image-7e8684b6.png]] ## 判断题(十题) ### 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):** 如班长与班级。 > 2. **一对多 (1:n):** 如班级与学生。 > 3. **多对多 (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)发生时**自动执行**的特殊存储过程。主要作用有: > > 1. **安全性约束:** 强制实施复杂的业务规则和约束。 > 2. **数据完整性:** 实现级联更新或删除。 > 3. **审计与日志:** 自动记录数据变动历史。 > 4. **数据校验:** 在写入数据前进行合法性检查。 ### 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查看用户权限。 ## 代码操作题 ![[image-ad5e27f4.png]] ![[image-4e83ae17.png]] ![[image-870171ba.png]] ### 练习一:**超市商品供应链管理系统** 某超市商品供应链管理系统数据库的E-R图如下 ![[image-dc8e5ccc.png]] 包含三个实体:商品、仓库和供应商 实体间关系为: 一个供应商可供应多种商品(每种商品仅由一个供应商供应); 一个仓库可存放多种商品,一种商品可存放在多个仓库。 请按要求完成下面的操作。 (1)将E-R图转换为关系模式,用下划线标出每个关系模式的主码。 > **供应商** (编号, 名称, 电话, 地址) > > **商品** (商品编号, 商品名称, 生产日期, 类别, 单价, 供应商编号) > > **仓库** (仓库编号, 仓库名称, 容量, 负责人, 地址) > > **储存** (商品编号, 仓库编号 ,库存量) - **考查内容:** 概念模型(E-R图)向逻辑模型(关系表)的转换规则。 - **难点:** 外键放在哪里?是否需要新建表? **【通用解题公式:如何应对变形题】** 遇到 E-R 图转关系模式,只需记住三条铁律: 1. **实体转表:** 矩形框(实体)直接变成一张表,属性照抄。 2. **1:N 关系(一对多):** **不建新表**。 - **口诀:** “多端加外键”。把“1”那端的**主码**加到“N”那端的表中作为**外键**。 - *本题应用:* 供应商(1) -> 商品(N)。所以在“商品”表中加“供应商编号”。 3. **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)。 - **思路:** 分两步想。 1. 第一步:找笔记本电脑的日期(作为子查询)。 2. 第二步:找谁的日期等于这个日期(作为主查询)。 **【通用公式】** `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'); ```sql -- 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) ![[image-0acbc8d2.png]] 1. 将 E-R 图转换为关系模式,用下划线标出每个关系模式的主码。 > **专业** (专业号, 专业名) > > **教师** (职工号, 姓名, 性别) > > **学生** (学号, 姓名, 性别, 年龄) > > **课程** (课程号, 课程名, 学分, 专业号) > > **教学** (课程号, 职工号, 教师评价) > > **选修** (课程号, 学号, 成绩) - **实体直接转表:** 专业、教师、学生、课程(课程是实体,先转出来)。 - **1:N 关系处理:** - 关系:`开课`(专业 1 —— N 课程)。 - 规则:把“1”端的主码(专业号)放到“N”端(课程)里做外键。所以`课程`表最后多了个 `专业号`。 - **M:N 关系处理:** - 关系:`教学`(课程 M —— N 教师)、`选修`(课程 M —— N 学生)。 - 规则:**必须新建表**。 - **教学表:** 主码 = 课程号 + 职工号。属性 = 教师评价。 - **选修表:** 主码 = 课程号 + 学号。属性 = 成绩。 2. 使用 SQL 语句查询男教师的所有信息。 > SELECT \* FROM 教师 WHERE 性别 = '男'; 3. 使用 SQL 语句查询女学生且年龄在 18-21 岁之间的学生姓名、性别、年龄。 > SELECT 姓名, 性别, 年龄 > FROM 学生 > WHERE 性别 = '女' AND 年龄 BETWEEN 18 AND 21; 4. 使用 SQL 语句查询学生姓名中包含“龙”字的学生信息。 > SELECT \* FROM 学生 WHERE 姓名 LIKE '%龙%'; - **包含某字:** `LIKE '%字%'` - **以某字开头(姓龙):** `LIKE '龙%'` - **以某字结尾(叫龙):** `LIKE '%龙'` ### 练习三:**图书馆借阅管理系统** 某图书馆借阅管理数据库的E-R图包含三个实体:书籍、借书人、出版社,实体间关系为: ![[image-7a056ec3.png]] 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)创建表结构** ```sql 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)插入多条数据** ```sql 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 元** ```sql UPDATE Book SET Price = Price + 10 WHERE Title = 'MySQL必知必会'; ``` **(4)查询操作** ```sql -- 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)视图与索引** ```sql -- 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`。 **判定口诀(双向提问法):** 1. **左边问右边:** 一个学生能选几门课? -> 多门(写 N) 2. **右边问左边:** 一门课能被几个学生选? -> 多个(写 M) 3. **结论:** 两边都是“多”,那就是 **M:N**。 *如果是这样的情况:* 1. **左边问右边:** 一个班级有几个学生? -> 多个(写 N) 2. **右边问左边:** 一个学生属于几个班级? -> 一个(写 1) 3. **结论:** 一边多一边一,那就是 **1:N**(N写在“多”的那头)。 #### 模拟练习 **题目描述:** > 某工厂有多个**车间**,每个车间有多名**工人**,一名工人只属于一个车间。 工人可以生产多种**产品**,一种产品可以由多名工人生产。 生产时需要记录“**工时**”。 **解题流程:** 1. **画实体(方框):** 车间、工人、产品。 2. **画联系(菱形):** - 车间 ——(属于/拥有)—— 工人 - 工人 ——(生产)—— 产品 3. **定关系(填字母):** - **车间 vs 工人:** 一个车间有**多**工人(N),一个工人属于**1**车间(1)。 -> **1:N** - **工人 vs 产品:** 一个工人造**多**产品(M),一个产品由**多**工人造(N)。 -> **M:N** 4. **加属性(椭圆):** 把编号、姓名等加上去。 - *高频考点:* 题目中提到的“**工时**”是属于谁的? - *解析:* “工时”既不属于工人(他没干活就没工时),也不属于产品。它属于“生产”这个动作。所以“工时”这个椭圆要连在“生产”这个菱形上!(这是 M:N 关系特有的考点)。 ![[image-cc1bbb2b.png]]