SQL查询语句.docx
《SQL查询语句.docx》由会员分享,可在线阅读,更多相关《SQL查询语句.docx(12页珍藏版)》请在冰豆网上搜索。
SQL查询语句
SQL查询语句基础
DataTrans-1500服务器是用SQLServer服务器作数据的底层管理,当用户对DataTrans-1500服务器进行查询时,服务器通过mand命令文件以及.from检索途径对象来构造SQL查询语句,通过此SQL查询语句来对SQLServer服务器发起检索。
DataTrans-1500服务器的系统管理员,了解、掌握SQL查询语句的语法,能更好的作好二次开发。
鉴于DataTrans-1500服务器系统管理员所作的二次开发只与查询语句有关,本章只介绍SQL查询语句中与SELECT语句有关的一些基础知识,以方便广大不熟悉SQL查询语言的DataTrans-1500服务器系统管理员。
有关SQL语言更详细的知识请查阅有关手册。
SQL (StructQueryLanguage)即结构化查询语言,它是使用关系模型的数据库应用语言,由IBM在70年代开发出来。
现在SQL结构化查询语言已经成为一个工业标准,几乎所有的数据库都支持它的查询,SQLServer更是如此。
SQLServer服务器中,用SELECT语句实现数据库的查询操作。
同时,它可以使用各种子句对查询结果进行分组统计、合计、排序等操作。
SELECT语句还可将查询结果生成另一个表(临时表或永久表)。
SELECT语句的语法格式为:
SELECT[ALL|DISTINCT]select_list
[INTO[new_table_name>
[FROM{table_name|view_name}[(optimizer_hints)]
<,{table_name2|view_name2}[(optimizer_hints)]
[…,{table_name16|view_name16}[(optimizer_hints)>]
[WHEREclouse]
[GROUPBYclause]
[HAVINGclause]
[ORDERBYclause]
[COMPUTEclause]
[FORbrowse]
以上格式中,“[]”括的项表示可选项,大写的词为关键字,小写的词表示不确定的实体名称。
除第一行外,每一行为一个子句,在SELECT中子句可以省略,但在列出时,必须按照以上顺序。
11.1简单查询语句
简单的SQL查询只包括SELECT子句、FROM子句和WHERE子句,它们分别说明查询列、要查询的表和搜索条件。
例如:
SELECTkeys,fields
FROMkeys
WHEREfrmin(‘200*a’)
以上SELECT语句查询keys表中frm字段为‘200*a’的记录的keys和fields字段。
其查询结果可能为:
keysmarc_id
-----------------------------------------------------------------
王德树0000000001
贺鸣0000000001
郭宏雨0000000002
郭宏雨0000000002
(4row(s)affected)
11.1.1SELECT条件列表
1>显示keys表中所有列的内容
SELECT*FROMkeys
将对keys表中每个字段的值进行显示。
2>按顺序显示指定列
SELECTmarc_id,fileds,keysFROMkeys
在SELECT列表中指定列名来选择不同的列,个列之间用逗号分开,结果的显示顺序为SELECT列表中字段的排列顺序。
3>更改列标题
SELECTkeys,记录号=marc_idFROMkeys
或SELECTkeys,marc_id记录号FROMkeys
或SELECTkeys,marc_idas记录号FROMkeys
执行结果为:
keys记录号
-----------------------------------------------------------------
王德树0000000001
贺鸣0000000001
郭宏雨0000000002
郭宏雨0000000002
(4row(s)affected)
在SELECT语句中可以为选择列指定列标题,其格式为:
列标题=列名
或:
列名列标题
4>删除重复行
SELECT语句中可以使用ALL|DISTINCT选项来显示所有行(ALL)或删除重复的行(DISTINCT),缺省为ALL,即不去重。
在前面的例子中将查语句换为:
SELECTDISTINCTkeys,marc_idFROMkeys
查询结果为:
keysmarc_id
-----------------------------------------------------------------
王德树0000000001
贺鸣0000000001
郭宏雨0000000002
(3row(s)affected)
11.1.2FROM子句
FROM子句指定SELECT语句查询及与查询相关的表或视图。
在FROM子句中最多可指定16个表或视图,它们相互之间用逗号分开,如果这些表属于不同的数据库,可用‘数据库.所有者名称.对象’格式加以限定。
在缺省情况下,FROM子句不指定数据库名称,查询的数据库为当前数据库。
11.1.3WHERE子句
SELECT语句中的WHERE子句用来指定查询条件。
WHERE子句中包含各种查询条件,如下表:
运算符分类
运算符
意义
比较运算符
>>=<<==<>!
>!
<
大小比较
BETWEEN…AND…
NOTBETWEEN…AND…
IN
NOTIN
LIKE
NOTLIKE
ISNULL
NOTISNULL
AND
OR
NOT
在DataTrans-1500服务器的检索途径对象配置文件中,经常用到的条件运算符是:
列表运算符IN和模式匹配符LIKE。
列表运算符IN
列表运算符的格式为:
表达式[NOT]IN(列表项1,列表项2,列表项3…)
它要求查询时表达式的值(不)在列表内。
例如:
SELECTkeysFROMkeysWHEREfrmIN(‘200*a’,’201*b’)
表示要查询的keys来源必须在(‘200*a’,’201*b’)中,即frm字段值为’200*a’或’201*b’。
模式匹配符LIKE
模式匹配符[NOT]LIKE常用于模糊查询,它判断列值是否与指定的字符串格式匹配。
在SQLServer中可使用的匹配符有以下几种:
百分号(%):
可匹配任意类型和长度的字符。
下划线(_):
匹配单个任意字符。
方括号[]:
指定一个字符、字符串或范围,要求所匹配对象为它们中的任何一个。
[^]:
与[]取值相同,但要求所匹配的对象为指定范围以外的任何一个字符。
例如下面的语句利用通配符%来查找以“王”开头的字符串:
SELECTkeysFROMkeysWHEREkeysLIKE‘赵%’
查询结果为:
keys
-----------------------------------------------------------------
赵宝山
赵成和
赵并林
(3row(s)affected)
11.2用GROUPBY子句进行统计
GROUPBY子句的语法格式为:
GROUPBY[ALL]aggregate_free_expression
[,aggregate_free_expression]
在SELECT语句中,GROUPBY子句和集合函数对数据库进行分组统计,在查询结果中,每一组统计出一个结果。
例如:
selectfieldsaskeystring,
COUNT(fields)ashitcount
fromkeyswhere
(keyslike‘%德‘)
and
frmlike‘200*a‘
GROUPBYfields
执行的结果为:
keystringhitcount
李祖德1
桑关德1
张京德1
张冲德1
(4row(s)affected)
在上面的例子中,GROUPBY子句和集合函数COUNT按照fields字段对keys表进行分组统计。
集合函数COUNT对每一组的行数进行计算,分组的标准是GROUPBY中定义的字段fields。
11.3INTO子句用查询结果创建新表
SELECT语句中使用INTO选项可以将查询结果写进新表,新表结构与SELECT语句选择列表中的字段相同。
例如:
selectfieldsaskeystring,
COUNT(fields)ashitcount
into#temp/*into*/
fromenglishbooks..keyswhere
(keyslike‘%鲁迅%‘)
and
frmlike‘24_*a‘
and(
(marc_id>=‘0000000001‘andmarc_id<=‘9999999999‘)
)
GROUPBYfields
通过子句into#tempSQLServer将SELECT查询结果和COUNT的统计结果写入临时表temp中,临时表temp结构包含keystring和hitcount两个字段。
在以后用到这些信息时,就可以从temp表中读取。
11.4使用UNION运算符实现多查询联合
UNION运算符可以将两个或两个以上的查询结果合并成一个结果集合显示。
UNION运算符的语法格式为:
查询1[UNION[ALL]查询n]…
[ORDERBY子句]
[COMPUTE子句]
查询1的格式为:
SELECTselect_list
[INTO子句]
[FROM子句]
[WHERE子句]
[GROUPBY子句]
[HAVING子句]
查询n的格式为:
SELECTselect_list
[FROM子句]
[WHERE子句]
[GROUPBY子句]
[HAVING子句]
查询1与查询不同之处在于查询1多了一个用来指定新表的INTO子句,通过UNION子句句查询n的结果也将写进查询中INTO运算符定义的新表中。
在使用UNION子句时,应保证每个查询语句的选择列表中有相同数量的表达式,并且每个查询选择列表中的对应表达式应具有相同或可以自动转换成相同的数据类型。
缺省情况下,UNION运算符将删除不同查询语句中行值相同的行,如果要保留这些相同的行,应使用ALL选项。
11.5.from文件和mand文件构造SQL查询语句
在DataTrans-1500服务器的检索途径对象.from文件中的每个section小节都是一个用来构造SQL查询语句的模板。
而且每个小节都有一个/*into*/,/*into*/是INTO子句的插入标志。
在进行多库或多途径查询时,最后只有一个结果集,DataTrans-1500服务器只插入了一个INTO子句。
之所以为.from文件的每个section小节都加了一个/*into*/标志,是因为无法确定哪个小节首先被匹配,每个小节都有可能是第一个被匹配的。
而最后的结果是,只有第一个被匹配的小节中的/*into*/标志是起作用的。
要在/*into*/处插入的INTO运算符被定义在mand文件中的union-into-phrase字段中。
下面一段源文件在mand中对titlenumber结果集的定义:
definition="_TITLEvarchar(255),_HITCOUNTint"
union-into-phrase="into#temp"
segment-phrase="and(%@segment(\"[%[defaultsqldb]%/%[keys]%/%[recordid]%]\")%)"
after-union="selecttop50000keystring,SUM(hitcount)ashitnumberinto%temptablename%from#tempgroupbykeystringorderbykeystringdroptable#tempcreateclusteredindexkeyindexon%temptablename%(keystring)"
statis="selectCOUNT(*)astotalkey,SUM(hitnumber)astotalrecfrom%temptablename%"
catch-key-parameter-name="recordset,word,link,match,from,fromtitle"
order-phrase="orderbykeystring"
>
在DataTrans-1500服务器中对所有库发起一次全途径检索,由mand文件和若干个.from文件构造的SQL查询语句如下所示。
/*******************************************************/
/*首次检索key+count(多检索词)*/
selectfieldsaskeystring,
COUNT(fields)ashitcount
into#temp/*into*/
fromenglishbooks..keyswhere
(keyslike‘%‘)
and
frmlike‘24_*a‘
and(
(marc_id>=‘0000000001‘andmarc_id<=‘9999999999‘)
)
GROUPBYfields
UNIONALL
/*******************************************************/
/*首次检索key+count(多检索词)*/
selecttop50000fieldsaskeystring,
COUNT(fields)ashitcount
/*into*/
from出版社..keyswhere
(keyslike‘%‘)
and
frm=‘101*a‘
GROUPBYfields
UNIONALL
/*******************************************************/
/*首次检索key+count(多检索词)*/
selecttop50000fieldsaskeystring,
COUNT(fields)ashitcount
/*into*/
fromdt1500sqldb2..keyswhere
(keyslike‘%‘)
and
frmin(‘200*a‘)
and(
(marc_id>=‘0000000001‘andmarc_id<=‘9999999999‘)
)
GROUPBYfields
UNIONALL
/*******************************************************/
/*首次检索key+count(多检索词)*/
selectfieldsaskeystring,
COUNT(fields)ashitcount
/*into*/
fromdt1500sqldb1..keyswhere
(keyslike‘%‘)
and
frmin(‘200*a‘)
and(
(marc_id>=‘0000001393‘andmarc_id<=‘0000001395‘)
)
GROUPBYfields
UNIONALL
/*******************************************************/
/*首次检索key+count(多检索词)*/
selecttop50000fieldsaskeystring,
COUNT(fields)ashitcount
/*into*/
fromxidan..keyswhere
(keyslike‘%‘)
and
frm=‘200*a‘
and(
1=2
)
GROUPBYfields
selecttop50000keystring,SUM(hitcount)ashitnumberintorecordset..srch00a567801from#tempgroupbykeystringorderbykeystringdroptable#tempcreateclusteredindexkeyindexonrecordset..srch00a567801(keystring)