(2022级)成都工业学院数据库原理及应用实验六: SQL DML(增、删、改)

发布于:2024-04-25 ⋅ 阅读:(42) ⋅ 点赞:(0)

写在前面

1、基于2022级软件工程/计算机科学与技术实验指导书

2、成品仅提供参考

3、如果成品不满足你的要求,请寻求其他的途径

运行环境

window11家庭版

Navicat Premium 16

Mysql 8.0.36

实验要求

在实验三的基础上完成下列查询:

1、在科室表中增加一个二级科室,其科室编码为“10401”

2、在科室表中增加一个二级科室,其上级科室编码为“10600”。

3、在医生表中增加一个医生,要求其级别编码为7。

4、将“一级专家”诊疗费改为120。

5、将医生“万春”在2022年4月18日的值班时段调整为上午。

6、删除医生编号为‘D001’的值班记录。

7、删除医生‘朱强’在2022年4月18日的值班记录。

8、删除工作证号为“D016”的医生。

9、创建一个表work_count,包含两个属性工作证号、值班次数。使用子查询的形式将每个医生的工作证号、值班次数存入表work_count。从work_count查询出医生的工作证号、值班次数。

10、定义一个视图doctor_info,包含工作证号,医生姓名、科室编码、科室名称、医生级别编码、级别名称,其中工作证号来自Doctor表,科室编码来至department表,医生级别编码DoctorLevel表。使用该视图完成查询:查询医生姓名、科室名称、级别名称。

11、基于上题中定义的视图doctor_info,插入一个医生级别(7,‘测试1’),插入一个医生(’D020’,’测试医生’),观察是否成功,并思考产生这种结果的原因?

实验过程

1、在科室表中增加一个二级科室,其科室编码为“10401”

INSERT into department VALUES("10401","新增科室1","2",NULL);
SELECT * FROM department

546cc30d09024a45aebb0a741c8010c0.png

2、在科室表中增加一个二级科室,其上级科室编码为“10600”。

INSERT into department VALUES("12345","新增科室2","2",10600);
SELECT * FROM department

698a6241d8fe4ae487426738e709d06f.png

3、在医生表中增加一个医生,要求其级别编码为7。

SET FOREIGN_KEY_CHECKS = 0; --禁用外键
INSERT into doctor VALUES("1234","新增医生","123456","2022-2-2","7","躺平");
SET FOREIGN_KEY_CHECKS = 1; --重启外键
SELECT * FROM doctor

931f3bb28d2a4b8b83735d79c36da8f7.png

4、将“一级专家”诊疗费改为120。

UPDATE doctorlevel SET Drlv_fee="120" WHERE Drlv_no=1;
SELECT * FROM doctorlevel

5e749cd9810b4a93b010886729846165.png

5、将医生“万春”在2022年4月18日的值班时段调整为上午。

UPDATE doctor INNER JOIN schedule ON doctor.Dr_no=schedule.Dr_no SET Skd_seg=1 WHERE Dr_name="万春" AND Skd_Date="2022-4-18";
SELECT * FROM schedule

80602c2765904899b981dbceadb8ea92.png

6、删除医生编号为‘D001’的值班记录。

DELETE FROM schedule WHERE Dr_no="D001";
SELECT * FROM schedule

8bf3ece44fcf4f6b81564d73001a7f1b.png

7、删除医生‘朱强’在2022年4月18日的值班记录。

DELETE schedule FROM schedule INNER JOIN doctor ON schedule.Dr_no=doctor.Dr_no WHERE Dr_name="朱强" AND Skd_Date="2022-4-18";
SELECT * FROM schedule

ae3ab86ba03d4e63916cc4784fea5156.png8、删除工作证号为“D016”的医生。

SET FOREIGN_KEY_CHECKS = 0; -- 禁用外键
DELETE FROM doctor WHERE Dr_no = 'D016';
DELETE FROM schedule WHERE Dr_no = 'D016';
SET FOREIGN_KEY_CHECKS = 1; -- 重启外键
SELECT * FROM doctor;
SELECT * FROM schedule

3eefe739d4f64ca6ac3e13bcf0cc0c8d.png

459ec2c0c7ed422faa0be9895f44903a.png

9、创建一个表work_count,包含两个属性工作证号、值班次数。使用子查询的形式将每个医生的工作证号、值班次数存入表work_count。从work_count查询出医生的工作证号、值班次数。

CREATE TABLE `work_count` ( `Dr_id` CHAR ( 4 ) NOT NULL, `Skd_time` TINYINT NOT NULL, PRIMARY KEY ( `Dr_id` ) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb3;
INSERT INTO work_count ( Dr_id, Skd_time ) SELECT
Dr_no,
count( Skd_seg ) 
FROM
SCHEDULE 
GROUP BY
	Dr_no 
HAVING
	COUNT( Skd_seg )>=(
	SELECT
		MIN( Skd_seg ) 
	FROM
	SCHEDULE 
	);
SELECT * FROM work_count

e298f76cb45e4fb5b086247d302571b9.png

10、定义一个视图doctor_info,包含工作证号,医生姓名、科室编码、科室名称、医生级别编码、级别名称,其中工作证号来自Doctor表,科室编码来至department表,医生级别编码DoctorLevel表。使用该视图完成查询:查询医生姓名、科室名称、级别名称。

CREATE VIEW `doctor_info` AS SELECT
`doctor`.`Dr_no` AS `Dr_no`,
`doctor`.`Dr_name` AS `Dr_name`,
`doctorlevel`.`Drlv_no` AS `Drlv_no`,
`doctorlevel`.`Drlv_name` AS `Drlv_name`,
`department`.`Dept_no` AS `Dept_no`,
`department`.`Dept_name` AS `Dept_name` 
FROM
	((
			`doctor`
			JOIN `doctorlevel` ON ( `doctor`.`Drlv_no` = `doctorlevel`.`Drlv_no` ))
	JOIN `department` ON ( `doctor`.`Dept_no` = `department`.`Dept_no` ));
SELECT
	Dr_name,
	Drlv_name,
	Dept_name 
FROM
	doctor_info

7f789a1c4b614f5497b33532ae640575.png

11、基于上题中定义的视图doctor_info,插入一个医生级别(7,‘测试1’),插入一个医生(’D020’,’测试医生’),观察是否成功,并思考产生这种结果的原因?

--第一种1393报错:表示您不能通过一个连接视图(join view)修改超过一个基表
INSERT INTO doctor_info ( Dr_no, Dr_name, Drlv_no, Drlv_name, Dept_no, Dept_name )
VALUES
	( NULL, NULL, "7", "测试1", NULL, NULL);
INSERT INTO doctor_info ( Dr_no, Dr_name, Drlv_no, Drlv_name, Dept_no, Dept_name )
VALUES
	( "D020","测试医生",NULL, NULL, NULL, NULL);

f6ba5b58f49142a1b2ad129004d0d955.png

--第二种1423报错:表示您尝试插入数据到一个视图,但是视图对应的基表中有一个字段没有默认值,而且在插入操作中没有为该字段提供值。
INSERT INTO doctor_info ( Drlv_no, Drlv_name )
VALUES
	( "7", "测试1" );
INSERT INTO doctor_info ( Dr_no, Dr_name )
VALUES
	( "D020", "测试医生" );

b757322e809a496890b7e8be376b720b.png

插入失败,原因是:

视图在数据库中是一种虚拟表,它是由一个或多个实际表(基表)上的查询结果构成的。视图本身不存储数据,它只是展示基表数据的一种方式。视图只能查,不能增删改