MySQL数据库期末考试

E-R图

E-R图是用于描述实体及其关系的图形化表示方法。

  • 实体:现实世界中独立存在的事物,如人、物、概念或事件。
  • 属性:实体的特征或描述,用于描述实体的特性。
  • 关系:实体之间的联系或关联,描述实体之间的互动方式和依赖关系。

Sql

在 MySQL 数据库中,可以通过以下步骤添加用户:

  1. 使用具有管理员权限的账户登录到 MySQL 服务器。

  2. 执行以下命令来创建一个新用户,并设置密码:

    sql

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
    ````'username'` 替换为你想要创建的用户名,`'localhost'` 表示该用户只能从本地连接访问数据库,`'password'` 替换为用户的密码。
    
  3. 授予用户适当的权限。例如,如果要将用户授予对特定数据库的所有权限,可以使用以下命令:

    sql

    GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';
    ````'database_name'` 替换为数据库的名称,`'username'@'localhost'` 是你之前创建的用户名和访问来源。
    
  4. 刷新权限以使更改生效:

    sql

    FLUSH PRIVILEGES;
    ```
    
  5. 授予所有权限:

    sql

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost';
    ```
    上述语句将授予用户 `'username'` 在所有数据库上的所有权限,且只能从本地连接访问。
    
  6. 授予特定数据库的所有权限:

    sql

    GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';
    ````'database_name'` 替换为特定数据库的名称。
    
  7. 授予特定表的权限:

    sql

    GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.table_name TO 'username'@'localhost';
    ```
    上述语句将授予用户在指定数据库和表上的选择、插入、更新和删除权限。
    
  8. 授予特定权限:

    sql

    GRANT SELECT, INSERT ON database_name.* TO 'username'@'localhost';
    ```
    上述语句将授予用户在指定数据库的所有表上的选择和插入权限。
    
  9. 回收所有权限:

    sql

    REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';
    ```
    上述语句将回收用户 `'username'` 在所有数据库上的所有权限。
    
  10. 回收特定数据库的所有权限:

    sql

    REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'localhost';
    ````'database_name'` 替换为特定数据库的名称。
    
  11. 回收特定表的权限:

    sql

    REVOKE SELECT, INSERT, UPDATE, DELETE ON database_name.table_name FROM 'username'@'localhost';
    ```
    上述语句将回收用户在指定数据库和表上的选择、插入、更新和删除权限。
    
  12. 回收特定权限:

    sql

    REVOKE SELECT, INSERT ON database_name.* FROM 'username'@'localhost';
    ```
    上述语句将回收用户在指定数据库的所有表上的选择和插入权限。
    
  13. SELECT(查询)语句:

  • 选择所有列:SELECT * FROM 表名;
  • 选择特定列:SELECT 列1, 列2 FROM 表名;
  • 使用别名:SELECT 列1 AS 别名1, 列2 AS 别名2 FROM 表名;
  • 去重:SELECT DISTINCT 列 FROM 表名;
  • 条件筛选:SELECT 列1, 列2 FROM 表名 WHERE 条件;
  1. INSERT语句:
  • 插入所有列:INSERT INTO 表名 VALUES (值1, 值2, …);
  • 插入指定列:INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);
  1. UPDATE语句:
  • 更新单个列:UPDATE 表名 SET 列 = 值 WHERE 条件;
  • 更新多个列:UPDATE 表名 SET 列1 = 值1, 列2 = 值2 WHERE 条件;
  1. DELETE语句:
  • 删除所有行:DELETE FROM 表名;
  • 条件删除:DELETE FROM 表名 WHERE 条件;
  • 删除表: drop table 表名;
  1. JOIN语句:
  • 内连接:SELECT * FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;
  • 左连接:SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.列 = 表2.列;
  • 右连接:SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.列 = 表2.列;
  1. 聚合函数:
  • 求和:SELECT SUM(列) FROM 表名;
  • 平均值:SELECT AVG(列) FROM 表名;
  • 最大值:SELECT MAX(列) FROM 表名;
  • 最小值:SELECT MIN(列) FROM 表名;
  • 计数:SELECT COUNT(列) FROM 表名;
  1. 排序:
  • 升序:SELECT * FROM 表名 ORDER BY 列 ASC;
  • 降序:SELECT * FROM 表名 ORDER BY 列 DESC;
  1. 分组:
  • GROUP BY:SELECT 列1, COUNT(列2) FROM 表名 GROUP BY 列1;
  1. 子查询:
  • SELECT * FROM 表1 WHERE 列 IN (SELECT 列 FROM 表2);
  1. 限制结果集:
    • LIMIT:SELECT * FROM 表名 LIMIT 数量;

写一个有参的存储过程

CREATE PROCEDURE 存储过程名称(IN 参数1_类型, IN 参数2_类型)
BEGIN
    -- 存储过程逻辑
    -- 可以在这里执行任何所需的操作,例如插入、更新、查询等

    -- 示例:插入一条数据
    INSERT INTO 表名 (列1, 列2)
    VALUES (参数1, 参数2);

    -- 示例:查询数据
    SELECT * FROM 表名 WHERE 列1 = 参数1;

    -- 示例:更新数据
    UPDATE 表名 SET 列2 = 参数2 WHERE 列1 = 参数1;

    -- 示例:删除数据
    DELETE FROM 表名 WHERE 列1 = 参数1;
END;
CREATE PROCEDURE your_procedure_name(IN parameter1_type, IN parameter2_type)
BEGIN
    -- 存储过程逻辑
    -- 可以在这里执行任何所需的操作,例如插入、更新、查询等
-- 示例:插入一条数据
INSERT INTO your_table (column1, column2)
VALUES (parameter1, parameter2);

-- 示例:查询数据
SELECT * FROM your_table WHERE column1 = parameter1;

-- 示例:更新数据
UPDATE your_table SET column2 = parameter2 WHERE column1 = parameter1;

-- 示例:删除数据
DELETE FROM your_table WHERE column1 = parameter1;
END;

数据库视图的原理:数据库视图是基于查询定义的虚拟表,每次查询视图时,数据库引擎会执行视图定义中的查询并返回结果集。

数据库索引的原理:数据库索引是基于数据列值的数据结构,通过创建索引可以加速数据查询操作,索引存储在特定的数据结构中,可以快速定位满足查询条件的数据行。

索引分为普通索引,唯一索引,主键索引,全文索引,空间索引 (填空)

设置索引时的原则:

  1. 选择适当的索引列,基于查询和业务需求。
  2. 考虑索引的选择性,选择具有高选择性的列作为索引列。
  3. 避免过多的索引,只创建必要的索引,避免冗余。
  4. 考虑索引的大小和内存需求,避免过大的索引占用过多存储空间和内存。

事务具有以下四个性质,通常被称为ACID特性:

  1. 原子性(Atomicity):事务是一个原子操作单元,它要么完全执行成功,要么完全回滚到事务开始前的状态。如果在事务执行过程中发生故障或错误,系统会将事务恢复到原始状态,保证数据的一致性。

  2. 一致性(Consistency):事务在执行前后,数据库必须满足事先定义的一致性约束。这意味着事务的执行不会破坏数据库的完整性规则,如主键约束、外键约束等。如果一个事务违反了一致性规则,系统会回滚该事务,使数据库保持一致状态。

  3. 隔离性(Isolation):事务的隔离性确保每个事务的执行都相互独立,不会相互干扰。一个事务的中间结果对其他事务是不可见的,直到事务提交后才对其他事务可见。这种隔离性可以防止并发执行事务时出现数据读取不一致或写入冲突的问题。

  4. 持久性(Durability):一旦事务提交成功,其对数据库的修改将永久保存,即使在系统发生故障或重启后也能够恢复。保证事务的持久性通常涉及将事务的日志写入稳定的存储介质,如磁盘,以确保在系统故障时能够进行恢复。

  5. 原子性:事务要么完全成功,要么完全失败。

  6. 一致性:事务执行前后保持数据库的一致状态。

  7. 隔离性:事务的执行相互独立,不会相互干扰。

  8. 持久性:事务提交后,对数据库的修改是永久的。

并发控制是数据库管理系统中的一种机制,用于管理并发执行的事务,以防止数据的不一致性问题。并发执行多个事务可能会导致以下数据不一致性问题:

  1. 丢失更新:丢失更新是指在并发环境下,两个或多个事务同时对同一数据进行写操作时,其中一个事务的更新被另一个事务的更新所覆盖,导致部分更新丢失。
  2. 脏读(Dirty Read):一个事务读取了另一个事务尚未提交的数据。如果读取到的数据最终被回滚或修改,那么读取事务就读取到了无效或错误的数据。
  3. 不可重复读(Non-Repeatable Read):一个事务在执行期间多次读取同一数据,但在此期间其他事务修改了该数据。结果是,事务在不同的时间点读取到了不同的数据值,导致不一致性。
  4. 幻读(Phantom Read):一个事务在执行期间多次查询同一范围的数据,但在此期间其他事务插入或删除了符合该范围条件的数据,导致事务在不同的时间点看到了不同数量的数据。

​ 并发控制是数据库管理系统中用于管理并发执行事务的机制,以防止数据的不一致性。常见的数据不一致性问题包括丢失更新、脏读、不可重复读和幻读。

事务的隔离级别是数据库管理系统中用于控制事务之间相互影响程度的一组规定。隔离级别定义了一个事务在并发执行时能够看到其他事务所做的修改的程度,以及能否读取未提交的数据或遭遇其他并发问题。常见的事务隔离级别包括以下四个级别:

  1. 读未提交(数据)(Read Uncommitted):最低的隔离级别,允许一个事务读取另一个事务尚未提交的数据。这种隔离级别存在脏读、不可重复读和幻读问题。
  2. 读已提交(数据)(Read Committed):要求一个事务只能读取已经提交的数据,避免了脏读问题。但在并发环境下仍可能出现不可重复读和幻读问题。
  3. 可重复读(Repeatable Read):要求一个事务在执行期间多次读取同一数据时,能够看到一致的结果。在这个隔离级别下,事务会锁定所读取的数据,避免了脏读和不可重复读问题。但仍可能出现幻读问题。
  4. 串行化(Serializable):最高的隔离级别,要求事务串行执行,完全隔离了并发操作。通过对数据进行严格的锁定,避免了脏读、不可重复读和幻读问题。但由于串行执行,可能导致并发性能下降。

**死锁(Deadlock)和活锁(Livelock)**都是并发系统中的常见问题,它们会导致进程或线程无法继续执行或进入无限循环的状态。

  1. 死锁(Deadlock):
    死锁是指多个进程或线程相互等待对方所持有的资源而无法继续执行的情况。每个进程都等待其他进程释放资源,而没有进程愿意主动释放自己的资源,导致系统无法进行进一步处理,进程无法继续执行。
  2. 活锁(Livelock):
    活锁是指多个进程或线程不断改变自己的状态,但无法向前推进的情况。进程不断响应对方的动作,导致无法完成任务,并陷入无限循环,无法取得进展。

死锁和活锁都是由于多个进程或线程之间的相互竞争资源而导致的问题,但它们的表现形式和原因略有不同。死锁是进程等待对方所持有的资源,导致彼此无法前进;而活锁是进程不断改变状态,但仍然无法向前推进。

为了解决死锁和活锁问题,可以采取以下策略:

  1. 死锁:
    • 避免策略:使用事务、资源分配顺序约定、避免循环等方法来避免资源竞争导致死锁。
    • 检测与恢复策略:实施死锁检测算法,如银行家算法,以及采取适当的措施来解除死锁,如终止某些进程或回滚事务。
    • 预防策略:通过合理的资源分配和调度算法,使死锁发生的可能性降到最低。
  2. 活锁:
    • 调整算法或策略:通过改变进程的调度策略、资源分配策略或算法,使进程能够更好地进行协作和推进。
    • 引入随机性:引入一定的随机性或随机等待时间,以避免进程在竞争条件下产生循环等待。
    • 合理的退让机制:当进程发现自己陷入活锁时,通过适当的退让机制,让其他进程有机会继续执行。

综上所述,死锁和活锁是并发系统中常见的问题,通过合适的策略和算法可以避免或解决这些问题,确保进程或线程能够正常执行而不陷入无法前进的状态。

共享锁(Shared Lock)是数据库中的一种锁机制,也被称为读锁。它允许多个事务或会话同时访问同一资源,但只能以读的方式进行访问,而不允许对资源进行修改操作。

当一个事务获取了共享锁后,其他事务可以继续获取相同的共享锁,以便并发地读取数据。共享锁之间不会互相阻塞,因此多个事务可以同时持有共享锁,从而实现并发读取数据的能力。

共享锁的特点包括:

  • 共享锁之间是兼容的,多个事务可以同时持有共享锁。
  • 共享锁不阻塞其他事务获取相同的共享锁。
  • 共享锁不允许持有锁的事务进行数据修改操作,只能进行读取操作。
  • 共享锁的目的是为了提供并发的读取能力,以实现多个事务同时读取数据而不互相干扰。

共享锁与独占锁(排他锁)相对应,独占锁只允许一个事务独占地持有锁,并阻塞其他事务的读取和修改操作。共享锁适用于并发读取场景,而独占锁适用于需要进行修改操作的场景。

在数据库中,通过使用共享锁和独占锁,可以实现对数据的并发访问控制,保证数据的一致性和隔离性。根据事务的需求,合理地使用共享锁和独占锁可以提高数据库的并发性能和并发控制能力。

绘制E-R图的简化步骤:

  1. 确定实体和属性。

  2. 确定实体之间的关系。

  3. 添加外键表示实体之间的关联。

  4. 考虑约束和限制。

  5. 优化图形布局。

  6. 添加注释和说明。

    • 常见的形状符号如下:

      1. 实体(Entity):使用矩形框表示实体,每个框内写上实体的名称。
      2. 属性(Attribute):使用椭圆形表示属性,将属性名写在椭圆内。
      3. 关系(Relationship):使用菱形表示关系,将关系名称写在菱形内。
      4. 外键(Foreign Key):使用箭头或线条表示外键,表示实体之间的关联。

第1章 教材课后习题解答

  1. 选择题答案

1、A。数据是信息的符号表示,信息是对数据的语义解释。信息包括数据和语义。

2、A。A选项中的内模式是对数据库存储结构的描述,B选项和C选项是一个概念,模式又称为概念模式,是数据库中全体数据的逻辑结构和特征的描述,与具体的应用程序无关,也与实际存储无关。D选项中的外模式是与某一应用有关的数据的逻辑结构。

3、B。以教材中表1-2的学生关系为例,数据项之间存在联系,sno的值决定其他属性的值,例如,如果sno为s1,则与之相关的该学生的其他属性的值也被确定。以教材中表1-2的学生关系和表1-3的课程关系为例,学生记录和课程记录之间存在选课联系。

4、B。数据库管理系统(DBMS)是数据库系统的核心软件,可借助操作系统对数据库进行存取、维护和管理。

5、D。一个数据库中,根据应用不同,可以有多个外模式,每一个外模式和模式会有一个对应的外模式/模式映像,所以外模式/模式映像可以有多个。

6、B。所谓的物理独立性是指当数据的实际存储结构发生变化(例如更换了磁盘)时,不影响数据的全局逻辑结构,这是由模式/内模式映像来处理的。

7、B。一个宿舍可以包括多位学生,一位学生只能入住一间宿舍,所以,宿舍和学生之间是一对多联系。

8、A。内模式与数据的实际物理存储有关,数据库是以文件的形式存储在磁盘上的,如果硬件环境确定了,与之相关的物理存储也就确定了,所以内模式只有一个。

9、D。D选项不是数据库系统的数据模型。面向主题的概念与数据仓库有关。

10、C。性别是属性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20231226175306689
  1. 填空题答案

1、人工管理阶段、文件系统阶段、数据库系统阶段。

2、模式。

3、外模式/模式映像。

4、单用户结构,主从式结构,分布式结构,客户机/服务器结构,浏览器/服务器结构。

5、网状模型。

6、多对多联系。

7、数据库,数据库用户,计算机硬件系统,计算机软件系统。

  1. 简答题答案

1、简述数据库系统阶段管理数据的特点?

(1)结构化的数据及其联系的集合

数据库系统将数据按一定的结构形式(即数据模型)组织到数据库中,不仅考虑了某个应用的数据结构,而且考虑了整个组织(即多个应用)的数据结构。

(2)数据共享性高、冗余度低

数据库系统全盘考虑所有用户的数据需求,面向整个应用系统,所有用户的数据都包含在数据库中。因此,不同用户、不同应用可同时存取数据库中的数据,每个用户或应用只使用数据库中的一部分数据,同一数据可供多个用户或应用共享,从而减少了不必要的数据冗余,节约了存储空间,同时也避免了数据之间的不相容性与不一致性,即避免了同一数据在数据库中重复出现且具有不同值的现象。

(3)数据独立性高

在数据库系统中,整个数据库的结构可分成三级:用户逻辑结构、数据库逻辑结构和物理结构。数据独立性分为两级:物理独立性和逻辑独立性。

(4)有统一的数据管理和控制功能

数据通过数据库管理系统进行管理和控制。

2、什么是数据库管理系统,有哪些功能?

数据库管理系统可借助操作系统对数据库的数据进行存取、维护和管理。数据库系统的各类人员、应用程序等对数据库的各种操作请求,都必须通过数据库管理系统完成。

数据库管理系统的主要功能包括数据定义功能、数据操纵功能、数据库运行管理功能、数据库的建立和维护功能、数据通信接口及数据组织、存储和管理功能。

3、简述数据库的三级模式结构,并说明其优点。

对用户而言,外模式、模式和内模式分别对应一般用户模式、概念模式和物理模式,它们分别反映了看待数据库的三个角度。

模式也称为概念模式,是数据库中全体数据的逻辑结构和特征的描述,处于三级模式结构的中间层,不涉及数据的物理存储细节和硬件环境,与具体的应用程序、所使用的应用开发工具及高级程序设计语言无关。一个数据库只有一个模式。

外模式又称为子模式或用户模式,是三级模式结构的最外层,是与某一应用有关的数据的逻辑结构,即用户视图。外模式一般是模式的子集,一个数据库可以有多个外模式。

内模式又称存储模式或物理模式,是三级模式结构中的最内层,也是靠近物理存储的一层,即与实际存储数据方式有关的一层。它是对数据库存储结构的描述,是数据在数据库内部的表示方式。一个数据库只有一个内模式。

三级模式的优点如下所示:

(1)保证数据的独立性。将模式和内模式分开,保证了数据的物理独立性;将外模式和模式分开,保证了数据的逻辑独立性。

(2)简化了用户接口。按照外模式编写应用程序或输入命令,而不需了解数据库内部的存储结构,方便用户使用系统。

(3)有利于数据共享。在不同的外模式下可由多个用户共享系统中的数据,减少了数据冗余。

(4)有利于数据的安全保密。在外模式下根据要求进行操作,只能对限定的数据操作,保证了其他数据的安全。

4、什么是分布式数据库,有哪些特点?

分布式结构的数据库系统是分布式网络技术与数据库技术相结合的产物,数据在物理上是分布的,数据不集中存放在一台服务器上,而是分布在不同地域的服务器上;所有数据在逻辑上是一个整体;用户不关心数据的分片存储,也不关心物理数据的具体分布,完全由网络数据库在分布式文件系统的支持下完成。

这种数据库系统的优点是可以利用多台服务器并发地处理数据,从而提高计算型数据处理任务的效率。缺点是数据的分布式存储给数据处理任务的协调与维护带来困难。同时,当用户需要经常访问过程数据时,系统效率明显地受到网络流量的制约。

5、三个世界指什么?它们之间有什么联系?

三个世界是指现实世界、信息世界和计算机世界。

现实世界,即客观存在的世界。其中存在着各种事物及它们之间的联系,每个事物都有自己的特征或性质。信息世界是现实世界在人们头脑中的反映,经过人脑的分析、归纳和抽象,形成信息,人们把这些信息进行记录、整理、归类和格式化后,就构成了信息世界。计算机世界是信息世界中信息的数据化,就是将信息用字符和数值等数据表示,便于存储在计算机中并由计算机进行识别和处理。

第2章 教材课后习题解答

  1. 选择题答案

1、B。一个关系数据库中包括多个关系,例如教材中的教学数据库teaching包括教师关系、学生关系、课程关系、选课关系和授课关系。每个关系都有关系模式(关系头),所有关系的关系模式共同组成关系数据库模式。

2、A。关系是元组的集合,数学上集合中不能有相同的元素,所以同一个关系模型中的人两个元组值不能完全相同。

3、D。针对的应用不同,一个关系可能包括一个或者多个候选码,从中选择一个可以作为主码。一个关系也可以包括多个外码,例如教材中表1-4的选课关系,其中的sno和cno都是该关系的外码。超码和候选码类似,也是能唯一标识关系中元组的一个属性或属性集,但是超码不满足最小性,所以超码包含候选码。例如,教材中表1-2的学生关系中,sno是候选码,能唯一标识元组,sno+sn是sno的超码,也能唯一标识元组,但是它不满足最小性,因为起到唯一标识作用的是sno,不是sn。

4、A。关系中每一个分量必须是不可分的数据项,所以,分量对应的字段也不可再分。

5、D。关系中不同字段的域可以相同,但是字段名不能相同。

  1. 填空题答案

1、同质。

2、参照完整性。

3、主码、外码。

4、关系。

5.学号,手机号,身份证号、学号、姓名,性别,年龄,专业和院系。

  1. 简答题答案

1、关系模型的完整性规则有哪几类?

关系模型中,有三类完整性约束,即实体完整性、参照完整性和用户自定义的完整性。其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作关系的两个不变性。任何关系数据库系统都应该支持这两类完整性。除此之外,不同的关系数据库系统由于应用环境的不同,往往还需要一些特殊的约束条件,这就是用户自定义完整性,用户自定义完整性体现了具体领域中的语义约束。

2、举例说明什么是实体完整性和参照完整性。

实体完整性是指主码的值不能为空或部分为空。例如,教材中表1-3的课程关系中的主码“课程号”(cno)可以唯一标识一门课程实体。如果主码中的值为空或部分为空,即主属性为空,则不符合关系键的定义条件,不能唯一标识元组及与其相对应的实体。例如,课程关系中的主码“课程号”不能为空,授课关系中的主码“教师号+课程号”不能部分为空,即“教师号”和“课程号”两个字段的取值都不能为空。

参照完整性是指如果关系R2的外码X与关系R1的主码相符,则X的每个值或者等于R1中主码的某一个值或者取空值。例如,在下图中,学生关系s的字段“院系”(dept)与院系关系d的主码“院系”(dept)相对应,因此,学生关系s的字段dept是该关系的外码,学生关系s是参照关系,院系关系d是被参照关系。学生关系中某个学生(如s1或s2)“院系”的取值,必须在院系关系中主码“院系”的值中能够找到,否则表示把该学生分配到一个不存在的部门中,显然不符合语义。如果某个学生(如s9)“院系”取空值,则表示该学生尚未分配到任何一个院系;否则,它只能取院系关系中某个元组的院系值。

3、关系的性质主要包括哪些方面?

在关系模型中,关系具有如下性质。

(1)列是同质的,即每一列中的分量必须来自同一个域,必须是同一类型的数据。

(2)不同的属性可来自同一个域,但不同的属性必须有不同的名字。例如,假设某关系中的两个属性“职业”和“兼职”,它们可以来自同一个域{教师,工人,辅导员}。

(3)列的顺序可以任意交换。但交换时,应连同属性名一起交换,否则将得到不同的关系。

(4)关系中元组的顺序(即行序)可任意,在一个关系中可以任意交换两行的次序。因为关系是以元组为元素的集合,而集合中的元素是无序的,所以作为集合元素的元组也是无序的。

(5)关系中不允许出现相同的元组。因为数学上集合中没有相同的元素,而关系是元组的集合,所以作为集合元素的元组应该是唯一的。

(6)关系中每一分量必须是不可分的数据项,也就是说,不能出现“表中有表”的现象。满足此条件的关系称为规范化关系,否则称为非规范化关系。

第3章 教材课后习题解答

  1. 选择题答案

1、A。A选项中SQL应该是一种非过程化的语言。

2、B。B选项CREATE属于数据定义语言。

3、C。A选项SELECT主要用于对数据库中的各种数据对象进行查询,B选项CREATE负责数据库对象的建立,D选项UPDATE是依据给定条件,将数据表中符合条件的数据更新为新值。

4、C。数据定义语言主要包括CREATE、ALTER和DROP,可以创建数据库对象、修改数据库对象和删除数据库对象等。

5、C。数据定义语言主要包括CREATE、ALTER和DROP,可以创建数据库对象、修改数据库对象和删除数据库对象等。

  1. 填空题答案

1、 Structured Query Language。

2、 数据定义语言、数据查询语言、数据操纵语言、数据控制语言。

第4章 教材课后习题解答

  1. 选择题答案

1、A。SQL Server数据库管理系统中只有一种存储引擎,所有数据存储管理机制都是一样的。

2、C。MySQL数据库管理系统提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎。

3、C。一个字符集对应至少一种校对规则(通常是一对多的关系),两个不同的字符集不能有相同的校对规则,而且,每个字符集都设置默认的校对规则。

4、C。MySQL数据库管理系统创建数据库的命令为CREATE DATABASE | SCHEMA [IF NOT EXISTS] db_name。其中,CREATE和数据库名称之间不能缺少DATABASE或者SCHEMA。

  1. 填空题答案

1、SHOW ENGINES;

2、MySQL。

3、.frm、.myd、.myi。

4、内存。

5、校对规则。

6、SHOW CHARACTER SET;

7、SHOW COLLATION;

8、CREATE。

9、SHOW。

10、ALTER。

11、DROP。

  1. 简答题答案

1、简述存储引擎的概念及其作用。

存储引擎是决定如何存储数据库中的数据、如何为数据建立索引、如何更新和查询数据的机制。由于关系数据库中数据是以关系表的形式存储的,所以存储引擎也称为表类型。

2、简述常用的存储引擎的优缺点。

MySQL5.5之后,InnoDB是MySQL的默认存储引擎。InnoDB是事务型数据库的首选引擎,具有提交、回滚和崩溃修复能力。InnoDB提供专门的缓冲池,支持行级锁定,支持外键约束,将表和索引存储在一个表空间中,表空间可以包含多个文件(或原始磁盘分区),表可以是任何尺寸。

MySQL5.5之前,MyISAM是MySQL的默认存储引擎。MyISAM不支持事物处理,也不支持外键约束。但是,MyISAM具有高效的查询速度,插入数据的速度也很快,是在Web、数据仓储等应用环境中最常使用的存储引擎之一。

与InnoDB和MyISAM不同,MEMORY类型的表中的数据存储在内存中,如果数据库重启或者发生崩溃,表中的数据都将消失。MEMORY类型的表适用于暂时存放数据的临时表、作为统计操作的中间表,以及数据仓库中的维度表。

3、在实际应用中,如何选择存储引擎?

在实际工作中,可以根据应用场景的不同,对各种存储引擎的特点进行对比和分析,选择适合的存储引擎。此外,还可以根据实际情况对不同的数据表选用不同的存储引擎。

如果实际应用需要事物处理,在并发操作时要求保持数据的一致性,而且除了查询和插入操作,还经常要进行更新和删除操作,这种情况可以选择InnoDB,可以有效降低更新和删除操作导致的锁定,并且可以确保事务的完整性提交和回滚。

如果实际应用不需要事物处理,以查询和插入操作为主,更新和删除操作较少,并且对事物的完整性和并发性要求不是很高,可以选择MyISAM。

如果实际应用不需要事物处理,需要很快的读写速度,并且对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,MEMORY适用于创建相对较小的数据库表。

综上,选择什么类型的存储引擎需要根据具体应用灵活选择。此外,同一个数据库中的数据表可以选择适合自己的存储引擎,从而满足各自的应用性能和实际需求。总之,使用合适的存储引擎,将会提高整个数据库的性能。

4、简述字符集校对规则的作用。

针对数据的存储,MySQL提供了多种字符集;针对同一字符集内字符之间的比较,MySQL提供了与之对应的多种校对规则。其中,一个字符集对应至少一种校对规则(通常是一对多的关系),两个不同的字符集不能有相同的校对规则,而且,每个字符集都设置默认的校对规则。

第5章 教材课后习题解答

  1. 选择题答案

1、B。A选项中数值类型DECIMAL(P,S)中,P表示数据长度,S表示小数位数;C选项中BIT数据类型以位为单位存储字段值;D选项中ENUM 类型只允许在给定的集合中取一个值。

2、C。MySQL使用SQL语句中的ALTER TABLE语句来修改表名、修改字段数据类型、修改字段名、添加和删除字段、更改表的存储引擎等数据表结构。

3、A。B选项中的字符型数据需要用单引号引起来;s表中学号sno定义了非空约束,C选项中学号字段的值不能为NULL;s表中姓名sn定义了非空约束,D选项中姓名字段的值不能为NULL。

4、B。UPDATE语句可以对表中的一行或多行记录的某些字段值进行修改。A选项可以对数据库对象进行修改。

5、A。PRIMARY KEY约束的字段,其值不能为NULL、不能重复,以此来保证实体的完整性。

  1. 填空题答案

1、 非空约束、唯一约束、主键约束、外键约束、CHECK约束。

2、 DROP、DELETE。

  1. 简答题答案

1.数字类型包括整数类型和数值类型。整数类型按照取值范围从小到大,包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。数值类型包括精确数值型DECIMAL和近似数值型FLOAT、DOUBLE、REAL。

字符串类型用于存储字符串数据,包括CHAR、VARCHAR和TEXT。

时间日期类型包括TIME、DATE、YEAR、DATETIME和TIMESTAMP。

二进制类型包括BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

除此之外,MySQL还支持两种复合数据类型 ENUM 和 SET。

2.可以使用CREATE TABLE语句创建数据表,其基本语法格式为:

CREATE [TEMPORARY] TABLE [IF NOT EXIST] <表名>

[([<列定义>],…|[<索引定义>])]

[table_option][select_statement]

如创建学生表s

CREATE TABLE s (

sno char(10) NOT NULL COMMENT ‘学号’,

sn varchar(45) NOT NULL COMMENT ‘姓名’,

sex enum(‘男’,‘女’) NOT NULL DEFAULT ‘男’ COMMENT ‘性别’,

age int NOT NULL COMMENT ‘年龄’,

maj varchar(45) NOT NULL COMMENT ‘专业’,

dept varchar(45) NOT NULL COMMENT ‘院系’,

PRIMARY KEY (sno)

)

第6章 教材课后习题解答

  1. 选择题答案

1、A。A选项中SELECT后面是字段列表,是从列的角度操作的,可以将需要的字段显示在查询结果集中,能实现选取操作。

2、C。C选项中WHERE后面的检索条件是用来约束元组的,是从行的角度操作的,只有满足检索条件的元组才会出现在查询结果集中。

3、C。判断某个字段的值是否为空值时,字段和NULL之间不能用等号或者不等号,要用is或者is NOT。

4、D。HAVING子句作用于组,选择满足条件的组,必须用在GROUP BY子句之后,但GROUP BY子句可以没有HAVING子句。

5、C。当需要对查询结果排序时,应该使用ORDER BY子句,ORDER BY子句必须出现在其他子句之后。

6、C。C选项中,LIMIT后面的第一个参数用于指定查询结果的第一行的偏移量,默认为0,表示查询结果的第1行,以此类推。所以C选项中LIMIT后面的第一个参数2表示查询结果的第3行。LIMIT后面的第二个参数用来指定显示查询结果的行数。

7、A。A选项中的’%系统’,表示课程名的最后两个字是系统,在此之前的内容可以是0个字符,一个字符或者多个字符,所以用%来代替。

8、D。完成题目要求的查询任务,需要用到课程表和选课表两个不同的表,不能使用自连接查询,自连接查询使用的两个表实际上是同一个表,只是为其取了不同的别名。

9、B。普通子查询的执行顺序是:首先执行子查询,然后把子查询的结果作为父查询的查询条件的值。普通子查询只执行一次,而父查询所涉及的所有记录行都与其查询结果进行比较以确定查询结果集合。

10、C。相关子查询的执行顺序是:首先,选取父查询表中的第一行记录,子查询利用此行中相关的属性值在子查询设计的基本表中进行查询,然后,父查询根据子查询返回的结果判断父查询表中的此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中。重复执行这一过程,直到处理完父查询表中的每一行数据。由此可以看出,相关子查询的执行次数是由父查询表的行数决定的。

  1. 填空题答案

1、DISTINCT(大小写都可以)。

2、LIMIT(大小写都可以)。

3、AS(大小写都可以)。

4、*。

5、连接字段。

6、行数(或者元组数量)。

7、LIMIT 2,6(或者limit 2,6)。

8、积(或者乘积)、和。

9、自连接查询。

10、UNION(大小写都可以)。

  1. 简答题答案

1、简述普通子查询的过程。

普通子查询的执行顺序是:首先执行子查询,然后把子查询的结果作为父查询的查询条件的值。普通子查询只执行一次,而父查询所涉及的所有记录行都与其查询结果进行比较以确定查询结果集合。

2、简述相关子查询的过程。

相关子查询的执行顺序是:首先,选取父查询表中的第一行记录,子查询利用此行中相关的属性值在子查询设计的基本表中进行查询,然后,父查询根据子查询返回的结果判断父查询表中的此行是否满足查询条件。如果满足条件,则把该行放入父查询的查询结果集合中。重复执行这一过程,直到处理完父查询表中的每一行数据。

由此可以看出,相关子查询的执行次数是由父查询表的行数决定的。

3、简述外连接查询的作用。

在内连接查询中,不满足连接条件的元组不能作为查询结果输出。而在外部连接中,参与连接的表有主从之分,以主表的每行数据去匹配从表的数据列。符合连接条件的数据将直接返回到结果集中;对那些不符合连接条件的列,将被填上NULL值后,再返回到结果集中。

4、对于数据库teaching,写出以下查询任务的SQL语句。

(1)查询学生表s中的所有内容。

SELECT *

FROM s;

(2)查询学生表s中院系(dept)的数量。

SELECT COUNT(DISTINCT dept)

FROM s;

(3)查询信息学院的所有女生信息。

SELECT *

FROM s

WHERE sex=‘女’ AND dept=‘信息学院’;

(4)查询讲授课程号为“c1”和“c2”的教师号、姓名、职称和课程号。

SELECT t.tno, tn, prof, cno

FROM t, tc

WHERE t.tno=tc.tno AND (cno=‘c1’ OR cno=‘c2’)

(5)查询姓“赵”的老师的信息,要求显示教师号、姓名、职称和专业。

SELECT tno, tn, prof, maj

FROM t

WHERE tn LIKE ‘赵%’

(6)查询每位学生的选课信息,要求显示学号和选课数量,并且按照选课数量降序排列。

SELECT sno, COUNT(cno) AS 选课数量

FROM sc

GROUP BY sno

ORDER BY COUNT(cno) DESC

(7)查询授课教师数量在两人及以上的课程信息,要求显示课程号和授课人数。

SELECT cno, COUNT(tno) AS 授课人数

FROM tc

GROUP BY cno

HAVING COUNT(tno)>=2

(8)查询与教师“刘杨”不同院系的教师号、姓名和院系。

SELECT x.tno, x.tn, x.dept

FROM t AS x, t AS y

WHERE x.dept<>y.detp AND y.tn=‘刘杨’

或者

SELECT tno, tn, dept

FROM t

WHERE dept<>( SELECT dept

​ FROM t

​ WHERE tn=‘刘杨’)

(9)查询选修“程序设计基础”课程的学号、姓名和课程号。

SELECT s.sno, sn, c.cno

FROM s, sc, c

WHERE s.sno=sc.sno AND sc.cno=c.cno AND c.cn=‘程序设计基础’

(10)查询课程号为“c2”的课程的选课信息,要求显示课程号、课程名、学号、姓名和成绩。

SELECT c.cno, cn, s.sno, sn, score

FROM s, sc, c

WHERE s.sno=sc.sno AND sc.cno=c.cno AND c.cno=‘c2’

第7章 教材课后习题解答

  1. 选择题答案

1、B。B选项中视图可以提高数据查找语句的编写效率,索引可以提高数据的检索效率。

2、B。A选项中一般不可更新多个基本表构建的视图,C选项不使用LCAL参数不会检索父视图的条件,D选项不可以对包含聚合函数的视图进行更新。

3、D。D选项索引可以提升检索效率,但索引数量越多维护索引代价越大,因此,需要控制索引的数量。

  1. 填空题答案

1、 普通索引、唯一索引、主键索引、全文索引、空间信息索引。

2、 CREATE VIEW s_male_view AS SELECT * FROM s WHERE SEX=‘男’。

3、 DROP VIEW s_male_view。

4、 CREATE INDEX cn_index ON c(cn)。

5、 DROP INDEX cn_index。

  1. 简答题

1、视图的作用:提升数据操作的便捷性、提升数据的逻辑独立性、提升数据的安全性、数据集成。

2、按照特征分为:普通索引、唯一索引、主键索引、全文索引、空间信息索引。按照涉及的列分为:单列索引和复合索引。按照存储方式分为:B-Tree索引、Hash索引。按照索引与数据物理存储方式分为聚集型索引和非聚集型索引。

第8章 教材课后习题解答(少)

  1. 选择题答案

1、B。使用GRANT语句为用户授权。

2、D。在MySQL的user表中通产更实用密文存储密码或口令信息。

3、C。授予角色给用户后,需要激活方可使用该角色。

  1. 填空题答案

1、 普通索引、唯一索引、主键索引、全文索引、空间信息索引。

2、 CREATE VIEW s_male_view AS SELECT * FROM s WHERE SEX=‘男’。

3、 DROP VIEW s_male_view。

4、 CREATE INDEX cn_index ON c(cn)。

5、 DROP INDEX cn_index。

  1. 简答题

1、视图的作用:提升数据操作的便捷性、提升数据的逻辑独立性、提升数据的安全性、数据集成。

2、按照特征分为:普通索引、唯一索引、主键索引、全文索引、空间信息索引。按照涉及的列分为:单列索引和复合索引。按照存储方式分为:B-Tree索引、Hash索引。按照索引与数据物理存储方式分为聚集型索引和非聚集型索引。

第9章 教材课后习题解答

  1. 选择题答案

1、A。A选项中原子性即指事务所有的操作均为一个逻辑整体,在操作时不可分割,要么全部执行,要么全不执行。

2、D。D选项SERIALIZABLE指串行化,隔离级别最高,通过强制事务排序,使事务之间不可能相互冲突。A选项READ UNCOMMITTED是事务最低隔离级别;B选项READ COMMITTED可以避免读取脏数据;C选项REPEATABLE READ可以避免丢失更新、读取脏数据和不可重复读。

3、D。MySQL的事务具备ACID特性,即原子性、一致性、隔离性和持续性。所以不具备D选项共享性。

4、A。死锁是指两个或更多的事务同时处于等待状态,每个事务都在等待其中另一个事务解除封锁,结果造成任何一个事务都无法继续执行。所以并发控制是发生死锁的原因,选项A正确。

5、D。排它锁又称X锁,排它锁的规定:一个事务对数据对象A加了X锁,那么该事务可以对A进行读和写,但其加锁期间其他事务不能对A加任何锁,直到X锁释放。由规定可知,加排它锁和共享锁都失败,故选项D正确。

  1. 填空题答案

1、可重复读 REPEATABLE READ。

2、行级锁、表级锁。

3、死锁。

  1. 简答题答案

1、事务并发操作如果不加以适当控制,可能会存储不正确的数据,产生数据的不一致性问题。包括丢失更新、读取脏数据、不可重复读和幻象读。

丢失更新:并发事务同时读取数据,但在修改数据过程中,某一事务丢失了其他事务已经读数据进行的修改。

读取脏数据:并发事务中的某一事务读取了其他事务尚未提交的数据。

不可重复读:事务在两次读取间隔间,其他并发事务对数据进行了修改,导致该事物进行检验数据时,两次读取数据不一致。

幻象读:在两次查询间隔中,有并发的事务在对相同的表做插入或删除操作,所以当该事物用相同的条件查询记录时,记录个数忽多忽少,有一种“幻象”的感觉。

2、死锁的含义:两个或更多的事务同时处于等待状态,每个事务都在等待其中另一个事务解除封锁,它才能继续执行下去,结果造成任何一个事务都无法继续执行。

死锁发生的必要条件包括:

(1)互斥条件:事务在某一时间内独占资源,其他事务无法对资源进行操作。

(2)请求与保持条件:事务因请求资源而阻塞时,对已获得的资源保持不放,导致该事务与其他事务都无法继续执行。

(3)不剥夺条件:事务在获得资源后,如若事务没有解锁,则其他事务不能强行剥夺。

(4)循环等待条件:多个事务之间形成一种头尾相接的循环等待资源关系,互相牵制。

避免死锁发生的方法:

(1)一次加锁法:在设计阶段规定为了完成一个事务,一次性封锁所需要的全部表。

(2)顺序加锁法:在设计阶段规定所有的事务都按相同的顺序来封锁。

(3)事务如需要更新记录,应该直接申请足够级别的锁,即排它锁,而不应先申请共享锁。

3、一级封锁协议:事务T在修改数据A时必须先对其加X锁,直到事务结束才能释放锁。可以避免丢失更新问题。

二级封锁协议:在一级封锁协议的基础上,另外加上事务T在读取数据R之前必须先对其加S锁,读完后释放S锁。可以避免丢失更新、读取脏数据问题。

三级封锁协议:在一级封锁协议的基础上,加上事务T在读取数据R之前必须先对其加S锁,读完后并不释放S锁,而直到事务T结束才释放。可以避免丢失更新、读取脏数据、不可重复读和幻象读等问题。

第10章 教材课后习题解答(不考)

  1. 选择题答案

1、A。MySQL有不同类型的日志文件,包括错误日志(log-err)、二进制日志(log-bin)、通用查询日志(log)及慢查询日志(log-slow-queries)。所以A慢日志是正确答案。

2、B。数据库还原(也称为数据库恢复)是与数据库备份相对应的系统维护和管理操作,当数据库出现故障时,将备份的数据库加载到系统,从而使数据库恢复到备份时的正确状态。所以完整的数据库备份能够保证数据库尽可能地恢复到故障前的状态,选项B正确。

3、B。按备份时服务器是否在线进行划分,数据库备份可分为冷备份、温备份和热备份,不包括B选项。

4、A。记录所有用户对数据库的操作(除select语句之外),故选项A中的所有操作描述错误。

5、A。二进制日志是MySQL中最重要的日志,记录了除SELECT语句之外所有的DDL,也称为变更日志(update log)。故选项A正确。

6、C。从数据库的备份范围角度,数据库备份可分为:完整备份(full backup)、差异备份(differential backup)和增量备份(incremental backup)。其中增量备份只针对那些自上次完整备份或者增量备份后被修改过的文件。故选项C正确。

7、B。默认情况下,MySQL数据库只启动了错误日志的功能,其他类型日志都需要数据库管理员来进行设置。故选项B正确。

  1. 简答题答案

1、虽然数据库系统已经采取了系列的措施来防止数据库的安全性和完整性遭到破坏,保证并发事务的正确执行,但数据依然无法保证绝对不受破坏。当数据文件发生损坏、数据库服务器出现故障、计算机硬件毁坏或者数据被误删时,会使得数据库中的数据全部或者部分丢失。数据库备份是将数据库中的数据以及保证数据库系统正常运行的有关信息保存起来,以备数据库还原时使用。数据库还原是指加载数据库备份到系统中的进程。数据库备份还原是对数据库进行备份,在数据丢失或者出现错误的情况下,可以将数据库还原到某一正确状态下的版本。数据库备份和还原可以保证MySQL数据库的安全性和一致性。

2、系统进行数据库还原操作时,需要注意以下事项:

(1)要还原的数据库是否存在;

(2)数据库文件是否兼容;

(3)数据库采用了哪种备份类型。

3、开启二进制日志可以实现以下几个功能:

(1)数据库还原:某些数据的恢复需要二进制日志,例如在一个数据库完整备份文件恢复后,用户可以通过二进制日志进行恢复。

(2)复制:原理与数据库还原类似,通过复制和执行二进制日志使一台远程的MySQL数据库与一台本地的MySQL数据库进行实时同步。

(3)审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

第11章 教材课后习题解答(不考)

  1. 选择题答案

1、B。数据库结构设计是指数据库关系模式的设计,非数据库行为设计。

2、A。需求分析阶段是确定系统边界,规划阶段是确定系统是否可行。

3、C。需求分析绘制的数据流图并非分解越细致越好,应该根据实际需要,确保所有支撑业务运行的数据项都被发现为止。

  1. 填空题答案

1、 反复探寻、逐步求精。

2、 数据库系统规划、需求分析、设计、实现、加载和测试、运行和维护。

3、 数据源、数据流、数据处理、数据结构。

4、 需求规格说明书。

5、 系统的可行性分析和时间规划。

  1. 简答题

1、自底向上的需求分析方法强调对已有知识和组件的复用,面对子系统业务开发经验丰富或已经具有相关业务系统组件的场景下,适合使用自底向上的需求分析方法。

2、数据流图采用自顶向下的方法进行分层,一般具有描述所有业务的顶层数据流图、进一步分解顶层数据流图后形成的0层数据流图等。

3、需求分析的目标是明确系统的业务边界以及业务所涉及的数据字典。

第12章 教材课后习题解答

  1. 选择题答案

1、B。根据函数依赖的定义,函数依赖是指在 R 的每一关系中,若两个元组的 X 值相等,则 Y 值也相等。

2、D。根据函数依赖的定义和主码的定义,主码能够决定R中所有的属性,W决定X,XY决定Z,所以WY决定Z,由于W决定W,Y决定Y,因此WY决定XYWZ。

3、A。规范化过程主要依据规范化理论。

4、C。根据不规范问题存在的四个主要问题,主要解决数据冗余、插入、更新、删除异常问题。

4、B。如果R中所有属性为单属性,则当前满足第一范式,第二范式是满足第一范式基础上,最高可以达到的范式。

  1. 填空题答案

1、 2NF、3NF、BCNF。

2、 AB、1NF。

3、 2NF。

4、 包含。

5、 无损连接。

  1. 简答题

1、函数依赖(Functional Dependency,FD)是关系模式中属性之间的一种逻辑依赖关系。设有关系模式R(U),U是属性全集,X和Y是U的子集,如果X→Y,并且对于X的任何一个真子集X′,都有X’Y,则称Y对X完全函数依赖(Full Functional Dependency),记作XY。如果对X的某个真子集X’,有X’→Y,则称Y对X部分函数依赖(Partial Functional Dependency),记作XY。设有关系模式R(U),U是属性全集,X,Y,Z是U的子集,若X→Y,但YX,而Y→Z(YX,ZY),则称Z对X传递函数依赖(Transitive Functional Dependency),记作:XZ。;

2、关系模式分解是为了消除关系模式中不合理的数据冗余和操作异常问题。衡量关系模式的一个分解是否可取,主要有两个标准:即分解是否具有无损连接,分解是否保持了函数依赖。

3、关系R主码为职工号,每个非主属性都完全函数依赖于主码,因此R属于第二范式。因为单位名依赖于单位号,单位号依赖于职工号,即非主属性传递函数依赖于R的主码,所以R不属于第三范式。

规范化步骤:

(1)分析关系模式R的函数依赖集。

F={职工号→职工名,职工号→年龄,职工号→性别,职工号→单位号,单位号→单位名}

(2)提取F中传递函数依赖,将R分解为:R1={职工号,职工名,年龄,性别,单位号},R2={单位号,单位名}。

(3)通过分析,R满足3NF要求。

4、关系R是第一范式。该关系的主码为(课程名,教师名),因为教师地址函数依赖于教师名,因此不满足每个非主属性都完全函数依赖于R的主码,因此不属于第二范式。

该关系存在删除异常,当某课程被删除时,相应的教师名和教师地址也被删除,但现实中该教师仍在存在。

关系R可分解为R1={课程名,教师名},R2={教师名,教师地址}。

第13章 教材课后习题解答

  1. 选择题答案

1、C。在E-R图中不包含元组。

2、B。在合成全局E-R图时,不存在语法冲突。

3、C。根据关系模式转换规则,多对多转换的关系模式的主码为参与联系实体的所有码。

4、D。概念结构设计的基础是需求规格说明书,需求规格说明书描述的企业组织的信息需求,非开发方的需求。

5、B。使用E-R图是数据库概念结构设计阶段的主要工作。

6、B。根据转换规则,一对多转换关系模式应选择多端的主码作为产生联系的主码。

7、C。3个实体每个实体都转换1个关系,3个多对多联系,每个都转换为1个关系模型,最终一共6个关系模式。

  1. 填空题答案

1、 概念结构设计。

2、 概念结构式设计。

3、 命名,属性,结构。

4、 逻辑结构设计。

5、 水平分解,垂直分解。

  1. 简答题

1、

关系模式及主码

图书(书号,书名,数量,位置,出版社名)

借书人(借书证号,姓名,单位)

出版社(出版社名,邮编,地址,电话,E-mail)

借阅(借书证号,书号,借书日期,还书日期)

2、

科室(科室名,科室地址,科室电话)

病房(病房号,床位号,所属科室)

医生(工作证号,姓名,性别,出生日期,联系电话,职称,所属科室名)

病人(病历号,姓名,性别,出生日期,诊断记录,主管医生,病房号)

3、

关系模式

course(cid,cname,chour,ctype)

classroom(crid,crname,crbuilding)

teacher(tid,tname)

创建课程实体

CREATE TABLE course

(cid CHAR(8) PRIMARY KEY,

cname VARCHAR(20) NOT NULL,

chour INT NOT NULL,

ctype INT)

4、

关系模式

book(bookid,bookname,num)

bookuser(tid,username,age)

borrow(bookid,tid,borrow_time,return_time)

创建用户实体

CREATE TABLE bookuser

(tid CHAR(8) PRIMARY KEY,

username VARCHAR(20) NOT NULL,

age INT,

);

第14章 教材课后习题解答(不考)

  1. 选择题答案

1、B。数据库实施阶段的工作包括建立数据库结构、装入数据(数据库加载)、应用程序编码与测试、数据库试运行和整理文档。不包括B选项扩充功能。

2、A。数据库的物理结构设计工作内容主要包括:确定数据的存储结构、设计合适的存取路径、确定数据的存放位置和确定系统配置。不包括选项A加载数据。

3、D。只要数据库系统在运行,就需要不断地进行修改、调整和维护,故A选项错误。数据库运行和维护阶段的主要任务包括转储和恢复数据库、维护数据库的安全性与完整性、监测并改善数据库性能、重新组织和构造数据库。故选项B错和C错误。

4、A。决定存储结构的主要因素包括存取时间、存储空间和维护代价三个方面。不包括A选项实施难度。

5、A。数据库设计包括数据库系统规划阶段、需求分析阶段、设计阶段、实现阶段、加载和测试阶段、运行和维护阶段共6个阶段。其中设计阶段包含概念结构设计、逻辑结构设计和物理结构设计。E-R模型设计是概念结构设计阶段的主要任务。故不包含选项A。

6、D。确定数据的存储结构是数据库物理结构设计工作的内容之一。故选项D正确。

  1. 简答题答案

1、通常关系数据库的物理结构设计工作内容主要包括:

(1)确定数据的存储结构:影响数据结构的因素主要包括存取时间、存储空间利用率和维护代价。在设计时应当根据实际情况对这3个方面综合考虑,例如利用DBMS的索引功能等,力争选择一个最优的方案。

(2)设计合适的存取路径:主要指确定如何建立索引。例如,确定应该在哪些关系模式上建立索引,在哪些列上可以建立索引,建立多少个索引合适,是否建立聚集索引等。

(3)确定数据的存放位置:为了提高系统的存取效率,应将数据分为易变部分和稳定部分、经常存取部分和不常存取部分,确定哪些存放在高速存储器上,哪些存放在低速存储器上。

(4)确定系统配置:设计人员和DBA在进行数据存储时要考虑物理优化的问题,这就需要重新设置一下系统配置的参数,如同时使用数据库的用户数、同时打开的数据库对象数、缓冲区的大小及个数、时间片的大小、填充因子等,这些参数将直接影响存取时间和存储空间的分配。

数据库物理结构设计分为两步:

(1)确定物理结构,即确定数据库的存取方法和存储结构。

(2)评价物理结构,评价的重点是时间和空间效率。

2、数据库实施是指根据逻辑设计和物理设计的结果,在计算机上建立起实际的数据库结构、装入数据、进行测试和试运行的过程。

数据库实施阶段主要完成:

(1)建立实际数据库结构;

(2)装入数据;

(3)应用程序编码与调试;

(4)数据库试运行和整理文档。

3、数据库系统投入正式运行,标志着数据库应用开发工作的基本结束,但并不意味着设计过程已经结束。在这一阶段,应由DBA不断地对数据库设计进行评价、调整、修改,即对数据库进行经常性的维护。数据库运行和维护阶段的主要任务包括以下四项内容。

(1)转储和恢复数据库。

(2)维护数据库的安全性与完整性。

(3)监测并改善数据库性能。

(4)重新组织和构造数据库。

第15章 教材课后习题解答

一、选择题答案

1、C。在字符串模式匹配中,可用通配符替代一个或多个字符,其中“_”可代替任何一个字符,而“%”可代替任意数目字符。

2、B。在MySQL程序代码中可以使用双连线字符“–”或“#”,在行首或行末进行单行注释。

3、A。A选项用于创建存储过程,B选项用于删除存储过程,C选项用于创建自定义函数,D选项用于删除自定义函数。

4、D。在MySQL编程中,可用于跳出循环的语句是LEAVE。

5、C。在表达式中,FLOOR(-8.5)求出小于或等于-8.5的最大整数,结果为-9;SIGN(-5)求-5的符号,值为-1;8 MOD 7表示求二者的余数,结果为1,5 DIV 10表示求二者的整数商,结果为0,所以原式简化为-9*(-1)+1-0,最终结果为10。

6、D。A选项错误,游标指针在结果集中只能从前向后顺序移动;B选项错误,ITERATE语句用于在循环体中,中止当前执行的本次循环,直接进入下一次循环;C选项错误,定义存储函数时,其形式参数只能是IN类型;D选项,ALTER FUNCTION语句用于修改函数的状态特征信息。

7、A。A选项正确,存储过程创建后,经编译后作为一个对象存储在数据库中,可被触发器、其他存储过程、程序设计语言所调用。B选项错误,当函数的状态特征被定义为CONTAINS SQL时,表示函数体中包含了SQL语句,但不包含读或写数据的语句(如SET语句等);C选项错误,调用有参函数时,实参的个数必须与被调用函数形参的个数保持一致;D选项错误,删除函数使用DROP FUNCTION语句,而不是DELETE FUNCTION。

8、C。ALTER PROCEDURE语句用于修改存储过程,SHOW CREATE PROCEDURE语句用于查看存储过程的定义信息,SHOW PROCEDURE STATUS LIKE语句用于查看存储过程的状态特征信息。

9、B。使用SET语句为用户会话变量赋值时可以使用赋值号“=”或“:=”;而使用SELECT语句进行赋值时的赋值号只能使用“:=”,而不能使用“=”。

10、B。使用DECLARE语句可以定义局部变量和指定初值,语句格式是DECLARE variable_name[, …] datatype(size) DEFAULT default_value,其中variable_name是变量名,有多个变量时,用逗号分隔;default_value表示初值。

11、A。打开游标需要使用OPEN语句,语法格式是:OPEN cursor_name;,其中cursor_name表示游标的名称。

12、A。MySQL的规定,用户会话变量名的前面应加的字符是@。

13、D。由于在教学数据库teaching中已定义了存储过程disp_stu( dp VARCHAR(50) ),其中有一个形式参数dp,因此,在调用时,必须提供一个实际参数,由于选项A的调用语句中,没有提供实际参数,所以选项A是错误的;由于定义的存储过程disp_stu的形式参数dp未指定传递方式,按语法规定,该参数的默认传递方式应为IN类型,即要求在调用存储过程时,必须为该参数传入一个确定的值,所以选项B是错误的;存储过程在调用执行时,不能返回值,所以选项C是错误;选项D中,语句SELECT * FROM s WHERE dept=dp;的作用是从学生表s中查询出所有属于形参dp的值所指定学院的所有同学信息,功能符合题意要求。

14、B。当游标声明完成后,只有使用OPEN语句打开游标后,与该游标声明相对应的SELECT子句将才被执行,MySQL服务器内存中将存放与该SELECT子句对应的结果集,此时游标指针指向结果集中的第一条记录,所以选项A是错误的;使用游标每从结果集中取出一条记录后,指针将自动移动一条记录,指向下一条记录,所以选项C是错误的;游标只能顺序地从前向后一条一条记录地读取结果集,不能从后向前读,或直接跳到中间某个位置读,所以选项D是错误的。为了避免游标指标移出记录集范围引起错误,数据库开发人员需要编写错误处理程序,以便结束“结果集”的遍历,选项B是正确的。

15、C。用DROP FUNCTION语句删除自定义函数的语法格式是:DROP FUNCTION func_name;,其中,func_name是被删除的函数名,该名称后面不能跟括号“()”,也不能用引号引起来,因此,只有选项C正确。

16、D。使用ALER FUNCTION语句只能修改存储函数的状态特征,不能修改其功能代码,也不能修改函数的名称;SHOW CREATE FUNCTION语句只能查看存储函数的定义信息,但不能修改其功能代码;SHOW FUNCTION STATUS可以查看存储函数的状态信息。

17、A。LCASE函数能将字符串中所有字母变成小写字母,所以,LCASE(‘北京Abc’)的值为’北京abc’,CHAR_LENGTH函数能求出字符串中的字符数(即长度),而字符串’北京abc’中有5个字符,所以整个表达式的值为5。

18、D。表达式MID(‘学习MySQL’,3,2)的值为’My’,UCASE函数的作用是将字符串中的字母变成大写,所以UCASE(MID(‘学习MySQL’,3,2))的值为’MY’,函数REVERSE的功能是将字符串中的字符顺序倒置,所以,整个表达式的值为’YM’。

19、B。求两个日期之间相差的天数应使用DATEDIFF函数,所以表达式DATEDIFF(CURDATE(),@birthday)能求出出生日期到今天的天数,该数除以365后,用FLOOR函数求出最大整数,即为周岁数。

20、C。IS运算符用于判断一个值是否为NULL,不用于做数值比较。

二、填空题答案

1、SELECT DAYNAME(CURRENT_DATE()); 或 SELECT DAYNAME(CURDATE()); 或SELECT DAYNAME(NOW());

2、SELECT DAYOFWEEK(NOW());或SELECT DAYOFWEEK(CURDATE()); 或 SELECT DAYOFWEEK(CURRENT_DATE());

3、SELECT TIME_FORMAT(“15:44:32”,"%r"); 或SELECT TIME_FORMAT(“15:44:32”,"%h:%i:%S %p");

4、MONTHNAME(NOW())或MONTHNAME(CURDATE())或MONTHNAME(CURRENT_DATE())

5、SUBSTRING(‘我喜欢MySQL数据库’,4,5)或SUBSTR(‘我喜欢MySQL数据库’,4,5)或MID(‘我喜欢MySQL数据库’,4,5)

SUBSTRING(‘我喜欢MySQL数据库’,9)或SUBSTRING(‘我喜欢MySQL数据库’,9,3)或RIGHT(‘我喜欢MySQL数据库’,3)

6、UCASE(‘Forestry’)或UPPER(‘Forestry’)

7、3

8、1

9、DECLARE mycursor CURSOR FOR SELECT sno,sn FROM s WHERE age>=20;

FETCH mycursor INTO var_sno, var_sn;

10、DROP PROCEDURE myproc;

11、RETURN

12、SHOW FUNCTION STATUS LIKE ‘test_func’;

13、ALTER FUNCTION mytest_func SQL SECURITY INVOKER COMMENT ‘测试’;

14、OUT maxsal =dp @m

15、LEAVE

三、简答题答案

1、游标是一种能够从包括多条数据记录的结果集中进行逐条访问这些记录的机制。MySQL服务器会专门为游标开辟一定的内存空间,用以存放游标操作的结果集(记录集)。游标主要包括结果集和游标位置两部分,游标结果集是定义游标的SELECT语句的结果集,游标位置(游标指针)则是指向这个结果集中的某一行的指针。游标位置充当了记录指针的作用,当第一次打开游标时,此时游标指针指向结果集的第一条记录,使用游标每从结果集中取出一条记录后,指针自动移动并指向下一条记录。利用游标,可以对结果集中的每一条记录顺序地从前向后逐条进行遍历,以便进行相应的操作。

游标的特点是:

(1)MySQL游标只能用于存储过程和函数。

(2)使用OPEN语句打开游标后,游标指针指向结果集中的第一条记录。

(3)游标只能顺序地从前向后一条一条记录地读取结果集,不能从后向前读,或直接跳到中间某个位置读。

(4)当游标指针指向最后一条记录后,再执行FETCH语句(访问下一条记录)时,将产生错误,因此,数据库开发人员需要对此错误编写错误捕获和处理程序,以便正确地结束“结果集”的遍历。

(5)游标使用完毕后,要进行关闭,以通知服务器释放游标所占用的资源,节省MySQL服务器的内存空间。

2、(1)新建一个SQL代码窗口,在代码窗口中输入如下程序代码:

USE teaching;

DELIMITER $$

CREATE FUNCTION show_average(stu_no CHAR(10))

RETURNS DECIMAL(5,2) – 函数返回值的数据类型

READS SQL DATA

COMMENT ‘计算指定学号同学的平均分,返回平均分’

BEGIN

DECLARE n DECIMAL(5,2);

SELECT AVG(score) INTO n FROM sc WHERE sno=stu_no;

RETURN n; – 返回平均分

END $$

DELIMITER ;

(2)单击代码窗口的“Execute the selected…”按钮,运行以上代码,完成存储过程的创建。

(3)在代码窗口中,输入并执行语句SELECT show_average(‘s1’);,此处,“s1”是调用函数时传递的实数(即学生的学号),测试时,可以传入任意一个同学的学号,进行函数调用并返回平均分。比如,对于此处,以“s1”作为传入参数调用函数show_average的返回结果为87.75分,说明“s1”同学的平均分为87.75分。

3、创建和调用存储过程display_salary的方法和步骤如下:

(1)新建一个SQL代码窗口,在代码窗口中输入如下程序代码:

USE teaching;

DELIMITER $$

CREATE PROCEDURE display_salary()

BEGIN

SELECT tno,tn,sal FROM t ORDER BY sal DESC LIMIT 3;

END$$

DELIMITER ;

(2)代码输入完毕后,单击SQL代码窗口中的“Execute the selected…”按钮,完成存储过程的创建。

(3)在代码窗口中键入调用存储过程“display_salary”的代码:CALL display_salary(); 或 CALL display_salary;,输入完成后,单击代码窗口上部的执行按钮后,完成存储过程的调用执行并查看执行结果。

修改存储过程display_salary,给存储过程加上注释属性“输出工资排在前三名的教师”的方法和步骤如下:

(1)登录进入MySQL Workbench,在数据库导航窗格中,双击“teaching”数据库,使其成为当前数据库。

(2)新建一个SQL代码窗口,在代码窗口中输入如下程序代码:

ALTER PROCEDURE display_salary COMMENT ‘输出工资排在前三名的教师’;

(3)代码输入完毕后,单击SQL代码窗口中的“Execute the selected…”按钮,完成存储过程的修改。

(4)在代码窗口中输入如下程序代码:

SHOW PROCEDURE STATUS LIKE ‘display_salary’;

(5)鼠标选中以上代码,单击SQL代码窗口中的“Execute the selected…”按钮,执行上面的语句,可见存储过程的状态特征中,注释已改为“输出工资排在前三名的教师”。

4、存储过程和存储函数(自定义函数)都是由一组SQL语句和一些特殊的控制结构语句组成的代码片段,由其中的“BEGIN…END”语句所指定,可以被调用执行,从而完成所定义的相应的功能。

从语法上看,存储过程、存储函数是十分相似的。但是,它们之间还是有一些区别的,详见教材15.1.3节中的表15-1。

5、创建存储过程display_course的方法和步骤如下:

(1)新建一个SQL代码窗口,在代码窗口中输入如下程序代码:

USE teaching;

DELIMITER $$

CREATE PROCEDURE display_course(stu_no CHAR(10))

READS SQL DATA

COMMENT ‘根据参数所指定的学号,显示某生所选修的课程名称和成绩’

BEGIN

DECLARE v_sno CHAR(10) DEFAULT ‘’;

DECLARE v_cno CHAR(10) DEFAULT ‘’;

DECLARE v_score DECIMAL(5,2) DEFAULT 0;

DECLARE s_cursor CURSOR FOR SELECT sno, cno, score FROM sc WHERE sno=stu_no; #声明游标

DECLARE CONTINUE HANDLER FOR NOT FOUND SET @finished=1; #定义错误处理程序

SET @finished=0;

OPEN s_cursor; #打开游标

myloop: LOOP

FETCH s_cursor INTO v_sno, v_cno, v_score; #从结果集中逐一取出每一条记录,各字段值存入变量

IF @finished=1 THEN

​ LEAVE myloop;

ELSE

SELECT v_sno, v_cno, v_score; #显示各字段的值

END IF;

END LOOP myloop;

CLOSE s_cursor; #关闭游标

END $$

(2)代码输入完毕后,单击SQL代码窗口中的“Execute the selected…”按钮,完成存储过程的创建。

(3)在代码窗口中,调用存储过程“display_course”。比如:在代码窗口键入:CALL display_course(‘s2’);,执行后,可显示学号为“s2”同学选修的课程名称和成绩情况,通过调用display_course时传入不同的学号可以查看不同同学的选课情况。

6、用户可以查看当前数据库中所创建的自定义函数的状态信息,有以下两种方法:

①查看所有的自定义函数的状态特征信息,使用语句:SHOW FUNCTION STATUS

②查看函数名与某一字符串模式匹配的所有自定义函数的状态特征信息,使用语句:

SHOW FUNCTION STATUS LIKE ‘pattern’;

其中,pattern是用来匹配函数名称的模式字符串,用于查看名称与pattern所指定的模式相匹配的所有函数的状态特征信息。

7、存储过程具有以下优点:

(1)增强了SQL语言的功能和灵活性。存储过程中可用流程控制语句对SQL语句的执行进行控制,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2)便于被多次重复调用。创建好的存储过程被存储在其隶属的数据库中,以后在应用程序中可以被多次调用。

(3)能实现更快的执行速度。存储过程在创建时,MySQL就对其进行编译、分析和优化,并且给出最终被存储在系统表中的执行计划。在第一次被执行后,存储过程就存储在服务器的内存中,这样客户机应用程序在执行时就可以直接调用内存中的代码执行,无须再次进行编译,这就大大加快了执行速度。

(4)减少网络流量。调用该存储过程时,只需一条调用该存储过程的语句就可实现,网络中传送的只是调用语句,而不是在网络中传送这些SQL语句代码,从而大大降低了网络流量。

(5)存储过程可作为一种安全机制来利用。可设定只有某用户才具有对指定存储过程的使用权,从而实现对相应数据访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全性。

8、创建函数gcd的方法和步骤如下:

(1)新建一个SQL代码窗口,在代码窗口中输入如下程序代码:

USE teaching;

DELIMITER $$

CREATE FUNCTION gcd(m INT, n INT)

RETURNS INT

NO SQL

COMMENT ‘求两个正整数的最大公约数’

BEGIN

DECLARE r INT;

IF m<=0 OR n<=0 THEN

RETURN -1;

END IF;

WHILE m % n !=0 DO

​ SET r=m % n;

SET m=n;

SET n=r;

END WHILE;

RETURN n;

END $$

(2)代码输入完毕后,单击SQL代码窗口中的“Execute the selected…”按钮,完成函数gcd的创建。

第16章 教材课后习题解答(不考)

  1. 选择题答案

1、D。D选项中可以通过删除原来的触发器后创建同名的触发器进行修改。

2、D。根据触发事件触发器分为BEFORE和AFTER触发器,根据触发事件可分为INSERT、 UPDATE和DELETE触发器。D选项中与其余三项明显不同,因此选D。

3、B。修改表中的操作使用UPDATE关键字,因此,创建表中数据的触发器是基于UPDATE操作。

4、D。选项A 根据触发事件触发器分为BEFORE和AFTER触发器; 选项B为触发器的应用场景,可以实现数据库的完整性规则;选项C 当删除一个表时,同时会自动删除该表上的所有触发器。因此,以上三项都正确。

5、B。根据修改事件的定义,可以使用ALTER EVENT event_name DISABLE命令临时关闭事件event_name。

6、C。A选项 使用SHOW EVENTS只能查询当前数据库中的事件。B选项递归调度调度的事件存在时间差,而时间差不能为负值,因此,结束日期不能在开始日期之前。D选项事件和触发器都是特殊的存储过程,可以被调度的。

  1. 填空题答案

1、 BEFORE, AFTER。

2、 CREATE TRIGER, DROP TRIGGER。

3、 SHOW CREATE EVENT。

4、 ALTER EVENT。

  1. 综合题答案

1、触发器(TRIGGER)是在满足一定条件下自动触发执行的数据库对象,如向表中插入记录、更新记录或者删除记录时被系统自动地触发并执行的特殊类型的存储过程。触发器的作用是可以对表执行复杂的完整性约束。

2、触发器分为BEFORE和AFTER两类。BEFORE在INSERT/UPDATE/DELETE操作之前执行触发器,AFTER则在INSERT/UPDATE/DELETE操作之后执行触发器。

3、事件也是一种特殊的存储过程。可以用于定时执行的任务,如定时删除记录、对数据进行汇总、清空表、删除表等某些特定任务。事件与触发器类似,都是在某些事务发生时激活。触发器的语句是为了响应给定表上发生的特定类型的操作事件而执行的,而事件的语句是为了响应指定的时间间隔而执行的。

4、可以通过以下语句开启(on)或者关闭(off)事件调度器。

SET GLOBAL event_scheduler = on|off;

SET @@GLOBAL.event_scheduler = on|off;

5、创建名称为trigger_name的触发器语句如下所示:

DELIMITER $

CREATE TRIGGER trigger_name

BEFORE DELETE

ON c

FOR EACH ROW

BEGIN

DELETE FROM sc WHERE sc.cno = OLD.cno;

DELETE FROM tc WHERE tc.cno = OLD.cno;

END$

6、SQL语句如下所示:

DELIMITER $

CREATE TRIGGER trigger_name

BEFORE UPDATE

ON sc

FOR EACH ROW

BEGIN

IF NEW.score < 60 THEN

SET NEW.score = 60;

ELSE

SET NEW.score = 90;

END IF;

END$

7、创建事件的SQL语句如下所示:

CREATE EVENT event_name

ON SCHEDULE AT ‘2021-03-01 13:36:59’

DO

INSERT INTO c VALUES(‘c9’,‘线性代数’,32);

8、创建事件的SQL语句如下所示:

CREATE EVENT event_name

ON SCHEDULE EVERY 1 MONTH

DO

SELECT sno, AVG(score), SUM(score) FROM sc GROUP BY sc.sno;

第17章 教材课后习题解答(不考)

  1. 选择题答案

1、D。D选项 Python为编程语言,不能对硬件进行操作。

2、B。B选项 只有执行查询语句的时候,才会通过Cursor对象的fetchall()等方法返回结果。

3、B。B选项 Connection对象中通过cursor()获取游标对象。

4、C。B选项 fetchall()是获取结果集中的所有行, C选项 fetchmany(size)获取结果集的指定几行。

5、A。A选项 InterfaceError 是Error的子类,其余三项都是DatabaseError的子类。

6、D。执行SQL语句的方法是execute()。

  1. 填空题答案

1、 host, user, passwd。

2、 fetchone(), rowcount。

3、 commit(), rollback()。

4、 mysql.connector, MySQLdb , PyMySQL。

  1. 综合题答案

1、Python程序设计语言的优势:(1)编程简单(2)Python 语法非常清晰(3)可扩展性好(4)Python具有很强的面向对象特性,而且简化了面向对象的实现

应用场景:(1)Web开发(2)人工智能领域(3)自动化运维(4)服务器软件(5)嵌入式领域

2、以mysql.connector接口为例,Python连接MySQL数据库的基本步骤如下:

(1)在Python创建的.py文件中导入mysql.connector接口。

(2)建立与MySQL服务器的连接,并连接当前的数据库。

(3)使用游标对连接的数据库对象执行SQL操作和关闭数据库连接。

3、使用Workbench创建数据库mysql_test的语句如下:

CREATE DATABASE mysql_test;

使用Workbench在数据库mysql_test中创建表tb_test的语句如下:

CREATE TABLE tb_test(

SNO CHAR(5) NOT NULL,

SNAME VARCHAR(20) NOT NULL,

SSEX CHAR(1) NOT NULL,

SBIRTHDAY DATE NOT NULL,

SSALARY DOUBLE(10,2) NOT NULL,

SCOMM DOUBLE(10,2) NULL,

SMAJ CHAR(5) NULL,

PRIMARY KEY (SNO));

(1)往员工表tb_test中插入以下4条数据

import mysql.connector

# 打开数据库连接

db = mysql.connector.connect(

host=‘localhost’,

user=‘root’,

passwd=‘123456’,

database=‘mysql_test’)

# 使用 cursor() 方法创建一个游标对象 cursor

cursor = db.cursor()

cursor.execute(“INSERT INTO tb_test VALUES(‘S0001’,‘张三’,‘1’,‘1921-12-30’,‘10000’,5684.25,null)”)

cursor.execute(“INSERT INTO tb_test VALUES(‘S0002’,‘李四’,‘1’,‘1952-03-05’,‘8000’,null,‘S0001’)”)

cursor.execute(“INSERT INTO tb_test VALUES(‘S0003’,‘王五’,‘1’,‘1962-08-05’,‘6000’,1235.28,‘S0001’)”)

cursor.execute(“INSERT INTO tb_test VALUES(‘S0004’,‘赵六’,‘1’,‘1972-04-21’,‘4000’,2456.25,‘S0001’)”)

db.commit() # 提交到数据库执行

(2)把S0002的ssex修改成3

cursor.execute(“UPDATE tb_test SET SSEX = ‘3’ WHERE SNO = ‘S0002’”)

# 提交到数据库执行

db.commit()

(3)查询一个月(按照30天算)需要支出给所有员工多少钱

cursor.execute(“SELECT (SUM(SSALARY)+SUM(SCOMM))*30 FROM tb_test”)

result = cursor.fetchall() # 获取所有满足条件的记录列表

print(result) # 打印结果

(4)查询生于1960-1-1之后的所有员工信息,并按照奖金降序排列输出

cursor.execute(“SELECT * FROM tb_test WHERE SBIRTHDAY > ‘1960-01-01’ ORDER BY SCOMM DESC”)

result = cursor.fetchall() # 获取所有满足条件的记录列表

print(result) # 打印结果

(5)查询有领导的员工中奖金最高的员工信息并输出

cursor.execute(“SELECT * FROM tb_test WHERE SMAJ IS NOT NULL ORDER BY SCOMM DESC”)

result = cursor.fetchone() # 获取所有满足条件的记录列表

print(result) # 打印结果

(6)删除奖金低于2000的员工,并输出删除的总人数

cursor.execute(“DELETE FROM tb_test WHERE SCOMM < ‘2000’”)

result = cursor.rowcount # 获取所有满足条件的记录列表

print(result) # 打印结果

(7)查询S0004员工的领导的姓名,生日

cursor.execute(“SELECT SNAME,SBIRTHDAY FROM tb_test WHERE SNO = ‘S0004’”)

result = cursor.fetchall() # 获取所有满足条件的记录列表

print(result) # 打印结果

db.close() # 关闭数据库连接

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一道可能的MySQL数据库期末考试题: 考试题目: 一个学生选课的数据库包含两张表:学生表(student)和选课表(course_student)。学生表包含学生的id、姓名、性别和出生日期等信息;选课表包含选课记录的id、学生id和课程id等信息。请根据以下要求,编写SQL语句查询对应的结果。 1. 查询每个学生选了多少门课程,并按照选课门数从多到少排序。 2. 查询每个学生所选的课程名称和任课教师,并按照学生id升序排序。 3. 查询选了“数学”课程的学生的姓名和选课门数,并按照选课门数从多到少排序。 4. 查询选了“数学”课程但未选“英语”课程的学生的姓名和选课门数,并按照选课门数从多到少排序。 5. 查询选课门数排名前三的学生的id、姓名和选课门数。 考试答案: 1. ```sql SELECT cs.student_id, COUNT(*) AS course_count FROM course_student AS cs GROUP BY cs.student_id ORDER BY course_count DESC; ``` 2. ```sql SELECT s.id, s.name, c.name AS course_name, c.teacher FROM student AS s JOIN course_student AS cs ON s.id = cs.student_id JOIN course AS c ON cs.course_id = c.id ORDER BY s.id ASC; ``` 3. ```sql SELECT s.name, COUNT(*) AS course_count FROM student AS s JOIN course_student AS cs ON s.id = cs.student_id JOIN course AS c ON cs.course_id = c.id WHERE c.name = '数学' GROUP BY s.id ORDER BY course_count DESC; ``` 4. ```sql SELECT s.name, COUNT(*) AS course_count FROM student AS s JOIN course_student AS cs1 ON s.id = cs1.student_id JOIN course AS c1 ON cs1.course_id = c1.id LEFT JOIN course_student AS cs2 ON s.id = cs2.student_id AND cs2.course_id = (SELECT id FROM course WHERE name = '英语') WHERE c1.name = '数学' AND cs2.course_id IS NULL GROUP BY s.id ORDER BY course_count DESC; ``` 5. ```sql SELECT s.id, s.name, COUNT(*) AS course_count FROM student AS s JOIN course_student AS cs ON s.id = cs.student_id GROUP BY s.id ORDER BY course_count DESC LIMIT 3; ``` 希望以上MySQL数据库期末考试题和答案能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值