SQL查询语句基础 |
DataTrans-1500服务器是用SQL Server服务器作数据的底层管理,当用户对DataTrans-1500服务器进行查询时,服务器通过searchmand命令文件以及.from检索途径对象来构造SQL查询语句,通过此SQL 查询语句来对SQL Server服务器发起检索。 DataTrans-1500服务器的系统管理员,了解、掌握SQL查询语句的语法,能更好的作好二次开发。鉴于DataTrans-1500服务器系统管理员所作的二次开发只与查询语句有关,本章只介绍SQL查询语句中与SELECT语句有关的一些基础知识,以方便广大不熟悉SQL查询语言的DataTrans-1500服务器系统管理员。有关SQL语言更详细的知识请查阅有关手册。 SQL (Struct Query Language)即结构化查询语言,它是使用关系模型的数据库应用语言,由IBM在70年代开发出来。现在SQL结构化查询语言已经成为一个工业标准,几乎所有的数据库都支持它的查询,SQL Server更是如此。 SQL Server服务器中,用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)>] [WHERE clouse] [GROUP BY clause] [HAVING clause] [ORDER BY clause] [COMPUTE clause] [FOR browse] 以上格式中,“[]”括的项表示可选项,大写的词为关键字,小写的词表示不确定的实体名称。除第一行外,每一行为一个子句,在SELECT中子句可以省略,但在列出时,必须按照以上顺序。 11.1简单查询语句 简单的SQL查询只包括SELECT子句、FROM子句和WHERE子句,它们分别说明查询列、要查询的表和搜索条件。 例如: SELECT keys,fields FROM keys WHERE frm in (‘200*a’) 以上SELECT语句查询keys表中frm字段为‘200*a’的记录的keys和fields字段。 其查询结果可能为: keys marc_id ----------------------------------------------------------------- 王德树 0000000001 贺鸣 0000000001 郭宏雨 0000000002 郭宏雨 0000000002 (4 row(s) affected) 11.1.1 SELECT 条件列表 1> 显示keys表中所有列的内容 SELECT * FROM keys 将对keys表中每个字段的值进行显示。 2> 按顺序显示指定列 SELECT marc_id,fileds,keys FROM keys 在SELECT 列表中指定列名来选择不同的列,个列之间用逗号分开,结果的显示顺序为SELECT列表中字段的排列顺序。 3> 更改列标题 SELECT keys ,记录号=marc_id FROM keys 或 SELECT keys,marc_id 记录号 FROM keys 或 SELECT keys,marc_id as 记录号 FROM keys 执行结果为: keys 记录号 ----------------------------------------------------------------- 王德树 0000000001 贺鸣 0000000001 郭宏雨 0000000002 郭宏雨 0000000002 (4 row(s) affected) 在SELECT语句中可以为选择列指定列标题,其格式为: 列标题=列名 或: 列名 列标题 4>删除重复行 SELECT语句中可以使用ALL|DISTINCT选项来显示所有行(ALL)或删除重复的行(DISTINCT),缺省为ALL,即不去重。 在前面的例子中将查语句换为: SELECT DISTINCT keys,marc_id FROM keys 查询结果为: keys marc_id ----------------------------------------------------------------- 王德树 0000000001 贺鸣 0000000001 郭宏雨 0000000002 (3 row(s) affected) 11.1.2 FROM子句 FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定16个表或视图,它们相互之间用逗号分开,如果这些表属于不同的数据库,可用‘数据库.所有者名称.对象’格式加以限定。在缺省情况下,FROM子句不指定数据库名称,查询的数据库为当前数据库。 11.1.3 WHERE子句 SELECT 语句中的WHERE子句用来指定查询条件。 WHERE子句中包含各种查询条件,如下表: 运算符分类 运算符 意义 比较运算符 > >= < <= = <> !> !< 大小比较 BETWEEN…AND… NOT BETWEEN…AND… IN NOT IN LIKE NOT LIKE IS NULL NOT IS NULL AND OR NOT 在DataTrans-1500服务器的检索途径对象配置文件中,经常用到的条件运算符是:列表运算符IN和模式匹配符LIKE。 列表运算符IN 列表运算符的格式为: 表达式 [NOT] IN (列表项1,列表项2,列表项3…) 它要求查询时表达式的值(不)在列表内。例如: SELECT keys FROM keys WHERE frm IN (‘200*a’,’201*b’) 表示要查询的keys来源必须在(‘200*a’,’201*b’)中,即frm字段值为’200*a’或’201*b’。 模式匹配符 LIKE 模式匹配符[NOT] LIKE 常用于模糊查询,它判断列值是否与指定的字符串格式匹配。在SQL Server中可使用的匹配符有以下几种: 百分号(%):可匹配任意类型和长度的字符。 下划线(_):匹配单个任意字符。 方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任何一个。 sql语句查询不包含[^]:与[]取值相同,但要求所匹配的对象为指定范围以外的任何一个字符。 例如下面的语句利用通配符%来查以“王”开头的字符串: SELECT keys FROM keys WHERE keys LIKE ‘赵%’ 查询结果为: keys ----------------------------------------------------------------- 赵宝山 赵成和 赵并林 (3 row(s) affected) 11.2 用GROUP BY子句进行统计 GROUP BY 子句的语法格式为: GROUP BY [ALL] aggregate_free_expression [, aggregate_free_expression] 在SELECT 语句中,GROUP BY子句和集合函数对数据库进行分组统计,在查询结果中,每一组统计出一个结果。例如: select fields as keystring, COUNT(fields) as hitcount from keys where ( keys like '%德' ) and frm like '200*a' GROUP BY fields 执行的结果为: keystring hitcount 李祖德 1 桑关德 1 张京德 1 张冲德 1 (4 row(s) affected) 在上面的例子中,GROUP BY子句和集合函数COUNT按照fields字段对keys表进行分组统计。集合函数COUNT对每一组的行数进行计算,分组的标准是GROUP BY中定义的字段 fields。 11.3 INTO子句用查询结果创建新表 SELECT语句中使用INTO选项可以将查询结果写进新表,新表结构与SELECT语句选择列表中的字段相同。例如: select fields as keystring, COUNT(fields) as hitcount into #temp/*into*/ from englishbooks..keys where ( keys like '%鲁迅%' ) and frm like '24_*a' and ( ( marc_id >= '0000000001' and marc_id <= '9999999999' ) ) GROUP BY fields 通过子句into #temp SQL Server将SELECT查询结果和COUNT的统计结果写入临时表temp中,临时表temp结构包含keystring和hitcount两个字段。在以后用到这些信息时,就可以从temp表中读取。 11.4 使用UNION运算符实现多查询联合 UNION运算符可以将两个或两个以上的查询结果合并成一个结果集合显示。UNION运算符的语法格式为: 查询1 [UNION [ALL] 查询n]… [ORDER BY 子句] [COMPUTE 子句] 查询1的格式为: SELECT select_list [INTO子句] [FROM子句] [WHERE子句] [GROUP BY 子句] [HAVING 子句] 查询n 的格式为: SELECT select_list [FROM子句] [WHERE子句] [GROUP BY 子句] [HAVING 子句] 查询1与查询不同之处在于查询1多了一个用来指定新表的INTO子句,通过UNION子句句查询n的结果也将写进查询中INTO运算符定义的新表中。 在使用UNION子句时,应保证每个查询语句的选择列表中有相同数量的表达式,并且每个查询选择列表中的对应表达式应具有相同或可以自动转换成相同的数据类型。 缺省情况下,UNION运算符将删除不同查询语句中行值相同的行,如果要保留这些相同的行,应使用ALL选项。 11.5 .from文件和searchmand文件构造SQL查询语句 在DataTrans-1500服务器的检索途径对象.from文件中的每个section小节都是一个用来构造SQL查询语句的模板。而且每个小节都有一个/*into*/,/*into*/是INTO子句的插入标志。在进行多库或多途径查询时,最后只有一个结果集,DataTrans-1500服务器只插入了一个INTO子句。之所以为.from文件的每个section小节都加了一个/*into*/标志,是因为无法确定哪个小节首先被匹配,每个小节都有可能是第一个被匹配的。而最后的结果是,只有第一个被匹配的小节中的/*into*/标志是起作用的。 要在/*into*/处插入的INTO运算符被定义在searchmand文件中的union-into-phrase字段中。下面一段源文件在searchmand中对titlenumber结果集的定义: <recordset name=titlenumber definition = "_TITLE varchar(255), _HITCOUNT int" union-into-phrase = "into #temp" segment-phrase = "and ( %@segment(\"[%[defaultsqldb]%/%[keys]%/%[recordid]%]\")%)" after-union = "select top 50000 keystring, SUM (hitcount) as hitnumber into %temptablename% from #temp group by keystring order by keystring drop table #temp create clustered index keyindex on %temptablename% (keystring)" statis = "select COUNT(*) as totalkey , SUM(hitnumber) as totalrec from %temptablename%" catch-key-parameter-name = "recordset,word,link,match,from,fromtitle" order-phrase = "order by keystring" > 在DataTrans-1500服务器中对所有库发起一次全途径检索,由searchmand文件和若干个.from文件构造的SQL查询语句如下所示。 /*******************************************************/ /* 首次检索 key + count (多检索词) */ select fields as keystring, COUNT(fields) as hitcount into #temp/*into*/ from englishbooks..keys where ( keys like '%' ) and frm like '24_*a' and ( ( marc_id >= '0000000001' and marc_id <= '9999999999' ) ) GROUP BY fields UNION ALL /*******************************************************/ /* 首次检索 key + count (多检索词) */ select top 50000 fields as keystring, COUNT(fields) as hitcount /*into*/ from 出版社..keys where ( keys like '%' ) and frm = '101*a' GROUP BY fields UNION ALL /*******************************************************/ /* 首次检索 key + count (多检索词) */ select top 50000 fields as keystring, COUNT(fields) as hitcount /*into*/ from dt1500sqldb2..keys where ( keys like '%' ) and frm in ('200*a') and ( ( marc_id >= '0000000001' and marc_id <= '9999999999' ) ) GROUP BY fields UNION ALL /*******************************************************/ /* 首次检索 key + count (多检索词) */ select fields as keystring, COUNT(fields) as hitcount /*into*/ from dt1500sqldb1..keys where ( keys like '%' ) and frm in ('200*a') and ( ( marc_id >= '0000001393' and marc_id <= '0000001395' ) ) GROUP BY fields UNION ALL /*******************************************************/ /* 首次检索 key + count (多检索词) */ select top 50000 fields as keystring, COUNT(fields) as hitcount /*into*/ from xidan..keys where ( keys like '%' ) and frm = '200*a' and ( 1=2 ) GROUP BY fields select top 50000 keystring, SUM (hitcount) as hitnumber into recordset..srch00a567801 from #temp group by keystring order by keystring drop table #temp create clustered index keyindex on recordset..srch00a567801 (keystring) |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论