门诊管理数据库SQL查询设计与实现
2019-07-16张建莉高欣
张建莉 高欣
摘要:结构化查询语言(Structured Query Language,SQL)是一种通用的、功能性极强的国际标准关系数据库语言。本文以ACCESS为操作平台,结合自行设计的门诊管理数据库通过创建实例介绍了SQL主要语句的功能与实现,尤其对核心语句SELECT 进行了充分的分析和实例设计与实现。
关键词:结构化查询语言;数据库;数据表;查询
中图分类号:TP391 文献标识码:A
文章编号:1009-3044(2019)15-0035-03
SQL语言专门用于与关系数据库管理系统进行数据交互,集数据定义、数据查询、数据操纵、数据控制功能于一体,语言风格统一,为数据库应用系统开发提供了良好的环境。与通常的高级语言不同,SQL只要说明做什么,不需要说明怎么做,具体操作全部由数据库管理系统自动完成,且语言简洁,易学易用。本文以ACCESS为操作平台,以小型“门诊管理系统”数据库为例进行了SQL语句的查询设计与实现。
1在Access中使用SQL语句
Access 2010中,任何一个查询都对应着一个SQL语句,可以说查询对象的实质是一条SQL语句。在查询设计视图创建查询时,Access 2010便会自动撰写出相应的SQL代码。除了可以查看SQL代码,还可以编辑它。
查看或输入SQL代码,可以在进入查询的设计视图后,单击工具栏上的“视图”下拉按钮,选择“SQL视图”项,然后编辑。输入完SQL语句后,单击功能区的“运行”按钮,得到SQL语句的执行结果。本文将根据实际应用的需要,主要介绍数据定义、数据查询和数据操作等基本语句。
SQL只有为数不多的几条命令,且其语法接近英语口语,十分简单,易学易用,对于数据统计方便直观。SQL的数据定义、操作、查询和控制功能的语言动词见表1。注意:
(1)SQL窗口中只能输入一条SQL语句,但可分行输入,系统会把分号“;”作为命令的结束标志,但一般在输入命令时,不必人为地输入分号。当需要分行输入时,不能把SQL语句的关键字或字段名分在不同行。
(2)SQL语句中所有的标点符号和运算符号均为英文字符。
(3)每两个单词之间至少要有一个空格或有必要的逗号。
2门诊管理数据库SQL查询设计与实现
2.1门诊管理数据库介绍
“门诊管理系统”数据库的各个表设置表结构,描述如下(主键加下划线,外键斜体):
科室(科室号,科室类别,科室名称,联系方式,科室简介)
病人(病人ID,病人姓名,病人性别,出生日期,婚否,地址,城市,地区,电话,过敏史)
医生(医生工号,医生姓名,科室号,职称,最高学历,是否党员,照片)
药品(药品编号,药品名称,药品规格,单位,单价,库存量,订购量,中止)
处方(处方号,病人ID,医生工号,开出日期,临床诊断)
处方明细(处方号,药品编号,单位,数量,用法)
收费单(收费单号,病人ID,医疗类型,金额,日期)
挂号单(挂号单号,挂号方式,日期,挂号费,病人ID,科室名称,医生工号)
在“门诊管理系统”数据库中各个表之间的关系如图1所示。
2.2数据表定义语句
(1)CREATE语句
建立数据库的主要操作之一是定义基本表。在SQL语言中,可以使用CREATE TABLE语句定义基本表。
例1 在“门诊管理”数据库中建立表“医生1”表,其结构为(医生工号/文本/6/主键,医生姓名/文本/20,科室号/文本/3,职称/文本/10,最高学历/文本/10,是否党员/是否,照片/ OLE型)。
语句格式如下:
CREATE TABLE 医生1(医生工号 TEXT(6) PRIMARY KEY, 医生姓名 TEXT(8) NOT NULL, 科室号 TEXT(3),职称 TEXT(10),最高学历 TEXT(10),是否党员 LOGICAL,照片 GENERAL);
此例中,TEXT、LOGICAL、GENERAL分别代表文本型、是否型和OLE型,另外SMALLINT、INTEGER、FLOAT、MEMO、DATE分别代表整型、长整型、双精度型、备注型、日期型。
(2)ALTER语句
创建后的表可根据需要使用ALTER TABLE语句修改结构。
例2 在表“医生1”中增加一个“年龄”列,其语句格式如下:
ALTER TABLE医生1 ADD年龄SMALLINT;
例3 删除表“医生1”中的“年龄”列,其语句格式如下:
ALTER TABLE 医生1 DROP年龄;
(3)DROP语句
如果希望删除某个不需要的表,可以使用DROP TABLE语句。
例3 删除已建立的“医生1”表,其语句格式如下:
DROP TABLE医生1;
2.3数据操作语句
数据操作语句是完成数据操作的命令,它由INSERT(插入),DELETE(删除),UPDATE(更新)和SELECT(查詢)等组成。
(1)INSERT语句
INSERT语句实现数据的插入功能,可以将一条新记录插入到指定表中。
例4 向医生1表中添加一条记录。
INSERT INTO 医生1(医生工号, 医生姓名, 科室号,职称,最高学历,是否党员) VALUES("028010","张扬","028","住院医师", "硕士",-1);
(2)UPDATE语句
UPDATE语句能够对指定表所有记录或满足条件的记录进行更新操作。
例5在“门诊管理”数据库中复制“药品”表生成“药品1”表,将“药品1”表所有胶囊(药品名称后两字是胶囊)的单价提高5%。
UPDATE 药品1 SET 药品1.单价=药品1.单价*1.05 WHERE 药品名称 like "*胶囊";
(3)DELETE语句
DELETE语句用来对指定表所有记录或满足条件的记录进行删除操作。
例6删除药品1表中所有单位为支的记录。
DELETE FROM 药品1 WHERE 单位=“支”;
(4)SELECT 语句
数据查询是数据库的核心操作。SQL提供了SELECT语句进行数据查询,SELECT 语句功能强大、使用灵活,是SQL语言的核心,具有强大的单表和多表查询功能,正因为如此,SELECT语句的可选项很多,语法也较复杂。其一般格式为:
SELECT [ALL︱DISTINCT] *︱<字段列表>
FROM <表名1>[,<表名2>] …
[WHERE <条件表达式>]
[GROUP BY <字段名> [HAVING <条件表达式>]]
[ORDER BY <字段名> [ASC︱DESC]];
命令格式中< >、[ ]分别表示必选项和可选项;“|”表示其前后任选一项。
该语句从指定的基本表中,创建一个由指定范围内、满足条件、按某字段分组、按某字段排序的指定字段组成的新记录集。其中,ALL 表示检索所有符号条件的记录,默认值为ALL;DISTINCT表示检索要去掉重复行的所有记录;*表示检索结果包括所有的字段;<字段列表>使用“,”将项分开,这些项可以是字段、常数或系统内部的函数;FROM子句说明要检索的数据来自哪个或哪些表,可以对单个或多个表进行检索;WHERE子句说明检索条件,条件表达式可以是关系表达式,也可以是逻辑表达式;GROUP BY子句用于对检索结果进行分组,可以利用它进行分组汇总;HAVING必须跟随GROUP BY使用,它用来限定分组必须满足的条件;ORDER BY 子句用来对检索结果进行排序,如果排序时选择ASC,表示检索结果按某一字段值升序排序,如果选择DESC,表示检索结果按某一字段值降序排列。
例7 查找并显示医生表中的所有字段。
SELECT * FROM 医生;
例8 查找并显示医生表中“医生工号”“医生姓名”“职称”和“是否党员”4个字段。
SELECT医生工号,医生姓名,职称,是否党员FROM 医生;
例9查找职称为住院医师的医生,并显示“医生工号”,“医生姓名”,“最高学历”。
SELECT医生工号,医生姓名,最高学历 FROM 医生 WHERE 职务=“住院医师”;
例10 统计职称为主任医师的人数,并将计算字段命名为“主任医师人数”。
SELECT COUNT(*) AS主任医师人数FROM 医生 GROUP BY 职称 HAVING职称=“住院医师”;
其中,AS子句后定义的是新字段名。
例11在处方明细表和药品表检索处方里哪些药品,检索结果按药品编号升序排序。
SELECT DISTINCT 处方明细.药品编号, 药品.药品名称 FROM 处方明细, 药品
WHERE 处方明细.药品编号=药品.药品编号 ORDER BY 处方明细.药品编号;
在处方明细表中,同一药品可以出现在多张处方中。这种药品只显示一次即可,所以加上唯一值的设置(DISTINCT)。
例12从“医生”、“处方”两个表中查询每个处方的处方号、病人ID、医生姓名、临床诊断。
SELECT 处方.处方号, 处方.病人ID, 医生.医生姓名, 处方.临床诊断
FROM 医生 INNER JOIN 处方 ON 医生.医生工号 = 处方.医生工号;
当查询涉及两个以上的表时,该查询称为连接查询。
以2个表为例的命令格式为:
SELECT <字段列表> FROM <表名1> INNER JOIN <表名2> ON <连接条件>;
或
SELECT <字段列表> FROM <表名1> ,<表名2> WHERE <连接条件>
拓展到以3个表为例的命令格式为:
SELECT <字段列表> FROM <表名1> INNER JOIN (<表名2> INNER JOIN <表名3> ON<连接条件2>) ON <连接条件1>;
或
SELECT <字段列表> FROM <表名1> ,<表名2>,<表名3> WHERE <连接条件1> AND <连接条件2>;
例13从“医生”“处方”两个表中查询每个处方的处方号、病人ID、医生姓名、临床诊断。
SELECT 处方.处方号, 处方.病人ID, 病人.病人姓名, 医生.医生姓名, 处方.临床诊断
FROM 医生 INNER JOIN (病人 INNER JOIN 处方 ON 病人.病人ID = 处方.病人ID)
ON 医生.医生工号 = 处方.医生工号;
在數据库应用开发中SQL语言应用广泛,并且有些查询只能通过编写SQL语句实现,掌握SQL语句非常重要。而通过在实际数据库中设计实例并运行相应的命令是SQL语句的掌握的最佳途径。
参考文献:
[1] 朱烨 张敏辉.数据库技术原理与设计[M].北京:高等教育出版社,2017.
[2] 王军委.Access数据库应用基础教程[M].北京:清华大学出版社,2014.
【通联编辑:梁书】