diff --git "a/\345\255\231\345\205\210\344\274\230/20241021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.md" "b/\345\255\231\345\205\210\344\274\230/20241021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..c9dcbbbcb5ff01f70fe4c9727c9de0d51b56d820 --- /dev/null +++ "b/\345\255\231\345\205\210\344\274\230/20241021 \346\225\260\346\215\256\345\272\223\351\253\230\347\272\247\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.md" @@ -0,0 +1,411 @@ +## 数据库设计 + +```sql +表与表的关系 +一对一:A表中的数据,在B表中只能找到一条数据与之关联,反之亦然 + +一对多:A表中的数据,在B表中能找到多条数据与之关联 + +多对多:A表中的数据,在B表中能找到多条数据与之关联,反之亦然 + +如何让表与表之间产生关联 +一对一:任意一个表中的主键放在另一个表当外键 一对多:将“一”所在的表的主键,放到“多”所在的表当外键 多对多:需要第三张表,将两表主键放在这儿当外键 + +提交到git +git add . 回车 + +git commit -m "test" 回车 + +git push 回车 + +三范式 +第一范式(1NF):要求数据库表的每一列都是不可分割的最小数据单元,即每个字段都是原子性的,不可再分。这是最基础的范式,要求表中的每一列都是原子性的,不能包含多个值或列表 。 +第二范式(2NF):在满足第一范式的基础上,要求表中的非主键字段必须完全依赖于主键,而不是依赖于主键的一部分。这意味着表中的所有非主键字段都必须与整个主键相关,而不是只与主键的一部分相关 。 +第三范式(3NF):在满足第二范式的基础上,要求非主键字段之间不存在传递依赖,即非主键字段不依赖于其他非主键字段,而只依赖于主键。这样可以避免数据冗余和更新异常的问题 。 +``` + + + +## 视图 + +```sql +-- 创建视图 +create view 视图名 as select * from 表名 where……; +-- 显示视图和表的类型 +show full tables; +-- 使用 +select * from 视图名; +-- 创建或替换视图 +create or replace view 视图名 as select * from 表名 where ……; +-- 修改视图 +rename table 原视图名 to 新视图名; +-- 修改视图内容 +select * from 视图名; +update 视图名 set 字段名1=值1,字段名2=值2,where……; +-- 删除视图 +drop view 视图名; +``` + + + +## 存储过程 + +```sql +课堂笔记 +存储过程是事先编好的、存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。 + +存储过程的优点: + +存储过程是通过处理封装在容易使用的单元中,简化了复杂的操作。 +简化对变动的管理。通常存储过程都是有助于提高应用程序的性能。 +存储过程有助于减少应用程序和数据库服务器之间的流量。 +存储过程度任何应用程序都是可重用的和透明的。 +存储的程序是安全的。 +存储过程语法: + +1、创建一个存储过程 + +create procedure 存储过程名() +begin +……sql语句集; +end; +2、查询现有的存储过程 + +show procedure status where 条件; +3、调用写好的存储过程 + +call 存储过程名(); +4、若存储过程中没有定义参数时,即()里为空,在调用时,可以省略() + +call 存储过程名; +5、删除一个存储过程delete drop过程的名称,不用() + +drop procedure 存储过程名; +6、如何修改一个存储过程,mysql没有这个方法。 + +7、mysql一个语句的结束,默认";"号结束,只要碰到第一个";"号就执行 + +可以事先修改默认的分隔符 + +delimiter 后接修改后的分隔符 + +8、完整语法 + +-- 改分隔符 +delimiter // +-- 创建过程 +create procedure 存储过程名() +-- begin +begin +-- sql语句集 + select * from 表名 where 条件; + …… +-- end +end // +-- 还原分隔符 +delimiter ; +``` + + + +## 窗口函数 + +```sql +窗口函数(Window Function)是 SQL 的一种功能,它允许您在 SQL 查询中执行复杂的计算,如运行总和、平均值、排名等,而不需要重复扫描数据表。窗口函数在数据分析和报表生成中非常有用。 + +以下是窗口函数的一些基本概念和常用的窗口函数: + +基本概念 +窗口:窗口函数定义了一个数据子集,称为窗口,窗口函数在这些子集上进行计算。 +分区:窗口可以按照某个条件(如 PARTITION BY 子句)将数据分为多个分区,每个分区内部的数据相互独立地进行计算。 +排序:使用 ORDER BY 子句定义窗口内数据的排序方式,这影响某些窗口函数的计算结果。 +框架:通过 ROWS 或 RANGE 子句定义窗口的框架,指定窗口内应该包含哪些行。 +常用的窗口函数 +ROW_NUMBER():为每个分区内的行分配一个唯一的连续整数。 +RANK():为每个分区内的行分配一个排名,相同值的行会有相同的排名,排名之间会有间隔。 +DENSE_RANK():与 RANK() 类似,但排名之间不会有间隔。 +LEAD():返回当前行之后的下一行的值。 +LAG():返回当前行之前的上一行的值。 +SUM():计算分区内所有值的总和。 +AVG():计算分区内所有值的平均值。 +MIN():返回分区内的最小值。 +MAX():返回分区内的最大值。 +NTILE(n):将分区内的行分成 n 个大致相等的组。 +示例 +假设有一个名为 employees 的表,包含 employee_id, department_id, salary 等字段,以下是一些使用窗口函数的示例: + +-- 使用 ROW_NUMBER() 为每个部门的员工分配一个唯一的排名 +SELECT + department_id, + employee_id, + salary, + ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank +FROM + employees; + +-- 使用 RANK() 为每个部门的员工分配一个排名 +SELECT + department_id, + employee_id, + salary, + RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank +FROM + employees; + +-- 使用 SUM() 计算每个部门的薪资总和 +SELECT + department_id, + SUM(salary) OVER (PARTITION BY department_id) AS total_salary +FROM + employees; + +-- 使用 LEAD() 获取当前行之后的下一行的薪资 +SELECT + employee_id, + salary, + LEAD(salary) OVER (ORDER BY employee_id) AS next_salary +FROM + employees; +``` + + + +## 自定义函数 + +```sql +存储函数: + +create function 函数名(参数名 数据类型) + +returns 返回的值的数据类型 + +determinstic/no sql/reads sql data 视情况选择 + +begin + +declare a varchar(20); + +函数体; + +return a; + +end; + +select 函数名(); + +删除存储函数: + +drop function 存储函数名; + +查看所有存储函数: + +show function status; + +查看存储函数创建语句: show create function 存储函数名; +``` + + + +## 游标 + +```sql +在存储过程或函数中使用 + +2、对结果集逐行处理,每次只取一行 + +3、结果集有几个字段,就要几个变量来接收 + +4、四个步骤:声明,打开,获取使用,关闭 + +声明游标: + +sql + +declare cursor_name cursor for SELECT…………; +这里,cursor_name 是您为游标指定的名称,SELECT………… 是返回结果集的 SELECT 查询。 + +打开游标: + +sql + +open cursor_name; +这将准备游标以检索数据。 + +提取数据: + +sql + +fetch cursor_name into 变量; +使用 FETCH 语句从游标中检索数据,并将数据放入变量列表中。 + +处理数据: 在程序中使用提取的数据进行所需的操作。 + +关闭游标: + +sql + +close cursor_name; +完成数据处理后,关闭游标。 + +5、因为fetch每次只取一行,取完会将指针下移一行,默认在第一行上面。所在要循环去遍历结果集 + +6、循环来遍历,有几个,用while,repeat,loop + +遍历到空行的处理 +declare 处理方式(继续,退出)handler for 触发条件(异常编码或异常条件)对异常处理的语句; +当触发条件被触发时,则按处理方式进行处理,并执行对异常处理的语句。 + +例如: +declare continue handler for not found set flag=0; +declare exit handler for 1329 set flag=0; +``` + + + +## 触发器 + +```sql +# 创建 +create trigger 触发器名称 触发时机(before / after)监控事件(insert / update / delete) on 表名 for each row +begin + -- 具体要被触发的操作,即一些语句 +end; + +# 修改,先删除再创建 + +# 查询 +show triggers;-- 查询所有触发器 +show triggers from db23 like 'order%';-- 通过表名名称查触发器 +show triggers where 'TRIGGER' like 'order%';-- 通过触发器名称查触发器 +show create trigger orders_be; + + +# 删除 +drop trigger 触发器名称; + +-- 触发的时机(before/after) 事件之前,还是事件之后触发 +-- insert事件,会产生新的一行,用new来表示,这一行中的各个字段,用new字段名来调用 +-- update事件,对旧数据的一行进行更新,产生新一行,用old表示旧一行,new表示新一行 +-- delete事件,只对旧数据进行删除,所以只有old来表示,要被删除的那行旧数据 + +# 什么要用begin、end +-- 当语句只有一行的时候,begin、end可以省略,同样适用于存储过程,函数,这些地方 +-- 多行语句,必须用begin end 包裹起来 +# 同一个表,同一个事,同一个时机,对同一个数据进行操作,不要重复建触发器 + +# 如何主动抛出异常 +SIGNAL SQLSTATE '45000' -- 5位数的错误信息,可以是5个纯数字或者大写字母 +SET MESSAGE_TEXT = '提示信息'; + + +# 例子: +create trigger 触发器名称 触发时机(before / after)监控事件(insert / update / delete) on 表名 for each row +begin + if 条件 then + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '提示信息'; + end if; +end; +``` + + + +## 事务 + +```sql + + +事务: + +事务就是用户给数据库操作序列,要么全做,要么全不做,是一个整体,不可分割。 +支持事务的数据库拥有4个特性: +原子性,一致性,隔离性,持久性。 +set @@autocommit=0;将系统中的自动提交关闭 + start transaction;开启事务 +rollback;回滚,撤销整个事务的所有操作,隐式的结束事务。 +commit;提交,不能反悔 +replease savepoint s1;删除s1这个保存点 +回滚部分事务: +start transction; + select *from bank; + + INSERT INTO `bank` VALUES (1, '张三', 100); + + savepoint s1; + + INSERT INTO `bank` VALUES (2, '李四', 200); + + savepoint s2; + + INSERT INTO `bank` VALUES (3, '李五', 200); + rollback to s2; + commit; + + 隔离四个级别:(isolation) + 1.读未提交(read uncommitted) + a 没提交 ,b可以读a还没提交的东西 + 2.读已提交(read committed) + 3.可重复读(repeatable read) + 4.序列化读/串行化读(serializable) + 可解决所有问题,但是效率最低 + + + + + +关闭自动提交: +set @@autocommit=0; -- 将系统变量中的自动提交改为禁用 +打开自动提交: +set @@autocommit=1; + +打开事务: +START TRANSACTION +提交: +COMMIT +回滚: +ROLLBACK --撤销整个事务的所有操作 +回滚和提交,都会隐式的结束事务 +保存点: +savepoint 名称 +回滚到保存点: +rollback to 名称 +删除保存点: +release savepiont 名称; + + +-- 查询当前全局事务隔离级别 +SELECT @@global.transaction_isolation; +-- 查询当前会话的事务隔离级别 +SELECT @@session.transaction_isolation; + +-- 设置全局隔离级别 +set global transaction isolation level read uncommitted; -- (这里设置的是第一级别读未提交(read uncommitted)** +# 注意修改过级别要新开会话(连接)才会生效。 + +-- 查询事务锁 +SELECT * FROM information_schema.INNODB_TRX; +``` + + + +## 索引 + +```sql +-- 普通索引 +create index 索引名 on 表名(字段名);-- 括号里可以有多个字段,运行时遵行左边优先 +-- 查询索引 +show index from 表名; +-- 添加索引(多列) +alter table 表名 add index 索引名(字段名1,字段名2……); +-- 删除索引 +drop index 索引名 on 表名; +-- 在建表时指定索引 +create table 表名( +id int +index 索引名(字段名) +); +-- 建立唯一索引(单列) +create unique index 字段名 on 表名(字段名); +-- 查看有没有用到索引 +explain + 查询语句; +``` + diff --git "a/\345\255\231\345\205\210\344\274\230/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" "b/\345\255\231\345\205\210\344\274\230/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..8cbe880948950888b7cfcb94687da7d0244be079 --- /dev/null +++ "b/\345\255\231\345\205\210\344\274\230/20241021 \347\273\274\345\220\210\351\242\230\346\274\224\347\244\272.md" @@ -0,0 +1,304 @@ +```sql + +drop database if exists LibraryDb; +create database LibraryDb; + +use LibraryDb; +/* + 学生表 +*/ +CREATE TABLE Student ( + StudentCode varchar(8) primary key, -- 学号 + StudentName varchar(20) NOT NULL, -- 姓名 + Gender int DEFAULT NULL, -- 性别 + Birthday date DEFAULT NULL, -- 出生年月 + School varchar(20) DEFAULT NULL, -- 学院 + Major varchar(20) DEFAULT NULL -- 专业 +); + + +/* + 学生扩展信息表 +*/ +CREATE TABLE StudentExtInfo( + StudentCode varchar(8) primary key , -- 学号 + Hobby varchar(120) DEFAULT NULL, -- 爱好 + Speciality varchar(120) DEFAULT NULL, -- 特长 + OriginPosition varchar(16) DEFAULT NULL, -- 生源地 + Prize int DEFAULT NULL -- 荣誉数 +); + + + +/* + 图书信息表 +*/ +CREATE TABLE BookInfo ( + ISBN varchar(13) primary key, -- ISBN + BookName varchar(32) DEFAULT NULL, -- 图书名 + Author varchar(32) DEFAULT NULL, -- 作者 + Publishing varchar(32) DEFAULT NULL, -- 出版社 + PublishedTime date DEFAULT NULL, -- 出版时间 + Introduce varchar(200) DEFAULT NULL, -- 书籍简介 + Catery varchar(8) DEFAULT NULL, -- 书籍分类 + Price decimal(10,2) DEFAULT NULL -- 书籍价格 +); + + + +/* + 图书类别表 +*/ +CREATE TABLE BookExtInfo( + Barcode varchar(9) primary key, -- barcode + ISBN varchar(13) , -- ISBN + BookStatus bit default null -- 状态 +); + + +/* + 学生借阅信息 +*/ +CREATE TABLE BorrowRecord( + Id int primary key , -- 借阅id + StudentCode varchar(8) , -- 学号 + Barcode varchar(9) , -- barcode + BorrowTime datetime DEFAULT NULL, -- 借书时间 + ReturnTime datetime DEFAULT NULL -- 还书时间 +); + + +insert into Student values('16100101','马诗',1,'1998-03-16','理学院','统计'); +insert into Student values('16130201','博文',0,'1998-04-24','信息学院','计算机科学与技术'); +insert into Student values('16130203','魏波',1,'1998-10-29','信息学院','计算机科学与技术'); +insert into Student values('16130205','黄弘',1,'1998-08-06','信息学院','数据科学与大数据技术'); +insert into Student values('17100104','易高明',0,'1999-05-29','理学院','信息与计算科学'); +insert into Student values('17100105','万承承',0,'1999-09-11','理学院','信息与计算科学'); +insert into Student values('17110101','黄弘',0,'2000-07-25','文法学院','法学'); +insert into Student values('17130202','邹睿睿',1,'1998-06-29','信息学院','计算机科学与技术'); +insert into Student values('17130204','马又云',1,'1999-03-27','信息学院','数据科学与大数据技术'); +insert into Student values('18100103','邓承明',1,'2000-07-25','理学院','信息与计算科学'); + + +insert into StudentExtInfo values('16100101','听音乐','艺术特长','北京',2); +insert into StudentExtInfo values('16130201','看小说',null,'湖南',3); +insert into StudentExtInfo values('16130203','硬笔书法','艺术特长','新疆',1); +insert into StudentExtInfo values('16130205','听音乐','艺术特长','北京',2); +insert into StudentExtInfo values('17100104','打篮球',null,'北京',3); +insert into StudentExtInfo values('17100105','编程','科技特长','北京',2); +insert into StudentExtInfo values('17110101','打篮球','科技特长','河北',2); +insert into StudentExtInfo values('17130202','编程','科技特长','天津',3); +insert into StudentExtInfo values('17130204','看电影',null,'北京',1); +insert into StudentExtInfo values('18100103',null,null,'河南',null); + + +insert into BookInfo values('7040409659','大学计算机','李凤霞','高等教育出版社','2014-10-21','教育部大学计算机课程改革项目规划教材','TP',28); +insert into BookInfo values('7301046065','刑法学','高明轩','北京大学出版社','2000-10-21','刑法_法学高等学校中国教材','O',69); +insert into BookInfo values('7806553312','射雕英雄传','金庸','广州出版社','2018-10-21','金庸作品集','I',67.9); +insert into BookInfo values('9788020002207','红楼梦','曹雪芹','人民文学出版社','2008-10-21','学术研究或个人阅读都非常合适','I',31.25); +insert into BookInfo values('9787113254100','Python语言及其应用','赵广辉','中国铁道出版社','2019-10-21','本书介绍Python语言的基础知识及其在各个领域的具体应用','TP',62.2); +insert into BookInfo values('9787115266156','管理信息系统实用教程(第2版)','王若宾','人民邮电出版社','2012-10-21','普通高等教育\十一五\国家级规划教材','TP',36); +insert into BookInfo values('9787115356840','管理信息系统实用教程(第3版)','王若宾','人民邮电出版社','2015-10-21','普通高等教育\十一五\国家级规划教材','TP',45); +insert into BookInfo values('9787302252955','人工智能:一种现代的方法(第3版)','黄今夏','清华大学出版社','2011-10-21','《人工智能:一种现代的方法(第3版)》为大学计算机教育著名教材系列之一','TP',132.6); +insert into BookInfo values('9787513030953','信息论','田甜','知识产权出版社','2015-10-21','文理科公选课指定教材','TP',126); +insert into BookInfo values('9787569302585','计算统计(第2版)','冯新奇','西安交通大学出版社','2018-10-21','本书涵盖了计算统计的所有核心内容','TP',67.5); +insert into BookInfo values('9789113268712','新编数据库技术','王若宾','中国铁道出版社','2018-10-21','本书重构了课程内容结构','TP',38.5); + + +insert into BookExtInfo values('O924.01','7301046065',0); +insert into BookExtInfo values('O924.02','7301046065',1); +insert into BookExtInfo values('O924.03','7301046065',1); +insert into BookExtInfo values('I13.212','9788020002207',1); +insert into BookExtInfo values('I13.213','9788020002207',1); +insert into BookExtInfo values('I247.56','7806553312',1); +insert into BookExtInfo values('I247.59','7806553312',0); +insert into BookExtInfo values('TP122.32','9787569302585',1); +insert into BookExtInfo values('TP122.33','9787569302585',1); +insert into BookExtInfo values('TP311.11','9787113254100',1); +insert into BookExtInfo values('TP311.12','9787113254100',0); +insert into BookExtInfo values('TP311.13','9787115356840',1); + + +insert into BorrowRecord values(1,'16130203','I247.56','2019-04-09','2019-04-13'); +insert into BorrowRecord values(2,'17130204','I247.56','2019-04-15','2019-04-17'); +insert into BorrowRecord values(3,'16130205','I247.59','2019-04-17','2019-04-20'); +insert into BorrowRecord values(4,'16100101','I247.56','2019-04-17','2019-04-18'); +insert into BorrowRecord values(5,'17100105','TP311.11','2019-04-29',null); +insert into BorrowRecord values(6,'16130201','I247.59','2019-05-01','2019-05-20'); +insert into BorrowRecord values(7,'17130202','TP311.12','2019-05-03',null); +insert into BorrowRecord values(8,'18100103','I13.212','2019-05-04','2019-05-15'); +insert into BorrowRecord values(9,'18100103','I13.213','2019-05-20','2019-05-30'); +insert into BorrowRecord values(10,'17110101','O924.01','2019-05-25',null); + + +select * from Student; +select * from StudentExtInfo; +select * from BookInfo; +select * from BookExtInfo; +select * from BorrowRecord; +``` + + + +-- 二、综合题(第1大题40分,第2大题30分,共70分) +-- + +-- + +-- 1. 利用另外一个文件`initDb.sql`,完成以下题目: +-- + +```sql +-- 1.1. (10分) 对学生姓名创建普通索引(`idx_StudentName`) +create index idx_StudentName on student(StudentName); + +-- 1.2. (10分) 创建视图`V_StudentHobbyInfo`,其中包含姓名(`StudentName`),爱好(`Hobby`),特长(`Speciality`)列,并分别取别名为`vw_StudentName`,`vw_Hoppy`,`vw_Speclitiy +create view V_StudentHobbyInfo as select StudentName vw_StudentName,Hobby vw_Hoppy,Speciality vw_Speclitiy from studentextinfo so join student st on so.StudentCode=st.StudentCode; + +-- 1.4. (5分) 查询学生`马又云`的生源地,要求显示:姓名(`StudentNameame`),生源地(`OriginPosition`) +select StudentName,OriginPosition from studentextinfo so join student st on so.StudentCode=st.StudentCode where StudentName='马又云'; + +-- 1.5. (5分) 查询学生表(`StudentInfo`)中还未还书的读者的学号(`StudentCode`)和姓名(`StudentName`),以及借书时间(`BorrowTime`) +select so.StudentCode,st.StudentName,bd.BorrowTime from Studentextinfo so join borrowrecord bd on so.StudentCode=bd.StudentCode join student st on st.StudentCode=so.StudentCode; + +-- 1.6. (5分) 查询借阅过书籍《射雕英雄传》的学生,要求显示:学生姓名(`StudentName`),学院(`School`),图书名(`BookName`),借阅时间(`BorrowTime`) +select StudentName,School,BookName,BorrowTime from student st join borrowrecord bd on st.StudentCode=bd.StudentCode join bookextinfo bto on bto.barcode=bd.barcode join bookinfo bo on bto.ISBN=bo.ISBN where BookName='射雕英雄传'; +``` + + + + + + + + + + + + + + + + + +```sql +drop database if exists yiyuan; +create database yiyuan; + +use yiyuan; + +/*==============================================================*/ +/* DBMS name: MySQL 5.0 */ +/* Created on: 2024/10/22 9:29:03 */ +/*==============================================================*/ + + +drop table if exists bingfang; + +drop table if exists bingren; + +drop table if exists keshi; + +drop table if exists yisheng; + +/*==============================================================*/ +/* Table: bingfang */ +/*==============================================================*/ +create table bingfang +( + b_id int not null auto_increment, + k_id int not null, + yi_cwid int, + yi_ksname varchar(255), + primary key (b_id) +); + +/*==============================================================*/ +/* Table: bingren */ +/*==============================================================*/ +create table bingren +( + br_id int not null auto_increment, + yi_id int not null, + br_name varchar(255), + br_sex varchar(2), + zhenduan varchar(255), + zhu_ys varchar(255), + bf_id int, + primary key (br_id) +); + +/*==============================================================*/ +/* Table: keshi */ +/*==============================================================*/ +create table keshi +( + k_id int not null auto_increment, + k_name varchar(255), + k_dizh varchar(255), + k_phone varchar(11), + yisheng_name varchar(255), + primary key (k_id) +); + +/*==============================================================*/ +/* Table: yisheng */ +/*==============================================================*/ +create table yisheng +( + yi_name varchar(255), + yi_chenghao varchar(255), + yi_ksname varchar(255), + yi_age varchar(10), + yi_gzz int, + yi_id int not null auto_increment, + k_id int not null, + primary key (yi_id) +); + +alter table bingfang add constraint FK_Relationship_1 foreign key (k_id) + references keshi (k_id) on delete restrict on update restrict; + +alter table bingren add constraint FK_Relationship_3 foreign key (yi_id) + references yisheng (yi_id) on delete restrict on update restrict; + +alter table yisheng add constraint FK_Relationship_2 foreign key (k_id) + references keshi (k_id) on delete restrict on update restrict; + +``` + + + +-- 2. (30分)某医院病房计算机管理中心需要如下信息: + +-- ``` +-- 科室:科编号、科名、科地址、科电话、医生姓名 +-- 病房:病房号、床位号、所属科室名 +-- 医生:姓名、职称、所属科室名、年龄、工作证号 +-- 病人:病历号、姓名、性别、诊断、主治医生、病房号 +-- ``` +-- 2.1. (10分)其中,一个科室有多个病房、多个医生;一个病房只能属于一个科室,一名医生只属于一个科室,但可负责多名病人的诊治,一个病人的主主治生只有一个。科编号是标识列,从1开始自增长,步进值为1,医生职称有:实习,初级,中级,高级。 + +-- 请设计该表关系模式结构(数据库物理模型),要求: + +-- +-- a. 中文名和英文名称清晰(可借助有道翻译工具,不允许开网页) +-- b. 表关系准确,包括主键,外键,标识列 +-- c. 将完成的设计截图,并且保存物理模型文件,命名为恰当的名称 + +-- d. 将截图和物理模型文件放在自己的文件夹中 + +-- 2.2. (10分)创建存储过程实现:传入病历号,查询其对应的主治医生及其所在的病房号、床位号。 + +```sql +create PROCEDURE test1(in br_id int) +BEGIN + +end; +``` + + + + + +-- 2.3. (10分)创建触发器实现:当医生离职时,检查其是否还有未完成医治的病人,如果还存在病人则不予离职,否则可以离职。