在ADO使用SELECT語法一
作者:Eve Cole
更新時間:2009-05-30 19:54:37
SELECT表達式
接著,讓我們來看看SELECT表達式,SELECT用來在表格中尋找符合特定條件的記錄,語法如下:
SELECT [關鍵字] { * | 表名稱.* | [表名稱.]欄位名稱1 [AS 別名1] [, [表名稱.] 欄位名稱2 [AS 別名2] [, ...]]}
FROM 表運算式[, ...] [IN 外部表]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]
關鍵字:可以用來限制回傳之記錄的數量,可以設定為ALL、DISTINCT、DISTINCTROW 、或TOP。如果沒有指定述語,預設值為ALL。
*:選取全部的欄位。
別名:代替表格中原有的欄位名稱。
表運算式:一個或多個以逗號分隔的表格名稱。
外部表:如果表格不存在目前的表當中,須設定包含表格運算式中表格的表格名稱。
執行SELECT 表達式,並不會改變表格之中現有的資料。
一個SELECT 表達式最基本的語法是:
SELECT * FROM 表運算式
您可以使用星號(*)來選取表格的全部欄位。譬如下例選取[產品] 表中的全部欄位:
SELECT * FROM 產品
當欄位名稱包含空格或標點符號時,須使用括號[ ]將它括在其中。例如:
SELECT [電腦的產品]
若在FROM子句中的欄位名稱中,包含多個的表格中時,需在欄位名稱前加上表格名稱和點(.)運算子,即表格名稱.欄位名稱。譬如下例選取[產品] 表的[價格] 欄位和[訂單] 表的[數量] 欄位:
SELECT 產品.價格, 訂單.數量
FROM 產品, 訂單
WHERE 產品.代號= 訂單.代號
當您使用Recordset 物件時,Recordset並不認得rs(表格名稱.欄位名稱) 格式,即rs(「產品.價格」)會發生錯誤,您必須使用AS來設定欄位名稱的別名。譬如:
SELECT 產品.價格AS 價格, 訂單.數量AS 數量
FROM 產品, 訂單
WHERE 產品.代號= 訂單.代號
如此就可以使用rs(“價格”) 和rs(“數量”),來讀取其欄位的資料。
與SELECT表達式相關的語法:
關鍵字:ALL/ DISTINCT/ DISTINCTROW/ TOP。
WHERE:尋找FROM中的表格符合特定條件的資料記錄。 WHERE 可以使用下面的BETWEEN、LIKE、IN運算子:
Between...And:判斷表達式的值是否落在指定的範圍。
Like:尋找相符的關鍵字。
IN運算式:限定範圍。
NOT IN運算式:表示不屬於所指定的範圍。
ORDER BY子句:可以設定已排序的欄位。
GROUP BY子句:將查詢的結果做統計。
HAVING子句:使用在SELECT 表達式中,篩選已經GROUP BY統計的記錄。
Union:可以合併多組查詢的結果。
JOIN:連接組合兩個表格中的欄位記錄。
子查詢(sub query):表達式中,可以包括SELECT表達式。
Select...Into:將查詢的結果,建立一個產生的表。
詳細介紹如下:
ALL/DISTINCT/DISTINCTROW/TOP關鍵字
使用SELECT查詢時,可以加上關鍵字,以選取所查詢的記錄。如下:
ALL:傳回所有的記錄。
DISTINCT:指定欄位中的記錄重複時只傳回一筆記錄,記錄不重複。
DISTINCTROW:指定欄位中的記錄有重複時都不回傳。
TOP:傳回前面幾個記錄或幾個百分比的記錄。
文法如下:
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM 表
ALL傳回所有的記錄。不加關鍵字時,與加ALL的意義相同,將傳回所有的記錄。譬如下列兩個例子的執行結果相同,都從產品表中傳回所有的記錄:
SELECT ALL * FROM 產品
與以下的執行結果相同:
SELECT * FROM 產品
DISTINCT不會選取指定欄位之中的重複資料。使用DISTINCT後,查詢的結果,列在SELECT DISTINCT後的每個欄位的資料值,若相同則只取一筆記錄,換句話說,指定欄位的資料不會有重複的現象。例如,在產品表之中有一些產品名稱相同的產品,加上DISTINCT的SQL表達式只會傳回一筆記錄欄位為產品名稱資料相同的記錄:
SELECT DISTINCT 產品名稱FROM 產品
如果您不加上DISTINCT,上例查詢將傳回數個包含相同產品名稱的記錄。
如果SELECT DISTINCT子句後指定數個字段,查詢的結果,所有字段的組合值不會有重複的現象。
DISTINCTROW則不傳回指定欄位所有重複的記錄。
TOP n [PERCENT] ,傳回前面幾筆記錄或幾個百分比的記錄。排列的順序可以使用ORDER BY子句來指定。譬如找到成績前10名的學生姓名:
SELECT TOP 10 名
FROM 學生
ORDER BY 成績
如果您沒有包含ORDER BY子句,查詢將由學生表格傳回任意的10個記錄。
TOP不在相同值間作選擇,如果第10及第11的成績是相同的,查詢將回傳11個記錄。
您可使用PERCENT來設定前面幾個百分比的記錄,譬如譬如找到成績前10%的學生姓名:
SELECT TOP 10 PERCENT 姓名
FROM 學生
ORDER BY 成績
讓我們來看一個在ASP程式中使用這個SQL指令的範例。
可以利用Distinct找出不重複的記錄,譬如ASP程序rs7.asp如下,[Insert Into 產品(代號,名稱) Select Distinct 代號,名稱From 產品where 代號='C2000'] 使用Distinct與Insert Intoct新增代號為C2000的記錄:
<%
'Distinct 代號,名稱只判斷代號,名稱是否相同, 相同者只加一筆記錄
sql = "Insert Into 產品(代號,名稱) Select Distinct 代號,名稱From 產品where 代號='C2000'"
Set a = conn1.Execute(sql)
Set rs3 = Server.CreateObject("ADODB.Recordset")
sql = "Select * from 產品where 代號='C2000'"
rs3.Open sql,conn1,1,1,1
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">代號</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">名稱</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">價</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">數量</FONT></TD>
</TR>
<% Do while not rs3.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("代號")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名稱")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("價")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("數量")%></TD>
</TR>
<%
rs3.MoveNext
Loop
rs3.Close
%>
</TABLE>
WHERE
WHERE尋找FROM中的表格符合特定條件的資料記錄,WHERE 使用在SELECT、UPDATE、或DELETE表達式。
如果SELECT查詢中沒有指定WHERE子句,將會傳回表格中所有的資料。如果在SELECT查詢多個表,且沒有使用WHERE子句、或JOIN 子句的話,查詢結果為多個表格資料的乘積。
WHERE設定特定的條件,譬如:
FROM 產品WHERE 分類= '電腦':表示選擇[分類] 為[電腦] 的[產品]
WHERE 價格Between 1000 And 5000:表示價格介於1000至5000之間。
一個WHERE子句,最多可包含40個運算式,運算式之間由AND或OR等邏輯運算子相連。
設定特定的條件時,依欄位類型,前後加上不同的符號,譬如:
文:前後加單引號,譬如WHERE 分類= '電腦'。
數字:前後不加符號,譬如WHERE 數量> 100。
日期:前後加#號,譬如WHERE 日期= #5/15/99#。
WHERE可以使用下面的BETWEEN、LIKE、IN運算子。