From eab51aa776b2d8b9e5cb3d1ff4bf4301244e1833 Mon Sep 17 00:00:00 2001 From: ccc <1572227662@qq.com> Date: Mon, 21 Oct 2024 17:55:33 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=88=E4=BF=8A=E6=9D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\351\242\230\346\274\224\347\244\272.md" | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 "\351\231\210\344\277\212\346\235\260/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" diff --git "a/\351\231\210\344\277\212\346\235\260/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" "b/\351\231\210\344\277\212\346\235\260/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" new file mode 100644 index 0000000..cc6a779 --- /dev/null +++ "b/\351\231\210\344\277\212\346\235\260/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" @@ -0,0 +1,206 @@ +二、综合题(第1大题40分,第2大题30分,共70分) + + +1. 利用另外一个文件`initDb.sql`,完成以下题目: + + 1.1. (10分) 对学生姓名创建普通索引(`idx_StudentName`) + + 1.2. (10分) 创建视图`V_StudentHobbyInfo`,其中包含姓名(`StudentName`),爱好(`Hobby`),特长(`Specility`)列,并分别取别名为`vw_StudentName`,`vw_Hoppy`,`vw_Speclitiy + 1.4. (5分) 查询学生`马又云`的生源地,要求显示:姓名(`StudentNameame`),生源地(`OriginPosition`) + 1.5. (5分) 查询学生表(`StudentInfo`)中还未还书的读者的学号(`StudentCode`)和姓名(`StudentName`),以及借书时间(`BorrowTime`) + 1.6. (5分) 查询借阅过书籍《射雕英雄传》的学生,要求显示:学生姓名(`StudentName`),学院(`School`),图书名(`BookName`),借阅时间(`BorrowTime`) + + ```sql + --1.1. (10分) 对学生姓名创建普通索引(`idx_StudentName`) + CREATE INDEX idx_StudentName ON student(StudentName); + + --1.2. (10分) 创建视图`V_StudentHobbyInfo`,其中包含姓名(`StudentName`),爱好(`Hobby`),特长(`Specility`)列,并分别取别名为`vw_StudentName`,`vw_Hoppy`,`vw_Speclitiy`; + CREATE VIEW V_StudentHobbyInfo AS SELECT st.StudentName vw_StudentName,stu.Hobby vw_Hoppy,stu.Speciality vw_Speclitiy FROM student st,studentextinfo stu WHERE st.StudentCode = stu.StudentCode; + + 1.4. (5分) 查询学生`马又云`的生源地,要求显示:姓名(`StudentNameame`),生源地(`OriginPosition`) + SELECT st.StudentName 姓名,stu.OriginPosition 生源地 FROM student st,studentextinfo stu WHERE st.StudentCode = stu.StudentCode AND st.StudentName = '马又云'; + + 1.5. (5分) 查询学生表(`StudentInfo`)中还未还书的读者的学号(`StudentCode`)和姓名(`StudentName`),以及借书时间(`BorrowTime`) + + SELECT s.StudentCode 学号,s.StudentName 姓名,b.BorrowTime 借书时间 + FROM Student s + JOIN BorrowRecord b ON s.StudentCode = b.StudentCode + WHERE b.ReturnTime IS NULL; + + 1.6. (5分) 查询借阅过书籍《射雕英雄传》的学生,要求显示:学生姓名(`StudentName`),学院(`School`),图书名(`BookName`),借阅时间(`BorrowTime`) + + SELECT + s.StudentName 学生姓名,s.School 学院,bi.BookName 图书名,br.BorrowTime 借阅时间 + FROM Student s + JOIN BorrowRecord b ON s.StudentCode = b.StudentCode + JOIN BookExtInfo be ON br.Barcode = be.Barcode + JOIN BookInfo bi ON be.ISBN = bi.ISBN + WHERE bi.BookName = '射雕英雄传'; + ``` + + + + +2. (30分)某医院病房计算机管理中心需要如下信息: + + ``` + 科室:科编号、科名、科地址、科电话、医生姓名 + 病房:病房号、床位号、所属科室名 + 医生:姓名、职称、所属科室名、年龄、工作证号 + 病人:病历号、姓名、性别、诊断、主治医生、病房号 + ``` + 2.1. (10分)其中,一个科室有多个病房、多个医生;一个病房只能属于一个科室,一名医生只属于一个科室,但可负责多名病人的诊治,一个病人的主主治生只有一个。科编号是标识列,从1开始自增长,步进值为1,医生职称有:实习,初级,中级,高级。 + 请设计该表关系模式结构(数据库物理模型),要求: + + + a. 中文名和英文名称清晰(可借助有道翻译工具,不允许开网页) + b. 表关系准确,包括主键,外键,标识列 + c. 将完成的设计截图,并且保存物理模型文件,命名为恰当的名称 + d. 将截图和物理模型文件放在自己的文件夹中 + + ### CDM: + + ![image-20241021161023054](https://gitee.com/cenjj/images/raw/master/image/202410211610127.png) + + ### LDM: + + ![image-20241021161059002](https://gitee.com/cenjj/images/raw/master/image/202410211610059.png) + + ### PDM: + + ![image-20241021161124283](https://gitee.com/cenjj/images/raw/master/image/202410211611338.png) + + 2.2. (10分)创建存储过程实现:传入病历号,查询其对应的主治医生及其所在的病房号、床位号。 + 2.3. (10分)创建触发器实现:当医生离职时,检查其是否还有未完成医治的病人,如果还存在病人则不予离职,否则可以离职。 + +```sql +-- 2.2. (10分)创建存储过程实现:传入病历号,查询其对应的主治医生及其所在的病房号、床位号。 + +drop PROCEDURE if exists check_doctor; + +delimiter $$ + +CREATE PROCEDURE check_doctor(in patient_number int) +BEGIN + +SELECT d.dcname 主治医生,iw.iwid 病房号,iw.iwsn 床位号 from patient p +JOIN `inpatient ward` iw on p.iwid = iw.iwid +JOIN doctor d on d.dcid = p.dcid +where p.pid = patient_number; + + +end$$ +delimiter ; + +call check_doctor(3); +-- 2.3. (10分)创建触发器实现:当医生离职时,检查其是否还有未完成医治的病人,如果还存在病人则不予离职,否则可以离职。 + +drop TRIGGER if exists resign_doctor; + +CREATE trigger resign_doctor BEFORE DELETE on doctor for each row +BEGIN + +declare patient_number int; + +SELECT count(dcid) into patient_number from patient where dcid = old.dcid; -- 未完成医治的病人 + +if patient_number > 0 THEN +signal SQLSTATE '45000' set message_text = '不予离职'; +end if; + +end; +``` + +### SQL语句 + +```sql +-- 删除已存在的数据库 +DROP DATABASE IF EXISTS db1; + +-- 创建数据库 +CREATE DATABASE db1; +USE db1; + +-- 删除已存在的表 +DROP TABLE IF EXISTS department; +DROP TABLE IF EXISTS doctor; +DROP TABLE IF EXISTS `inpatient ward`; +DROP TABLE IF EXISTS patient; + +/*==============================================================*/ +/* Table: department */ +/*==============================================================*/ +CREATE TABLE department ( + deid INT NOT NULL AUTO_INCREMENT, -- 科编号,自增长 + dename VARCHAR(20) NOT NULL, -- 科名 + deaddress VARCHAR(30), -- 科地址 + dephone VARCHAR(20), -- 科电话 + PRIMARY KEY (deid), + UNIQUE (dename) -- 确保科名是唯一的 +) ENGINE=InnoDB; + +/*==============================================================*/ +/* Table: doctor */ +/*==============================================================*/ +CREATE TABLE doctor ( + dcid INT NOT NULL AUTO_INCREMENT, -- 医生编号,自增长 + dcname VARCHAR(20) NOT NULL, -- 医生姓名 + dctype VARCHAR(10) NOT NULL, -- 职称,如实习、初级、中级、高级 + deid INT NOT NULL, -- 所属科室编号 + dcage INT, -- 年龄 + dcwid VARCHAR(20) NOT NULL, -- 工作证号 + PRIMARY KEY (dcid), + FOREIGN KEY (deid) REFERENCES department(deid) +) ENGINE=InnoDB; + +/*==============================================================*/ +/* Table: "inpatient ward" */ +/*==============================================================*/ +CREATE TABLE `inpatient ward` ( + iwid INT NOT NULL AUTO_INCREMENT, -- 病房号,自增长 + deid INT NOT NULL, -- 所属科室编号 + iwsn INT, -- 床位号 + PRIMARY KEY (iwid), + FOREIGN KEY (deid) REFERENCES department(deid) +) ENGINE=InnoDB; + +/*==============================================================*/ +/* Table: patient */ +/*==============================================================*/ +CREATE TABLE patient ( + pid INT NOT NULL AUTO_INCREMENT, -- 病历号,自增长 + pname VARCHAR(20) NOT NULL, -- 姓名 + psex VARCHAR(4) NOT NULL, -- 性别 + pdiagnose VARCHAR(255), -- 诊断 + dcid INT NOT NULL, -- 主治医生编号 + iwid INT NOT NULL, -- 病房号 + PRIMARY KEY (pid), + FOREIGN KEY (dcid) REFERENCES doctor(dcid) , + FOREIGN KEY (iwid) REFERENCES `inpatient ward`(iwid) +) ENGINE=InnoDB; + +-- 插入科室信息 +INSERT INTO department (dename, deaddress, dephone) VALUES +('内科', '医院主楼3层', '12345678901'), +('外科', '医院主楼4层', '12345678902'), +('计算机管理中心', '医院主楼5层', '12345678903'); + +-- 插入医生信息 +INSERT INTO doctor (dcname, dctype, deid, dcage, dcwid) VALUES +('张三', '高级', 1, 45, 'WZ123456'), +('李四', '中级', 2, 38, 'WZ123457'), +('王五', '初级', 3, 30, 'WZ123458'); + +-- 插入病房信息 +INSERT INTO `inpatient ward` (deid, iwsn) VALUES +(1, 101), +(2, 102), +(3, 103); + +-- 插入病人信息 +INSERT INTO patient (pname, psex, pdiagnose, dcid, iwid) VALUES +('患者A', '男', '普通感冒', 1, 1), +('患者B', '女', '高血压', 2, 2), +('患者C', '男', '阑尾炎', 3, 3); +``` + -- Gitee