在ADO使用SELECT語(yǔ)法6
發(fā)表時(shí)間:2024-02-10 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]子查詢(xún) 在一個(gè)SELECT、SELECT...INTO、INSERT...INTO、DELETE、或UPDATE 表達(dá)式中,可以包括SELECT表達(dá)式,這個(gè)SELECT表達(dá)式叫做子查詢(xún)(sub query)。您可以使用三種語(yǔ)法建立子查詢(xún):表達(dá)式 [ANY ALL SOME] (子查詢(xún)...
子查詢(xún)
在一個(gè)SELECT、SELECT...INTO、INSERT...INTO、DELETE、或UPDATE 表達(dá)式中,可以包括SELECT表達(dá)式,這個(gè)SELECT表達(dá)式叫做子查詢(xún)(sub query)。
您可以使用三種語(yǔ)法建立子查詢(xún):
表達(dá)式 [ANY ALL SOME] (子查詢(xún))
表達(dá)式 [NOT] IN (子查詢(xún))
[NOT] EXISTS (子查詢(xún))
子查詢(xún)的一個(gè)SELECT表達(dá)式,與一般SELECT表達(dá)式的語(yǔ)法相同,必須包括在括號(hào)之中。
您可以使用子查詢(xún)來(lái)替代SELECT表達(dá)式的運(yùn)算式,或在WHERE或 HAVING子句中的運(yùn)算式。
關(guān)鍵字ANY和SOME的意義相同,用來(lái)選擇符合子查詢(xún)的任何記錄的比較條件。譬如下例將返回產(chǎn)品中單價(jià)大于訂單中任何數(shù)量大于100的記錄:
SELECT * FROM 產(chǎn)品
WHERE 單價(jià) > ANY
(SELECT 單價(jià) FROM 訂單
WHERE 數(shù)量 > 100)
關(guān)鍵字ALL,用來(lái)選擇符合子查詢(xún)的所有記錄的比較條件。
譬如在上例中將ANY改為ALL,將返回產(chǎn)品中單價(jià)大于訂單中所有數(shù)量大于100的記錄。
關(guān)鍵字IN 述語(yǔ)來(lái)擷取在主查詢(xún)中且只有在子查詢(xún)之中包含相同值的某些記錄。下列范例會(huì)返回以百分之 25 或更高的折扣賣(mài)出的所有產(chǎn)品:
關(guān)鍵字IN,用來(lái)選擇在子查詢(xún)之中的記錄。譬如下例將返回訂單中數(shù)量 > 100的記錄:
SELECT * FROM 產(chǎn)品
WHERE 產(chǎn)品代號(hào) IN
(SELECT 產(chǎn)品代號(hào) FROM 訂單
WHERE 數(shù)量 > 100)
相反地,關(guān)鍵字NOT IN,用來(lái)選擇不在子查詢(xún)之中的記錄。
在true/false比較中,可以使用EXISTS關(guān)鍵字,來(lái)決定子查詢(xún)是否會(huì)返回任何的記錄。
關(guān)鍵字ALL的ASP例子,譬如ASP程式rs24.asp如下,[SELECT 姓名,科目,分?jǐn)?shù) From 考試 Where 科目 = '算術(shù)' and 分?jǐn)?shù) >= All (SELECT 分?jǐn)?shù) From 考試 Where 科目='算術(shù)' and 姓名='張三')] 找出分?jǐn)?shù)大于或等于張三的算術(shù)考試的算術(shù)記錄:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分?jǐn)?shù) From 考試 Where 科目 = '算術(shù)' and 分?jǐn)?shù) >= All (SELECT 分?jǐn)?shù) From 考試 Where 科目='算術(shù)' and 姓名='張三')"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>All高于張三算術(shù)所有分?jǐn)?shù)"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分?jǐn)?shù): " & rs2("分?jǐn)?shù)")
rs2.MoveNext
Loop
rs2.Close
%>
以上的 ASP程式rs24.asp,在用戶(hù)端使用瀏覽器,瀏覽執(zhí)行的結(jié)果,顯示分?jǐn)?shù)大于或等于張三的算術(shù)考試的算術(shù)記錄。
Any
關(guān)鍵字ANY用來(lái)選擇符合子查詢(xún)的任何記錄的比較條件,譬如ASP程式rs24.asp如下,[SELECT 姓名,科目,分?jǐn)?shù) From 考試 Where 科目 = '算術(shù)' and 分?jǐn)?shù) >= Any (SELECT 分?jǐn)?shù) From 考試 Where 科目='算術(shù)' and 姓名='張三')] 找出分?jǐn)?shù)大于或等于張三任何算術(shù)分?jǐn)?shù)的記錄:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分?jǐn)?shù) From 考試 Where 科目 = '算術(shù)' and 分?jǐn)?shù) >= Any (SELECT 分?jǐn)?shù) From 考試 Where 科目='算術(shù)' and 姓名='張三')"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Any高于張三算術(shù)任何分?jǐn)?shù)"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分?jǐn)?shù): " & rs2("分?jǐn)?shù)")
rs2.MoveNext
Loop
rs2.Close %>
以上的 ASP程式rs24.asp,在用戶(hù)端使用瀏覽器,瀏覽執(zhí)行的結(jié)果,顯示分?jǐn)?shù)大于或等于張三任何算術(shù)分?jǐn)?shù)的記錄。
Some
關(guān)鍵字SOME和ANY的意義相同,用來(lái)選擇符合子查詢(xún)的任何記錄的比較條件,譬如ASP程式rs24.asp如下,[SELECT 姓名,科目,分?jǐn)?shù) From 考試 Where 科目 = '算術(shù)' and 分?jǐn)?shù) >= Some (SELECT 分?jǐn)?shù) From 考試 Where 科目='算術(shù)' and 姓名='張三')] 找出分?jǐn)?shù)大于或等于張三任何算術(shù)分?jǐn)?shù)的記錄:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ=" & Server.MapPath("ntopsamp.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
Set rs2 = Server.CreateObject("ADODB.Recordset")
SqlStr = "SELECT 姓名,科目,分?jǐn)?shù) From 考試 Where 科目 = '算術(shù)' and 分?jǐn)?shù) >= Some (SELECT 分?jǐn)?shù) From 考試 Where 科目='算術(shù)' and 姓名='張三')"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Some高于張三算術(shù)任何分?jǐn)?shù)"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分?jǐn)?shù): " & rs2("分?jǐn)?shù)")
rs2.MoveNext
Loop
rs2.Close
%>
以上的 ASP程式rs24.asp,在用戶(hù)端使用瀏覽器,瀏覽執(zhí)行的結(jié)果,顯示分?jǐn)?shù)大于或等于張三任何算術(shù)分?jǐn)?shù)的記錄。
Select...Into
Select...Into將查詢(xún)的結(jié)果,建立一個(gè)產(chǎn)生的表。
語(yǔ)法如下:
SELECT 字段1[,字段2[, ...]] INTO 新表 [IN 外部表]
FROM 表
新表的名稱(chēng)不可與現(xiàn)存表的名稱(chēng)相同,否則將會(huì)發(fā)生錯(cuò)誤。
Select...Into所建立的新表,其字段的資料類(lèi)型及大小與所查詢(xún)的表相同。
讓我們看一個(gè)于ASP程式當(dāng)中使用這個(gè)SQL指令的例子。
譬如ASP程式rs9.asp如下,[Select * Into 電腦 From 產(chǎn)品 Where 種類(lèi) = '電腦'] 將 [產(chǎn)品] 表中所有 [種類(lèi)] 為 [電腦] 的紀(jì)錄產(chǎn)生一個(gè)新的 [電腦] 表:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "DBQ="& Server.MapPath("ntopsamp.mdb") &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;"
sql = "Select * Into 電腦 From 產(chǎn)品 Where 種類(lèi) = '電腦'"
Set a = conn1.Execute(sql)
Set rs3 = Server.CreateObject("ADODB.Recordset")
sql = "Select * from 電腦"
rs3.Open sql,conn1,1,1,1
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">代號(hào)</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">名稱(chēng)</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">價(jià)格</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">數(shù)量</FONT></TD>
</TR>
<% Do while not rs3.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("代號(hào)")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名稱(chēng)")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("價(jià)格")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("數(shù)量")%></TD>
</TR>
<%
rs3.MoveNext
Loop
rs3.Close
%>
</TABLE>
以上的 ASP程式rs9.asp,在用戶(hù)端使用瀏覽器,瀏覽執(zhí)行的結(jié)果,顯示新 [電腦] 表的記錄。