SDUT数据库原理第三章课后作业sql语句参考答案

目录

第一大题

第二大题


自己写的,在navicat中检验过没有什么问题,如有错误欢迎指正,答案仅供参考

利用SQL语句完成如下操作:

第一大题

第一大题:设有一个设备管理系统的模式(数据库)E-P-U,已知在数据库中有下列基本表,结构如下:

设备表EquipmentEno, Ename, Ebuyday, Etypeid, Etypename)

人员表PersonPno, Pname, Psex, Pbirth, Pposition)

设备使用表Use1Eno, Pno, Borrowday, Usetime, Fee)

说明:

  1. 设备表Equipment的属性为:设备编号,设备名称,购入日期,设备分类号,设备分类名;
  2. 人员表Person的属性为:员工号,姓名,性别,出生日期,职位;
  3. 设备使用表Use的属性为:设备编号,员工号,借出日期,使用时间,收费金额。
  1. 为用户ADMIN创建模式(数据库)E-P-U,然后在其中创建Equipment、Person、Use1三个表。

CREATE SCHEMA E-P-U;

USE E-P-U;

CREATE TABLE Equipment(

Eno VARCHAR(10) NOT NULL,

Ename varchar(50) NOT NULL,

Ebuyday DATE NOT NULL,

Etypeid INT NOT NULL,

Etypename VARCHAR(50) NOT NULL,

PRIMARY KEY(Eno)

);

CREATE TABLE Person(

Pno VARCHAR(10) NOT NULL,

pname varchar(50) NOT NULL,

Psex CHAR(1) NOT NULL,

Pbirth DATE NOT NULL,

Pposition VARCHAR(50) NOT NULL,

PRIMARY KEY(Pno)

);

CREATE TABLE Use1(

Eno VARCHAR(10) NOT NULL,

Pno VARCHAR(10) NOT NULL,

Borrowday DATE NOT NULL,

Usetime INT NOT NULL,

Fee FLOAT NOT NULL,

PRIMARY KEY(Eno,Pno)

);

2.写出完成如下操作的SQL查询语句:

(1)查询设备使用表Use1中每种设备收费金额超过200的设备编号和收费金额。

SELECT Eno,Fee

FROM Use1

Group BY Eno

HAVING SUM(Fee)>200;

这里解释一下having 的作用,因为我写的时候也不知道......(源自chatgpt)

`HAVING` 关键字用于 SQL 中的 `GROUP BY` 子句,用于过滤聚合函数后的结果集。
具体来说,`HAVING` 关键字用于筛选组函数(如 `SUM`、`AVG`、`MAX`、`MIN`、`COUNT` 等)作用后的数据,类似地,可以看作是对聚合后的数据进行筛选过滤,筛选后的结果可以与 `WHERE` 条件结合使用。
使用 `HAVING` 时,可以用 `GROUP BY` 指定数据分组的依据,然后在 `HAVING` 中使用聚合函数过滤掉不符合条件的组,最终返回符合条件的聚合结果。

  1. 检索借出设备名称(Ename)为“笔记本”的员工姓名,借出日期和收费金额。

SELECT Pname,Borrowday,Fee

FROM Person JOIN Use1 ON Person.Pno=Use1.Pno JOIN Equipment ON Use1.Eno=Equipment.Eno

WHERE Ename='笔记本';

  1. 检索借出设备使用时间(Usetime)超过一个月的员工姓名、设备编号。

SELECT Pname,Eno

FROM Person JOIN Use1 ON Person.Pno=Use1.Pno

WHERE Usetime>30;

  1. 检索借用设备的收费金额超过1000元的员工姓名、设备编号、设备名称。

SELECT Pname,Use1.Eno,Ename

FROM Person JOIN Use1 ON Person.Pno=Use1.Pno JOIN Equipment ON Use1.Eno=equipment.Eno

WHERE Fee>1000;

第二大题

第二大题:设有一个记录运动会的数据库,已知在数据库中有下列表:

运动员表Athleteano,aname,asex,aclassid, aclassname) 

项目表Itemino,iname,type,idate)

参与项目表Participate (ano,ino,ranking)

其中运动员表Athlete的属性依次为运动员编号,运动员名称,性别,班级编号,班级名称;项目表Item的属性依次为项目号,项目名称,项目类型,比赛时间;参与项目表Participate的属性依次为运动员编号,项目号,名次。

  1. 创建项目表item(要求:包含主键约束和check约束idate >2017-05-01

CREATE TABLE item(

ino VARCHAR(20) PRIMARY KEY,

iname VARCHAR(20),

type VARCHAR(20),

idate DATE CHECK(idate>'2017-05-01')

);

2.添加一个项目记录,项目号为‘2017001’,项目名称为‘400M’,项目类型为‘田径’,比赛时间为‘2017-5-22’。

INSERT INTO item (ino,iname,type,idate) VALUES ('2017001','400M','田径','2017-5-22');

3.将运动员名称为‘张晓满’参与的项目名次修改为1。

UPDATE Participate SET ranking=1 WHERE ano=(SELECT ano FROM Athlete WHERE aname='张晓满')

这个SQL语句的作用是将参与项目表中某个运动员(姓名为'张晓满')在某个项目中的名次修改为1。具体解释如下:

首先,选择参与项目表Participate,并使用UPDATE语句来更新其中的记录(即修改名次ranking的值)。语法形式为:

UPDATE Participate SET ranking=1 WHERE ...

然后,在WHERE子句中设置条件,这里用了一个子查询,该子查询从运动员表Athlete中筛选出姓名为'张晓满'的运动员,然后使用ano作为条件,选择参与项目表中的某行记录:

WHERE ano=(SELECT ano FROM Athlete WHERE aname='张晓满')

4.删除运动员名称为‘杨秀芳’的运动员信息。

DELETE FROM Athlete WHERE aname='杨秀芳';

5.查询参与项目表中名次为1的运动员编号和姓名。

SELECT p.ano,a.aname FROM Participate p JOIN Athlete a ON p.ano=a.ano WHERE p.ranking=1;

再插一句:(还是gpt老师说的)

FROM Participate p 是SQL中FROM子句的一种写法,表示需要从名为Participate的表中选取数据,并指定一个别名p来替代Participate这个表名,在后续的SELECT和WHERE等语句中使用p作为该表的表名。
使用表的别名的好处是可以简化SQL语句的书写。在FROM之后接表名时,如果该表名比较复杂或容易混淆,使用表的别名就可以让语句更加清晰易懂,并且在写复杂的联合查询时,指定别名可以让每个表的结构更加明显,方便程序员理解。
在这个SQL语句中,FROM Participate p表示我们需要从参与项目表Participate中选取数据,并指定别名为p,以便在后面的查询语句中使用p来代替Participate。这样,查询有关参与项目表中的信息时,就可以使用简洁的「p.列名」来代替长长的「Participate.列名」。

6.将参与项目表Participate查询权限、修改权限授予用户zhu,并允许该用户将此权限授予其他用户

GRANT SELECT,INSERT,UPDATE ON Participate TO zhu WITH GRANT OPTION;

7.定义视图,完成如下功能:输出没有运动员参加的项目信息

CREATE VIEW ProjectWithoutAthlete AS

SELECT ino,iname,type,idate FROM item

where ino not in(select ino from Participate);

8.检索参与项目名称为“400M接力”的运动员名称(aname)和取得的名次。

SELECT a.aname,p.ranking FROM Athlete a JOIN Participate p ON a.ano=p.ano JOIN item i ON p.ino=i.ino where i.iname='400M接力';

 如有问题,欢迎指正哦

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实验的目的是掌握数据库存储过程和触发器的创建和应用,以及了解它们在实际应用中的作用。本实验使用的数据库为MySQL。 一、实验环境 1. MySQL数据库 2. Navicat数据管理工具 二、实验步骤 1. 数据库建立 本实验中使用的数据库sdut,可以通过Navicat工具新建一个MySQL数据库。 2. 学生的创建 学生包含学号、姓名、性别、年龄、所在班级等字段,可以通过下面的SQL语句创建: ```sql CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), sex CHAR(2), age INT, class_id INT ); ``` 3. 学生的数据插入 可以使用下面的SQL语句向学生中插入一些数据: ```sql INSERT INTO student (name, sex, age, class_id) VALUES ('张三', '男', 18, 1), ('李四', '女', 19, 2), ('王五', '男', 20, 3), ('赵六', '女', 21, 1), ('钱七', '男', 22, 2); ``` 4. 存储过程的创建 存储过程是一段预定义好的SQL语句集合,可以在需要时直接调用,可以减少数据库服务器的负担和网络传输的时间。本实验中创建一个存储过程,用于统计每个班级的学生总数。 ```sql CREATE PROCEDURE count_student() BEGIN SELECT class_id, COUNT(*) AS total FROM student GROUP BY class_id; END; ``` 上面的存储过程会查询学生中的数据,并按照班级进行分组,然后统计每个班级的学生总数。 5. 触发器的创建 触发器是一段SQL语句,可以在数据库的某个操作(如插入、更新、删除)发生时自动触发执行。本实验中创建一个触发器,用于在学生中插入数据时自动更新班级中的学生总数。 ```sql CREATE TRIGGER update_class AFTER INSERT ON student FOR EACH ROW BEGIN UPDATE class SET total = total + 1 WHERE id = NEW.class_id; END; ``` 上面的触发器会在学生中插入数据时自动执行,将对应班级的学生总数加1。 6. 实验结果 可以通过以下两种方式验证存储过程和触发器的正确性: (1)调用存储过程 可以使用下面的SQL语句调用存储过程: ```sql CALL count_student(); ``` 调用结果如下: ``` class_id | total ---------|------ 1 | 2 2 | 2 3 | 1 ``` 可以看到存储过程成功统计了每个班级的学生总数。 (2)插入数据 可以使用下面的SQL语句向学生中插入一条数据: ```sql INSERT INTO student (name, sex, age, class_id) VALUES ('孙八', '女', 23, 3); ``` 插入数据后,可以查询班级的数据,验证触发器是否成功更新了学生总数: ```sql SELECT * FROM class; ``` 查询结果如下: ``` id | name | total ---|------|------ 1 | 一班 | 2 2 | 二班 | 2 3 | 三班 | 2 ``` 可以看到触发器成功将三班的学生总数从1更新为2。 三、实验总结 本实验通过创建存储过程和触发器,成功实现了统计班级学生总数和自动更新班级学生总数功能。存储过程和触发器可以大大减少数据库服务器的负担和网络传输的时间,提高了数据库的性能和响应速度,是数据库管理中常用的技术手段。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值