數據庫課設項目(上) 醫院

任務

數據庫課程有小組共同完成的大作業,我們小組抽取到的題目是關於疫情背景下的患者就醫問題。在小組成員完成主體的設計後,我嘗試運用學過的SQL語句實現基本的需求。
上篇實現醫院信息的導入,下篇數據庫課設項目(下) 醫護人員與患者實現(虛擬)醫護人員和患者數據的導入和相關操作。
最終會將完整項目代碼上傳至GitHub倉庫

需求分析

在這裏插入圖片描述

過程

CREATE DATABASE

數據庫名稱爲medicalSystem

DECLARE @databaseName varchar(20);
DECLARE @createSql varchar(40);
set @databaseName = 'medicalSystem'
if exists (SELECT * FROM sys.databases 
   WHERE name = @databaseName)
   print 'database '+@databaseName+' already exists';
else
BEGIN
 set @createSql='CREATE DATABASE '+@databaseName
 exec(@createSql);
 print @createSql;
END

導入地區數據

通過在GitHub上搜索,直接有SQL語句構建地區各種數據(郵編,經緯度等)現有代碼。這裏選用的是這一項目:https://github.com/kbdxbt/area_sql
語句是MYSQL的格式,在SQL SERVER中有諸多報錯,因此有部分格式需要轉化。

轉義字符

` 是 MySQL 的轉義符,避免和 mysql 的本身的關鍵字衝突,只要你不在列名、表名中使用 mysql 的保留字或中文,就不需要轉義。

而SQL SERVER中是不支持這個字符的,通過替換,將所有的 ` 改爲 "
替換
同理,還需要把 ’ 改爲 ‘’
此時基本錯誤消除完畢,剩下的是建表中不一致的語句

CREATE TABLE

  1. COMMENT註釋掉
  2. AUTO_INCREMENT對應SQL SERVER中的IDENTITY(爲了插入數據方便,我去掉了這個規則)
  3. 註釋掉建表最後的要求--ENGINE=InnoDB AUTO_INCREMENT=3750 DEFAULT CHARSET=utf8;
CREATE TABLE "hy_area" (
  "id" int NOT NULL ,-- COMMENT 'ID',--AUTO_INCREMENT
  "pid" int DEFAULT NULL ,--COMMENT '父id',
  "shortname" varchar(100) DEFAULT NULL ,--COMMENT '簡稱',
  "name" varchar(100) DEFAULT NULL ,--COMMENT '名稱',
  "merger_name" varchar(255) DEFAULT NULL ,--COMMENT '全稱',
  "level" tinyint DEFAULT NULL ,--COMMENT '層級 0 1 2 省市區縣',
  "pinyin" varchar(100) DEFAULT NULL ,--COMMENT '拼音',
  "code" varchar(100) DEFAULT NULL ,--COMMENT '長途區號',
  "zip_code" varchar(100) DEFAULT NULL ,--COMMENT '郵編',
  "first" varchar(50) DEFAULT NULL ,--COMMENT '首字母',
  "lng" varchar(100) DEFAULT NULL ,--COMMENT '經度',
  "lat" varchar(100) DEFAULT NULL ,--COMMENT '緯度',
  PRIMARY KEY ("id")
) --ENGINE=InnoDB AUTO_INCREMENT=3750 DEFAULT CHARSET=utf8;
INSERT INTO "hy_area" VALUES ('1', '0', '北京', '北京', '中國,北京', '1', 'beijing', '', '', 'B', '116.405285', '39.904989');
INSERT INTO "hy_area" VALUES ('2', '1', '北京', '北京市', '中國,北京,北京市', '2', 'beijing', '010', '100000', 'B', '116.405285', '39.904989');
INSERT INTO "hy_area" VALUES ('3', '2', '東城', '東城區', '中國,北京,北京市,東城區', '3', 'dongcheng', '010', '100010', 'D', '116.41005', '39.93157');
INSERT INTO "hy_area" VALUES ('4', '2', '西城', '西城區', '中國,北京,北京市,西城區', '3', 'xicheng', '010', '100032', 'X', '116.36003', '39.9305');
INSERT INTO "hy_area" VALUES ('5', '2', '朝陽', '朝陽區', '中國,北京,北京市,朝陽區', '3', 'chaoyang', '010', '100020', 'C', '116.48548', '39.9484');

成功導入

在這裏插入圖片描述

註冊醫院

在GitHub中有通過爬蟲獲取全國醫院數據的項目,但我暫時目標是熟悉SQL語句,便只從網頁中複製了少量醫院數據做爲測試。

CREATE TABLE

CREATE TABLE [dbo].[Hospital](
 醫院名稱 nvarchar(40) NOT NULL UNIQUE,
 醫院等級 nvarchar(4) NULL,
醫院類型 nvarchar(4) NULL,
省 nvarchar(10) NULL,
市 nvarchar(10) NULL,
縣 nvarchar(20) NULL,
牀位數 int NULL,
醫院地址 nvarchar(60) NULL,
郵編 varchar(100) NULL,
constraint pk_Hospital PRIMARY KEY
   NONCLUSTERED(醫院名稱)
)
INSERT INTO Hospital( 醫院名稱,醫院等級,醫院類型,,,,牀位數, 醫院地址) VALUES
('河北大學附屬醫院','三級甲等','綜合醫院','河北省','保定市','蓮池區',2300,'保定市蓮池區裕華東路212號'),
('保定市第一中心醫院','三級甲等','綜合醫院','河北省','保定市','蓮池區',2100,'保定市蓮池區長城北大街320號'),
('滄州市人民醫院','三級甲等','綜合醫院','河北省','滄州市','新華區',3000,'滄州市清池大道7號'),
('滄州市中心醫院','三級甲等','綜合醫院','河北省','滄州市','新華區', 4700,'滄州市新華中路201號'),
('承德醫學院附屬醫院','三級甲等','綜合醫院','河北省','承德市','雙橋區',2400,'承德市南營子大街36號')
GO

導入結果

在這裏插入圖片描述

觸發器創建默認科室

默認科室意味着每增添一個新的醫院,就爲其創建幾個默認的科室。原本想到通過遊標遍歷表的方法實現,但在網上看到人們推薦SQL使用集合形式實現,而減少使用遊標。
因此我首先創建了一個初始科室表:

初始科室
CREATE TABLE defaultDepartment(
number int NOT NULL IDENTITY(001,1),
name nvarchar(20) NOT NULL
CONSTRAINT pk_defaultDepartment PRIMARY KEY( number)
)
END
INSERT INTO defaultDepartment VALUES
 ('門診部'),
 ('住院部'),
 ('急診部'),
 ('藥房'),
 ('收費室'),
 ('化驗室'),
 ('放射科'),
 ('手術室'),
 ('B超室'),
 ('行政樓'),
 ('後勤科室')
科室表
CREATE TABLE Department(
number int NOT NULL,
name nvarchar(20) NOT NULL,
hospitalName  nvarchar(40) NOT NULL
CONSTRAINT pk_department PRIMARY KEY( number,hospitalName),
CONSTRAINT fk_Hospital FOREIGN KEY(hospitalName)
  REFERENCES Hospital(醫院名稱) ON DELETE CASCADE
)
END
CREATE TRIGGER

觸發器例題分析:數據庫每日一題(3)觸發器

CREATE TRIGGER  trigger_defaultDepartment ON Hospital
AFTER INSERT 
AS 
BEGIN
 INSERT INTO Department 
  SELECT D.number,D.name,I.醫院名稱 FROM defaultDepartment D, inserted I
END
實現展示

在這裏插入圖片描述

存儲過程找到醫院對應郵編

存儲過程例題分析:數據庫每日一題 (4)存儲過程

CREATE PROC

CREATE PROC findZipCode
AS
BEGIN
 UPDATE Hospital
 SET 郵編= zip_code
 FROM Hospital left join hy_area
  on=name
END
GO

實現思路

通過對應醫院信息中的市名與地區信息中的name
在這裏插入圖片描述

另:可能會出現沒有匹配結果的情況,可以通過EXCEPT找到相應條目並手動更新,或通過遊標遍歷,使用算法尋找。

結果展示

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章