From bae45a34a2306a56464e7db0bbb1b046b165575b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=A1=E5=85=89=E4=B9=90?= Date: Mon, 21 Oct 2024 22:13:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=A1=E5=85=89=E4=B9=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\347\273\203\344\271\240\351\242\230.md" | 337 ++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 "\345\207\241\345\205\211\344\271\220/20241021\347\273\203\344\271\240\351\242\230.md" diff --git "a/\345\207\241\345\205\211\344\271\220/20241021\347\273\203\344\271\240\351\242\230.md" "b/\345\207\241\345\205\211\344\271\220/20241021\347\273\203\344\271\240\351\242\230.md" new file mode 100644 index 0000000..0f1a8a9 --- /dev/null +++ "b/\345\207\241\345\205\211\344\271\220/20241021\347\273\203\344\271\240\351\242\230.md" @@ -0,0 +1,337 @@ +### 一、准备数据 + +```sql +-- 1. 利用另外一个文件`initDb.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; + +``` + +### 二、练习题 + +```sql +-- 数据准备 +CREATE DATABASE db23; + +/*==============================================================*/ +/* DBMS name: MySQL 5.0 */ +/* Created on: 2024-10-21 11:25:30 */ +/*==============================================================*/ + + +drop table if exists bin_class; + +drop table if exists doctor; + +drop table if exists science; + +drop table if exists sick; + +/*==============================================================*/ +/* Table: bin_class */ +/*==============================================================*/ +create table bin_class +( + bin_class_id int not null auto_increment, + science_id int, + bed_id int not null, + belongs_science_name char(255) not null, + primary key (bin_class_id) +); + +/*==============================================================*/ +/* Table: doctor */ +/*==============================================================*/ +create table doctor +( + doctor_id int not null auto_increment, + science_id int, + doctor_name char(255) not null, + doctor_job char(255) not null, + belongs_science_name char(255) not null, + doctor_age int not null, + doctor_job_id int not null, + primary key (doctor_id) +); + +/*==============================================================*/ +/* Table: science */ +/*==============================================================*/ +create table science +( + science_id int not null auto_increment, + science_name char(255) not null, + science_adress char(255) not null, + science_phone int not null, + actorer_name char(255) not null, + primary key (science_id) +); + +/*==============================================================*/ +/* Table: sick */ +/*==============================================================*/ +create table sick +( + sick_id int not null auto_increment, + bin_class_id int, + doctor_id int, + sick_name char(255) not null, + sick_sex char(255) not null, + sick_if char(255) not null, + major_sick_doctor char(255) not null, + primary key (sick_id) +); + +alter table bin_class add constraint FK_seience_class_bin_class foreign key (science_id) + references science (science_id) on delete restrict on update restrict; + +alter table doctor add constraint FK_science_class_doctor foreign key (science_id) + references science (science_id) on delete restrict on update restrict; + +alter table sick add constraint FK_bin_class_sick_person foreign key (bin_class_id) + references bin_class (bin_class_id) on delete restrict on update restrict; + +alter table sick add constraint FK_doctor_sick_person foreign key (doctor_id) + references doctor (doctor_id) on delete restrict on update restrict; + + +-- 2.1. (10分)其中,一个科室有多个病房、多个医生;一个病房只能属于一个科室,一名医生只属于一个科室,但可负责多名病人的诊治,一个病人的主主治生只有一个。科编号是标识列,从1开始自增长,步进值为1,医生职称有:实习,初级,中级,高级。 +-- 请设计该表关系模式结构(数据库物理模型),要求: +-- +-- +-- a. 中文名和英文名称清晰(可借助有道翻译工具,不允许开网页) +-- b. 表关系准确,包括主键,外键,标识列 +-- c. 将完成的设计截图,并且保存物理模型文件,命名为恰当的名称 +-- d. 将截图和物理模型文件放在自己的文件夹中 + +INSERT INTO bin_class (bin_class_id,science_id,bed_id,belongs_science_name) VALUES +(1,1,1,'内科'), +(2,2,2,'牙科'), +(3,3,3,'皮肤科'), +(4,4,4,'外科'); + + +INSERT INTO doctor (doctor_id ,science_id,doctor_name,doctor_job,belongs_science_name,doctor_age,doctor_job_id) VALUES +(1,1,'小明','组长','儿科',45,1), +(2,2,'小何','组长','皮肤科',47,2), +(3,3,'朱丽叶','科长','牙科',32,4), +(4,4,'马化腾','室长','外科',38,3); + + +INSERT INTO science (science_id,science_name,science_adress,science_phone,actorer_name) VALUES +(1,'内科','福建龙岩',10086,'小明'), +(2,'牙科','安徽合肥',10085,'朱丽叶'), +(3,'外科','福建厦门',10054,'小何'), +(4,'皮肤科','北京海淀',10083,'马化腾'); + + +INSERT INTO sick (sick_id,bin_class_id,doctor_id,sick_name,sick_sex,sick_if,major_sick_doctor) VALUES +(1,2,1,'张三','男','牙痛','王医生'), +(2,3,3,'李四','女','胃痛','李医生'), +(3,1,2,'王五','男','皮肤痒','刘医生'), +(4,4,4,'王二麻','女','皮肤痒','赖医生'); + + +-- 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 AS vw_StudentName ,Hobby AS vw_Hoppy ,Speciality as vw_Speclitiy FROM studentextinfo s1 +JOIN student s2 ON s1.StudentCode= s2.StudentCode; + + +-- 1.4. (5分) 查询学生`马又云`的生源地,要求显示:姓名(`StudentNameame`),生源地(`OriginPosition`) + + SELECT StudentName,OriginPosition FROM studentextinfo s1 +JOIN student s2 ON s1.StudentCode = s2.StudentCode WHERE StudentName = '马又云'; + + +-- 1.5. (5分) 查询学生表(`StudentInfo`)中还未还书的读者的学号(`StudentCode`)和姓名(`StudentName`),以及借书时间(`BorrowTime`) + + + SELECT s1.StudentCode,s1.StudentName,b.BorrowTime FROM student s1 +JOIN borrowrecord b ON s1.StudentCode = b.StudentCode +WHERE ReturnTime is NULL ; + + +-- 1.6. (5分) 查询借阅过书籍《射雕英雄传》的学生,要求显示:学生姓名(`StudentName`),学院(`School`),图书名(`BookName`),借阅时间(`BorrowTime`) + + + SELECT s1.StudentName,s1.School,b3.BookName,b1.BorrowTime FROM student s1 +JOIN borrowrecord b1 ON s1.StudentCode = b1.StudentCode +JOIN bookextinfo b2 ON b2.Barcode = b1.Barcode +JOIN bookinfo b3 ON b3.ISBN = b2.ISBN +WHERE BookName = '射雕英雄传'; + +-- 2.2. (10分)创建存储过程实现:传入病历号,查询其对应的主治医生及其所在的病房号、床位号。 +DROP PROCEDURE p_hosipital; +delimiter// +CREATE PROCEDURE p_hosipital(in sickid INT) +BEGIN + +SELECT s.major_sick_doctor,b.bin_class_id,b.bed_id FROM sick s +JOIN bin_class b on s.bin_class_id = b.bin_class_id WHERE sick_id= sickid; + +END// + +delimiter; + +CALL p_hosipital(2); + + +-- 2.3. (10分)创建触发器实现:当医生离职时,检查其是否还有未完成医治的病人,如果还存在病人则不予离职,否则可以离职。 + +CREATE TRIGGER t_hosipital BEFORE DELETE +on sick for EACH row + +BEGIN + +DECLARE patient_count int ; + +SELECT count(*) into patient_count FROM sick WHERE sick_id = old.sick_id; + +IF patient_count >0 THEN + + SIGNAL SQLSTATE '45000' + SET message_text = '还有未完成医治的病人,不予离职'; + + +END IF; + +END; + +``` + -- Gitee