sql维护手册第05章 TransactSQL的使用Word文档下载推荐.docx
《sql维护手册第05章 TransactSQL的使用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《sql维护手册第05章 TransactSQL的使用Word文档下载推荐.docx(18页珍藏版)》请在冰点文库上搜索。
![sql维护手册第05章 TransactSQL的使用Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/344c5860-64b5-4b77-abde-69d473695bc9/344c5860-64b5-4b77-abde-69d473695bc91.gif)
[GROUPBYgroup_by_expression]
[WAVINGsearch_condition]
[ORDERBYorder_expression[ASC|DESC]]
FROM子句用于指明查询表格的名称,select_list为要求返回字段名称列表,new_table_是用查询结果创建新表格的名称,table_source为待查询的表格或者视图的名称,WHERE子句中的sea-rch_condition是限制查询范围的条件,group_by_expression指明将查询结果按照该表达式分组返回,HAVING子句中的search_condition是用于限制查询结果的范围的条件(与WHERE子句的条件用法不同),ORDERBY的表达式用于指明查询结果按照何种顺序返回。
下面我们一步一步讲解。
5.1.3 SELECTselect_listFROMtable_source
FROM子句用于指明查询表格的名称。
我们用his数据库中的表m_PatientInfo作例子。
先可以看一下m_PatientInfo表结构:
病人基本信息表(m_PatientInfo)
序号
字段名
字段描述
数据类型
长度
是否为空
默认值
1
MzID
门诊号
Varchar
18
Notnull
2
IdNum
证件号
17
3
BxTypeID
病人保险类型编码
Char
‘0’
4
EnterpriseID
单位编码
10
5
PersonID
身份证号
15
6
Name
姓名
12
7
Sex
性别
Bit
8
Profession
职业
9
Birthdate
出生日期
Datetime
Address
地址
40
11
Marry
婚否
TeleNum
电话
16
13
BirthAddr
籍贯
14
ZtID
职退情况编码
LzDate
领证日期
ParkFlag
停用标志
BjID
保健情况编码
‘2’
FixID
病人定点情况编码
19
SBDate
上报日期
20
PatiCatiID
病人类型编码
21
InCode
助记符
VarChar
⏹执行语句为SELECT*FROMm_PatientInfo。
(查询门诊病人基本信息表中的所有数据,即查询所有门诊病人信息。
*表示所有数据)。
在QueryAnalyzer中执行的结果如下图所示:
(图5-3)
⏹SELECT后的select_list用于指明查询返回的字端名称。
例二:
指明查询字段。
执行语句为SELECTnameFROMm_PatientInfo。
(查询门诊病人基本信息表中的name字段数据,即查询所有门诊病人的姓名)在QueryAnalyzer中执行的结果如下图所示:
(图5-4)
(Select_list指明查询返回的字段名称。
这些字段名称是在FROM子句中的表格或者视图中定义的。
查询的结果是按照Select_list指定的顺序返回的。
一般需要按照以下格式指定字段名称“table_name|view_nametable_alias.*”。
其中table_name、view_name或者table_alias是在FROM子句中指明的表格或者视图的名称。
FROM中指定表格或者视图名称,除非在select_list中指定的全都是常量,否则必须指明表格或者视图名称。
)
5.1.4 WHERE子句
WHERE子句中的search_condition是限制查询范围的条件。
下面所示的是WHERE子句中使用比较运算符的语法:
SELECTcolumn_name_1,…column_name_n
FROMtable_name_1,…table_name_n
WHEREcolumn_namecomparison_operatorvalue
(其中column_name_n为查询的字段名称
table_name_n为查询的表格或者视图名称
comparison_operatorvalue为比较运算符)
⏹执行带有比较运算的WHERE子句的查询结果如下图所示,执行的语句为SELECT*FROMm_PatientInfoWHEREmzid=10002000。
(查询门诊号为10002000的病人信息):
(图5-5)
(在WHERE子句的语法中允许在表列的名称之后和列值之前使用比较运算符。
以下运算符可以用:
“=”(等于)、“!
=”(不等于)“<
>
”(不等于)、“<
”(小于)、“>
”(大于)、“<
=”(小于等于)、“>
=”(大于等于)和LIKE(等于值段)。
比较运算返回一个值为布尔类型的值,如果某个记录的该比较运算返回值为真,则查询会返回该记录,如果相反,那么查询返回的记录集合中不会包括该记录。
5.1.5 LIKE关键字
⏹在QueryAnalyzer中执行带有LIKE“_”比较运算的WHERE子句的查询语句结果如下图所示,执行语句的实例为:
SELECT*FROMm_PatientInfoWHEREnameLIKE'
w%'
。
(查询门诊病人中名字以w开头的病人信息)(图5-6)
(图5-6)
(使用比较运算符LIKE。
这个比较运算符是一个关键字而不是一个或者两个符号。
LIKE关键字后面跟一个值段而不是一个完整的列值。
在LIKE中使用的通配符有百分号“%”,用来匹配紧跟着该百分号之前的字符的任意长度。
在LIKE中使用下划线“_”可以用来匹配长度唯一的任意字符。
方括号“[]”可以用来匹配方括号内指定值段中的任意一个字符。
在“[]”中使用“^”符号可以匹配不在所列出的值段内的字符。
5.1.6 布尔条件运算符
使用带有布尔条件运算符连接多个条件表达式的WHERE子句的SELECT语句的句法如下图所示:
Boolean_operatorcolumn_namecomparisonoperator
comparison_operatorvalue为比较运算符
Boolean_operator为布尔运算符)
⏹在QueryAnalyzer中执行带有由AND运算符连接的WHERE子句的SELECT语句,结果如下图。
执行的实例为:
select*fromm_PatientInfowhereBirthdate>
1986-01-01andsex=0。
(查询门诊病人中1986年1月1日以后出生的男病人)(图5-7)
(图5-7)
(在SELE-CT语句中可以使用布尔运算符来组合WHERE子句中的多个限制条件。
也即有多个布尔条件表达式组合构成一个新的布尔条件表达式。
凡是满足组合的条件表达式的纪录才能被查询检索到。
使用布尔运算符组合条件表达式可以帮助我们描述更为复杂的检索条件,以达到更加特定的目的。
⏹OR即“或”运算符,在OR连接条件表达式之间只要满足一个或者一个以上,该组合表达式即为真。
⏹AND即“与”运算符,是在AND连接的条件表达式必须同时满足才为真,否则组合表达式为假。
⏹NOT即“取非”运算符,它表示对NOT之后的条件表达式进行取非操作。
如果原条件表达式为真,取非后为假;
如果原条件表达式为假,取非后为真。
⏹BETWEEN可以用来设定选择值的范围。
尽管可以在WHERE子句中使用多个OR来指定选择多个行,但在T-SQL语句中还可以用BETWEEN关键字和AND一起来指定一个要检索的列值范围。
⏹IN操作符可以指定选定行的值所在的集合。
它往往也是非常灵活和有用的。
5.1.7 ORDERBY子句
数据库中的数据存储一般是无序的。
如果需要SELECT语句返回的查询结果是按照一定的顺序排列的,可以使用ORDERBY子句。
带有ORDERBY子句的SELECT语句的句法如下图所示:
ORDERBYcol_1…col_n[DESC|ASC]
col_n为排序的字段名称
DESC查询结果按降序排列
ASC查询结果按升序排列)
⏹在QueryAnalyzer中执行带ORDERBY子句的SELECT语句。
执行实例为:
select*fromm_PatientInfoorderbymzid。
(门诊病人按门诊号排序)(图5-8)
(图5-8)
在ORDERBY子句中需要指定按照哪个字段值的顺序来排列查询结果。
可以使用字段名称或者字段别名(可以通过限制在指定的表格或者视图中)来指定字段,也可以是代表字段在SELECT语句中的字段列表位置的表达式或者非负整数。
可以在ORDERBY中使用多个字段来排序。
查询结果会按照这些字段在ORDERBY的排列顺序依次对查询结果进行排序。
ORDERBY子句中还可以包括并未在SELECT语句中列出的表格中的字段名称。
但是,如果在SELECT语句中有DISTINCT限制或者SELECT语句中有UNION操作,排序的字段名称必须在SELECT语句中的字段列表中列出。
ORDERBY缺省按照升序排列。
也可以用DESC指明查询结果按照降序排列。
使用DISTINCT关键字用于限制查询结果中该字段内的值不重复。
即若有多个纪录内该字段值相同,则只返回其中的第一个纪录。
⏹在QueryAnalyzer中执行带有多个字段排序的ORDERBY子句的SELECT语句。
select*fromm_PatientInfoorderbysex,birthdate。
(先对sex排序,如值相同,再birthdate排序,即先把男病人从小到大排列,再把女病人从小到大排列)(图5-9)
(图5-9)
⏹执行带有ORDERBY子句的SELECT语句,其中排序字段用整数表示。
SELECTmzid,name,address,birthdateFROMm_PatientInfoORDERBY4DESC,1。
(查询门诊病人的门诊号、姓名、住址、出生日期,先按出生日期降序排序,如出生日期相同则按门诊号升序排序,birthdate在第四个,mzid在第一个,故4表示birthdate,1表示mzid)(图5-10)
(图5-10)
⏹在QueryAnalyzer中执行带有DISTINCT关键字的SELECT语句,结果如下图。
SELECTDISTINCTbirthdateFROMm_PatientInfoORDERBYbirthdateDESC。
(查询病人出生日期,如果有多个病人的出生日期相同,则只返回第一个病人的出生日期,即如果有两个病人都是1986年1月1日出生,则只列出一个1986-01-01)(图5-11)
(图5-11)
5.1.8 GROUPBY子句
GROUPBY子句可以将表格中的纪录分组返回。
同一组中的多个纪录在指定的字段中具有相同的值。
GROUPBY子句中应包括以下部分:
一个或者多个不带有T-SQL中集成函数的分组表达式。
这些表达式通常都会引用分组的字段。
关键字ALL是可选项。
它指明所有由GROUPBY产生的分组都要返回。
即使是返回的分组中没有一个纪录符合WHERE子句的限制条件。
CUBE或者ROLLUP。
另外,HAVING子句通常也与GROUPBY联合使用,尽管HAVING子句可以单独使用。
在GROUPBY子句中必须使用表格或者视图字段的名称,而不能使用由AS子句定义的字段别名。
在GROUPBY中可以使用多个字段进行分组。
这样,SELECT语句会对GROUPBY进行嵌套。
也就是说您可以使用任何字段组合来对查询结果分组。
CUBE和ROLLUP关键字都是要求在分组返回查询结果时,返回显示总体信息。
CUBE是返回一个概括信息。
ROLLUP是对分组嵌套中的每一层都显示概括信息。
HAVING子句用来确定SELECT语句显示的分组。
T-SQL中最基本的带有GROUPBY分组表达式的SELECT语句的句法如下图所示:
GROUPBY[ALL]group_by_expression[,…n]
[WITH{CUBE|ROLLUP}]
(其中select_list为字段列表
table_source为表格或者视图名称
all指明显示所有的分组记录
group_by_expression为分组表达式
cube|rollup显示概括信息)
我们用表RevSub作例子,先看一下表RevSub的结构。
收费发生子表(RevSub)
InvoiceID
处方流水号
varchar
RowNum
行号
int
DFFlag
药品,费用标志
smallint
DFCode
药品,费用编码
DepCode
收费科别
Quan
数量
Real
Price
单价
Money
TPrice
金额
RevPrice
实收金额
RevKeepPrice
实收记忆(帐)部分
LimitUsed
本项目耗费定额数
PayRatio
自付比例(0-1)
TallyMainRatio
主记帐比例(0-1)
TallySubRatio
子记帐比例(0-1)
InvID
出库库房
OutQuan
已取数量
OutDate
出库日期
UnitDes
界面单位(药品)
Factor
换算系数
float
Status
退费标志
TinyInt
⏹执行SELECT*FROMRevSub的返回结果如下图:
(图5-12)
⏹执行带有GROUPBY子句的SELECT语句结果如下图所示,执行的实例为:
SELECTDepCode,sum(RevPrice)FROMRevSubGROUPBYDepCode。
(这个查询的目的是把各科室的实际收入汇总。
RevSub是病人费用子表,DepCode是RevSub表中收费科别字段,RevPrice是RevSub表中实际收费字段,SUM是求和函数,SUM(RevPrice)表示对RevPrice字段求和,GROUPBYDepCode表示对DepCode分组)(图5-13)
(图5-13)
⏹在QueryAnalyzer中执行带有GROUPBY子句的SELECT语句结果如下图所示。
SELECTDepCode,SUM(RevPrice)'
SUM'
COUNT(DepCode)'
COUNT'
FROMRevSubGROUPBYDepCode。
(COUNT是一个集合函数,它返回的整数代表表达式中(通常是一列)值的个数。
'
和'
使在返回的结果中加入字段名)(图5-14)
(图5-14)
5.1.9 HAVING子句
HAVING子句可以对进行分组的数据进行限制。
HAVING是与SELECT...GROUPBY语句一起使用的分组搜索条件(通常使用集合函数)。
它与WHERE语句很相似。
SELECTDepCode,SUM(RevPrice),COUNT(depcode)FROMRevSubGROUPBYDepCodeHAVINGSUM(RevPrice)>
100。
(列出收入大于100的科室。
count(depcode)表示depcode数目)(图5-15)
(图5-15)
5.1.10 关键字CUBE和ROLLUP
⏹执行有关键字CUBE的GROUPBY子句的SELECT语句,结果如下图所示。
SELECTDepCode,sum(RevPrice)FROMRevSubGROUPBYDepCodeWITHCUBE。
(最后一行是汇总数)(图5-16)
(图5-16)
5.1.11 子查询
子查询是在SELECT、INSERT、UPDATE、DELETE语句或者其他子查询中嵌套的SELECT查询语句,返回一个值。
子查询能够在任何允许表达式出现的地方出现。
子查询通常被称作内部查询或者内选择。
相对的,包含子查询的查询语句被称作外部查询或者外部选择。
在SELECT语句中嵌套其他查询语句,子查询由以下部分组成:
一个基本的SELECT查询语句包括字段列表。
一个基本的FROM子句用于指明子查询的表格或者视图名称。
执行SELECT子查询语句结果如下图。
语句为:
selectInvoiceID,InvoiceID,TPricefromRevSubwhereQuan<
(selectavg(Quan)fromRevSubwhereRowNum='
1'
)(图5-17)
(图5-17)