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