|
DataTrans-1500服務(wù)器是用SQL Server服務(wù)器作數(shù)據(jù)的底層管理,當(dāng)用戶對DataTrans-1500服務(wù)器進(jìn)行查詢時,服務(wù)器通過search.command命令文件以及.from檢索途徑對象來構(gòu)造SQL查詢語句,通過此SQL 查詢語句來對SQL Server服務(wù)器發(fā)起檢索。
DataTrans-1500服務(wù)器的系統(tǒng)管理員,了解、掌握SQL查詢語句的語法,能更好的作好二次開發(fā)。鑒于DataTrans-1500服務(wù)器系統(tǒng)管理員所作的二次開發(fā)只與查詢語句有關(guān),本章只介紹SQL查詢語句中與SELECT語句有關(guān)的一些基礎(chǔ)知識,以方便廣大不熟悉SQL查詢語言的DataTrans-1500服務(wù)器系統(tǒng)管理員。有關(guān)SQL語言更詳細(xì)的知識請查閱有關(guān)手冊。
SQL (Struct Query Language)即結(jié)構(gòu)化查詢語言,它是使用關(guān)系模型的數(shù)據(jù)庫應(yīng)用語言,由IBM在70年代開發(fā)出來。現(xiàn)在SQL結(jié)構(gòu)化查詢語言已經(jīng)成為一個工業(yè)標(biāo)準(zhǔn),幾乎所有的數(shù)據(jù)庫都支持它的查詢,SQL Server更是如此。
SQL Server服務(wù)器中,用SELECT語句實現(xiàn)數(shù)據(jù)庫的查詢操作。同時,它可以使用各種子句對查詢結(jié)果進(jìn)行分組統(tǒng)計、合計、排序等操作。SELECT語句還可將查詢結(jié)果生成另一個表(臨時表或永久表)。
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]
以上格式中,“[]”括的項表示可選項,大寫的詞為關(guān)鍵字,小寫的詞表示不確定的實體名稱。除第一行外,每一行為一個子句,在SELECT中子句可以省略,但在列出時,必須按照以上順序。
11.1簡單查詢語句
簡單的SQL查詢只包括SELECT子句、FROM子句和WHERE子句,它們分別說明查詢列、要查詢的表和搜索條件。
例如:
SELECT keys,fields
FROM keys
WHERE frm in (‘200*a’)
以上SELECT語句查詢keys表中frm字段為‘200*a’的記錄的keys和fields字段。
其查詢結(jié)果可能為:
keys marc_id ----------------------------------------------------------------- 王德樹 0000000001 賀鳴 0000000001 郭宏雨 0000000002 郭宏雨 0000000002
(4 row(s) affected)
11.1.1 SELECT 條件列表
1> 顯示keys表中所有列的內(nèi)容 SELECT * FROM keys
將對keys表中每個字段的值進(jìn)行顯示。
2> 按順序顯示指定列 SELECT marc_id,fileds,keys FROM keys
在SELECT 列表中指定列名來選擇不同的列,個列之間用逗號分開,結(jié)果的顯示順序為SELECT列表中字段的排列順序。
3> 更改列標(biāo)題 SELECT keys ,記錄號=marc_id FROM keys
或 SELECT keys,marc_id 記錄號 FROM keys
或 SELECT keys,marc_id as 記錄號 FROM keys
執(zhí)行結(jié)果為:
keys 記錄號 ----------------------------------------------------------------- 王德樹 0000000001 賀鳴 0000000001 郭宏雨 0000000002 郭宏雨 0000000002
(4 row(s) affected)
在SELECT語句中可以為選擇列指定列標(biāo)題,其格式為:
列標(biāo)題=列名
或:
列名 列標(biāo)題
4>刪除重復(fù)行
SELECT語句中可以使用ALL|DISTINCT選項來顯示所有行(ALL)或刪除重復(fù)的行(DISTINCT),缺省為ALL,即不去重。
在前面的例子中將查語句換為:
SELECT DISTINCT keys,marc_id FROM keys
查詢結(jié)果為:
keys marc_id ----------------------------------------------------------------- 王德樹 0000000001 賀鳴 0000000001 郭宏雨 0000000002
(3 row(s) affected)
11.1.2 FROM子句
FROM子句指定SELECT語句查詢及與查詢相關(guān)的表或視圖。在FROM子句中最多可指定16個表或視圖,它們相互之間用逗號分開,如果這些表屬于不同的數(shù)據(jù)庫,可用‘數(shù)據(jù)庫.所有者名稱.對象’格式加以限定。在缺省情況下,F(xiàn)ROM子句不指定數(shù)據(jù)庫名稱,查詢的數(shù)據(jù)庫為當(dāng)前數(shù)據(jù)庫。
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服務(wù)器的檢索途徑對象配置文件中,經(jīng)常用到的條件運算符是:列表運算符IN和模式匹配符LIKE。
列表運算符IN 列表運算符的格式為: 表達(dá)式 [NOT] IN (列表項1,列表項2,列表項3…) 它要求查詢時表達(dá)式的值(不)在列表內(nèi)。例如: 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中可使用的匹配符有以下幾種:
百分號(%):可匹配任意類型和長度的字符。
下劃線(_):匹配單個任意字符。
方括號[]:指定一個字符、字符串或范圍,要求所匹配對象為它們中的任何一個。
[^]:與[]取值相同,但要求所匹配的對象為指定范圍以外的任何一個字符。
例如下面的語句利用通配符%來查找以“王”開頭的字符串:
SELECT keys FROM keys WHERE keys LIKE ‘趙%’
查詢結(jié)果為:
keys
----------------------------------------------------------------- 趙寶山
趙成和
趙并林
(3 row(s) affected)
11.2 用GROUP BY子句進(jìn)行統(tǒng)計
GROUP BY 子句的語法格式為:
GROUP BY [ALL] aggregate_free_expression [, aggregate_free_expression]
在SELECT 語句中,GROUP BY子句和集合函數(shù)對數(shù)據(jù)庫進(jìn)行分組統(tǒng)計,在查詢結(jié)果中,每一組統(tǒng)計出一個結(jié)果。例如:
select fields as keystring,
COUNT(fields) as hitcount
from keys where
( keys like ‘%德‘ )
and
frm like ‘200*a‘
GROUP BY fields
執(zhí)行的結(jié)果為:
keystring hitcount
李祖德 1 桑關(guān)德 1 張京德 1 張沖德 1
(4 row(s) affected)
在上面的例子中,GROUP BY子句和集合函數(shù)COUNT按照fields字段對keys表進(jìn)行分組統(tǒng)計。集合函數(shù)COUNT對每一組的行數(shù)進(jìn)行計算,分組的標(biāo)準(zhǔn)是GROUP BY中定義的字段 fields。
11.3 INTO子句用查詢結(jié)果創(chuàng)建新表
SELECT語句中使用INTO選項可以將查詢結(jié)果寫進(jìn)新表,新表結(jié)構(gòu)與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查詢結(jié)果和COUNT的統(tǒng)計結(jié)果寫入臨時表temp中,臨時表temp結(jié)構(gòu)包含keystring和hitcount兩個字段。在以后用到這些信息時,就可以從temp表中讀取。
11.4 使用UNION運算符實現(xiàn)多查詢聯(lián)合
UNION運算符可以將兩個或兩個以上的查詢結(jié)果合并成一個結(jié)果集合顯示。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的結(jié)果也將寫進(jìn)查詢中INTO運算符定義的新表中。
在使用UNION子句時,應(yīng)保證每個查詢語句的選擇列表中有相同數(shù)量的表達(dá)式,并且每個查詢選擇列表中的對應(yīng)表達(dá)式應(yīng)具有相同或可以自動轉(zhuǎn)換成相同的數(shù)據(jù)類型。
缺省情況下,UNION運算符將刪除不同查詢語句中行值相同的行,如果要保留這些相同的行,應(yīng)使用ALL選項。
11.5 .from文件和search.command文件構(gòu)造SQL查詢語句
在DataTrans-1500服務(wù)器的檢索途徑對象.from文件中的每個section小節(jié)都是一個用來構(gòu)造SQL查詢語句的模板。而且每個小節(jié)都有一個/*into*/,/*into*/是INTO子句的插入標(biāo)志。在進(jìn)行多庫或多途徑查詢時,最后只有一個結(jié)果集,DataTrans-1500服務(wù)器只插入了一個INTO子句。之所以為.from文件的每個section小節(jié)都加了一個/*into*/標(biāo)志,是因為無法確定哪個小節(jié)首先被匹配,每個小節(jié)都有可能是第一個被匹配的。而最后的結(jié)果是,只有第一個被匹配的小節(jié)中的/*into*/標(biāo)志是起作用的。
要在/*into*/處插入的INTO運算符被定義在search.command文件中的union-into-phrase字段中。下面一段源文件在search.command中對titlenumber結(jié)果集的定義:
<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服務(wù)器中對所有庫發(fā)起一次全途徑檢索,由search.command文件和若干個.from文件構(gòu)造的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)
|