張建莉 高欣
摘要:結(jié)構(gòu)化查詢(xún)語(yǔ)言(Structured Query Language,SQL)是一種通用的、功能性極強(qiáng)的國(guó)際標(biāo)準(zhǔn)關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。本文以ACCESS為操作平臺(tái),結(jié)合自行設(shè)計(jì)的門(mén)診管理數(shù)據(jù)庫(kù)通過(guò)創(chuàng)建實(shí)例介紹了SQL主要語(yǔ)句的功能與實(shí)現(xiàn),尤其對(duì)核心語(yǔ)句SELECT 進(jìn)行了充分的分析和實(shí)例設(shè)計(jì)與實(shí)現(xiàn)。
關(guān)鍵詞:結(jié)構(gòu)化查詢(xún)語(yǔ)言;數(shù)據(jù)庫(kù);數(shù)據(jù)表;查詢(xún)
中圖分類(lèi)號(hào):TP391 ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)15-0035-03
SQL語(yǔ)言專(zhuān)門(mén)用于與關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行數(shù)據(jù)交互,集數(shù)據(jù)定義、數(shù)據(jù)查詢(xún)、數(shù)據(jù)操縱、數(shù)據(jù)控制功能于一體,語(yǔ)言風(fēng)格統(tǒng)一,為數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)提供了良好的環(huán)境。與通常的高級(jí)語(yǔ)言不同,SQL只要說(shuō)明做什么,不需要說(shuō)明怎么做,具體操作全部由數(shù)據(jù)庫(kù)管理系統(tǒng)自動(dòng)完成,且語(yǔ)言簡(jiǎn)潔,易學(xué)易用。本文以ACCESS為操作平臺(tái),以小型“門(mén)診管理系統(tǒng)”數(shù)據(jù)庫(kù)為例進(jìn)行了SQL語(yǔ)句的查詢(xún)?cè)O(shè)計(jì)與實(shí)現(xiàn)。
1在Access中使用SQL語(yǔ)句
Access 2010中,任何一個(gè)查詢(xún)都對(duì)應(yīng)著一個(gè)SQL語(yǔ)句,可以說(shuō)查詢(xún)對(duì)象的實(shí)質(zhì)是一條SQL語(yǔ)句。在查詢(xún)?cè)O(shè)計(jì)視圖創(chuàng)建查詢(xún)時(shí),Access 2010便會(huì)自動(dòng)撰寫(xiě)出相應(yīng)的SQL代碼。除了可以查看SQL代碼,還可以編輯它。
查看或輸入SQL代碼,可以在進(jìn)入查詢(xún)的設(shè)計(jì)視圖后,單擊工具欄上的“視圖”下拉按鈕,選擇“SQL視圖”項(xiàng),然后編輯。輸入完SQL語(yǔ)句后,單擊功能區(qū)的“運(yùn)行”按鈕,得到SQL語(yǔ)句的執(zhí)行結(jié)果。本文將根據(jù)實(shí)際應(yīng)用的需要,主要介紹數(shù)據(jù)定義、數(shù)據(jù)查詢(xún)和數(shù)據(jù)操作等基本語(yǔ)句。
SQL只有為數(shù)不多的幾條命令,且其語(yǔ)法接近英語(yǔ)口語(yǔ),十分簡(jiǎn)單,易學(xué)易用,對(duì)于數(shù)據(jù)統(tǒng)計(jì)方便直觀。SQL的數(shù)據(jù)定義、操作、查詢(xún)和控制功能的語(yǔ)言動(dòng)詞見(jiàn)表1。注意:
(1)SQL窗口中只能輸入一條SQL語(yǔ)句,但可分行輸入,系統(tǒng)會(huì)把分號(hào)“;”作為命令的結(jié)束標(biāo)志,但一般在輸入命令時(shí),不必人為地輸入分號(hào)。當(dāng)需要分行輸入時(shí),不能把SQL語(yǔ)句的關(guān)鍵字或字段名分在不同行。
(2)SQL語(yǔ)句中所有的標(biāo)點(diǎn)符號(hào)和運(yùn)算符號(hào)均為英文字符。
(3)每?jī)蓚€(gè)單詞之間至少要有一個(gè)空格或有必要的逗號(hào)。
2門(mén)診管理數(shù)據(jù)庫(kù)SQL查詢(xún)?cè)O(shè)計(jì)與實(shí)現(xiàn)
2.1門(mén)診管理數(shù)據(jù)庫(kù)介紹
“門(mén)診管理系統(tǒng)”數(shù)據(jù)庫(kù)的各個(gè)表設(shè)置表結(jié)構(gòu),描述如下(主鍵加下劃線(xiàn),外鍵斜體):
科室(科室號(hào),科室類(lèi)別,科室名稱(chēng),聯(lián)系方式,科室簡(jiǎn)介)
病人(病人ID,病人姓名,病人性別,出生日期,婚否,地址,城市,地區(qū),電話(huà),過(guò)敏史)
醫(yī)生(醫(yī)生工號(hào),醫(yī)生姓名,科室號(hào),職稱(chēng),最高學(xué)歷,是否黨員,照片)
藥品(藥品編號(hào),藥品名稱(chēng),藥品規(guī)格,單位,單價(jià),庫(kù)存量,訂購(gòu)量,中止)
處方(處方號(hào),病人ID,醫(yī)生工號(hào),開(kāi)出日期,臨床診斷)
處方明細(xì)(處方號(hào),藥品編號(hào),單位,數(shù)量,用法)
收費(fèi)單(收費(fèi)單號(hào),病人ID,醫(yī)療類(lèi)型,金額,日期)
掛號(hào)單(掛號(hào)單號(hào),掛號(hào)方式,日期,掛號(hào)費(fèi),病人ID,科室名稱(chēng),醫(yī)生工號(hào))
在“門(mén)診管理系統(tǒng)”數(shù)據(jù)庫(kù)中各個(gè)表之間的關(guān)系如圖1所示。
2.2數(shù)據(jù)表定義語(yǔ)句
(1)CREATE語(yǔ)句
建立數(shù)據(jù)庫(kù)的主要操作之一是定義基本表。在SQL語(yǔ)言中,可以使用CREATE TABLE語(yǔ)句定義基本表。
例1 在“門(mén)診管理”數(shù)據(jù)庫(kù)中建立表“醫(yī)生1”表,其結(jié)構(gòu)為(醫(yī)生工號(hào)/文本/6/主鍵,醫(yī)生姓名/文本/20,科室號(hào)/文本/3,職稱(chēng)/文本/10,最高學(xué)歷/文本/10,是否黨員/是否,照片/ OLE型)。
語(yǔ)句格式如下:
CREATE TABLE 醫(yī)生1(醫(yī)生工號(hào) TEXT(6) PRIMARY KEY, 醫(yī)生姓名 TEXT(8) NOT NULL, 科室號(hào) TEXT(3),職稱(chēng) TEXT(10),最高學(xué)歷 TEXT(10),是否黨員 LOGICAL,照片 GENERAL);
此例中,TEXT、LOGICAL、GENERAL分別代表文本型、是否型和OLE型,另外SMALLINT、INTEGER、FLOAT、MEMO、DATE分別代表整型、長(zhǎng)整型、雙精度型、備注型、日期型。
(2)ALTER語(yǔ)句
創(chuàng)建后的表可根據(jù)需要使用ALTER TABLE語(yǔ)句修改結(jié)構(gòu)。
例2 在表“醫(yī)生1”中增加一個(gè)“年齡”列,其語(yǔ)句格式如下:
ALTER TABLE醫(yī)生1 ?ADD年齡SMALLINT;
例3 刪除表“醫(yī)生1”中的“年齡”列,其語(yǔ)句格式如下:
ALTER TABLE 醫(yī)生1 ?DROP年齡;
(3)DROP語(yǔ)句
如果希望刪除某個(gè)不需要的表,可以使用DROP TABLE語(yǔ)句。
例3 刪除已建立的“醫(yī)生1”表,其語(yǔ)句格式如下:
DROP TABLE醫(yī)生1;
2.3數(shù)據(jù)操作語(yǔ)句
數(shù)據(jù)操作語(yǔ)句是完成數(shù)據(jù)操作的命令,它由INSERT(插入),DELETE(刪除),UPDATE(更新)和SELECT(查詢(xún))等組成。
(1)INSERT語(yǔ)句
INSERT語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)的插入功能,可以將一條新記錄插入到指定表中。
例4 向醫(yī)生1表中添加一條記錄。
INSERT INTO 醫(yī)生1(醫(yī)生工號(hào), 醫(yī)生姓名, 科室號(hào),職稱(chēng),最高學(xué)歷,是否黨員) VALUES("028010","張揚(yáng)","028","住院醫(yī)師", "碩士",-1);
(2)UPDATE語(yǔ)句
UPDATE語(yǔ)句能夠?qū)χ付ū硭杏涗浕驖M(mǎn)足條件的記錄進(jìn)行更新操作。
例5在“門(mén)診管理”數(shù)據(jù)庫(kù)中復(fù)制“藥品”表生成“藥品1”表,將“藥品1”表所有膠囊(藥品名稱(chēng)后兩字是膠囊)的單價(jià)提高5%。
UPDATE 藥品1 ?SET 藥品1.單價(jià)=藥品1.單價(jià)*1.05 WHERE 藥品名稱(chēng) ?like ?"*膠囊";
(3)DELETE語(yǔ)句
DELETE語(yǔ)句用來(lái)對(duì)指定表所有記錄或滿(mǎn)足條件的記錄進(jìn)行刪除操作。
例6刪除藥品1表中所有單位為支的記錄。
DELETE ?FROM 藥品1 ?WHERE ?單位=“支”;
(4)SELECT 語(yǔ)句
數(shù)據(jù)查詢(xún)是數(shù)據(jù)庫(kù)的核心操作。SQL提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)查詢(xún),SELECT 語(yǔ)句功能強(qiáng)大、使用靈活,是SQL語(yǔ)言的核心,具有強(qiáng)大的單表和多表查詢(xún)功能,正因?yàn)槿绱?,SELECT語(yǔ)句的可選項(xiàng)很多,語(yǔ)法也較復(fù)雜。其一般格式為:
SELECT ?[ALL︱DISTINCT] ?*︱<字段列表>
FROM <表名1>[,<表名2>] …
[WHERE <條件表達(dá)式>]
[GROUP BY <字段名> [HAVING <條件表達(dá)式>]]
[ORDER BY <字段名> [ASC︱DESC]];
命令格式中< >、[ ]分別表示必選項(xiàng)和可選項(xiàng);“|”表示其前后任選一項(xiàng)。
該語(yǔ)句從指定的基本表中,創(chuàng)建一個(gè)由指定范圍內(nèi)、滿(mǎn)足條件、按某字段分組、按某字段排序的指定字段組成的新記錄集。其中,ALL 表示檢索所有符號(hào)條件的記錄,默認(rèn)值為ALL;DISTINCT表示檢索要去掉重復(fù)行的所有記錄;*表示檢索結(jié)果包括所有的字段;<字段列表>使用“,”將項(xiàng)分開(kāi),這些項(xiàng)可以是字段、常數(shù)或系統(tǒng)內(nèi)部的函數(shù);FROM子句說(shuō)明要檢索的數(shù)據(jù)來(lái)自哪個(gè)或哪些表,可以對(duì)單個(gè)或多個(gè)表進(jìn)行檢索;WHERE子句說(shuō)明檢索條件,條件表達(dá)式可以是關(guān)系表達(dá)式,也可以是邏輯表達(dá)式;GROUP BY子句用于對(duì)檢索結(jié)果進(jìn)行分組,可以利用它進(jìn)行分組匯總;HAVING必須跟隨GROUP BY使用,它用來(lái)限定分組必須滿(mǎn)足的條件;ORDER BY 子句用來(lái)對(duì)檢索結(jié)果進(jìn)行排序,如果排序時(shí)選擇ASC,表示檢索結(jié)果按某一字段值升序排序,如果選擇DESC,表示檢索結(jié)果按某一字段值降序排列。
例7 查找并顯示醫(yī)生表中的所有字段。
SELECT ?* ?FROM ?醫(yī)生;
例8 查找并顯示醫(yī)生表中“醫(yī)生工號(hào)”“醫(yī)生姓名”“職稱(chēng)”和“是否黨員”4個(gè)字段。
SELECT醫(yī)生工號(hào),醫(yī)生姓名,職稱(chēng),是否黨員FROM 醫(yī)生;
例9查找職稱(chēng)為住院醫(yī)師的醫(yī)生,并顯示“醫(yī)生工號(hào)”,“醫(yī)生姓名”,“最高學(xué)歷”。
SELECT醫(yī)生工號(hào),醫(yī)生姓名,最高學(xué)歷 FROM 醫(yī)生 WHERE 職務(wù)=“住院醫(yī)師”;
例10 統(tǒng)計(jì)職稱(chēng)為主任醫(yī)師的人數(shù),并將計(jì)算字段命名為“主任醫(yī)師人數(shù)”。
SELECT COUNT(*) AS主任醫(yī)師人數(shù)FROM 醫(yī)生 GROUP BY 職稱(chēng) HAVING職稱(chēng)=“住院醫(yī)師”;
其中,AS子句后定義的是新字段名。
例11在處方明細(xì)表和藥品表檢索處方里哪些藥品,檢索結(jié)果按藥品編號(hào)升序排序。
SELECT DISTINCT 處方明細(xì).藥品編號(hào), 藥品.藥品名稱(chēng) FROM 處方明細(xì), 藥品
WHERE 處方明細(xì).藥品編號(hào)=藥品.藥品編號(hào) ORDER BY 處方明細(xì).藥品編號(hào);
在處方明細(xì)表中,同一藥品可以出現(xiàn)在多張?zhí)幏街?。這種藥品只顯示一次即可,所以加上唯一值的設(shè)置(DISTINCT)。
例12從“醫(yī)生”、“處方”兩個(gè)表中查詢(xún)每個(gè)處方的處方號(hào)、病人ID、醫(yī)生姓名、臨床診斷。
SELECT 處方.處方號(hào), 處方.病人ID, 醫(yī)生.醫(yī)生姓名, 處方.臨床診斷
FROM 醫(yī)生 INNER JOIN 處方 ON 醫(yī)生.醫(yī)生工號(hào) = 處方.醫(yī)生工號(hào);
當(dāng)查詢(xún)涉及兩個(gè)以上的表時(shí),該查詢(xún)稱(chēng)為連接查詢(xún)。
以2個(gè)表為例的命令格式為:
SELECT ?<字段列表> ?FROM <表名1> INNER JOIN <表名2> ?ON <連接條件>;
或
SELECT ?<字段列表> FROM <表名1> ,<表名2> ?WHERE ?<連接條件>
拓展到以3個(gè)表為例的命令格式為:
SELECT ?<字段列表> ?FROM <表名1> INNER JOIN (<表名2> INNER JOIN <表名3> ON<連接條件2>) ?ON <連接條件1>;
或
SELECT ?<字段列表> ?FROM <表名1> ,<表名2>,<表名3> WHERE <連接條件1> AND <連接條件2>;
例13從“醫(yī)生”“處方”兩個(gè)表中查詢(xún)每個(gè)處方的處方號(hào)、病人ID、醫(yī)生姓名、臨床診斷。
SELECT 處方.處方號(hào), 處方.病人ID, 病人.病人姓名, 醫(yī)生.醫(yī)生姓名, 處方.臨床診斷
FROM 醫(yī)生 INNER JOIN (病人 INNER JOIN 處方 ON 病人.病人ID = 處方.病人ID)
ON 醫(yī)生.醫(yī)生工號(hào) = 處方.醫(yī)生工號(hào);
在數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)中SQL語(yǔ)言應(yīng)用廣泛,并且有些查詢(xún)只能通過(guò)編寫(xiě)SQL語(yǔ)句實(shí)現(xiàn),掌握SQL語(yǔ)句非常重要。而通過(guò)在實(shí)際數(shù)據(jù)庫(kù)中設(shè)計(jì)實(shí)例并運(yùn)行相應(yīng)的命令是SQL語(yǔ)句的掌握的最佳途徑。
參考文獻(xiàn):
[1] 朱燁 張敏輝.數(shù)據(jù)庫(kù)技術(shù)原理與設(shè)計(jì)[M].北京:高等教育出版社,2017.
[2] 王軍委.Access數(shù)據(jù)庫(kù)應(yīng)用基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2014.
【通聯(lián)編輯:梁書(shū)】