考試大編輯整理:計(jì)算機(jī)軟考程序員編程輔導(dǎo)
子查詢
在一個(gè)SELECT、SELECT...INTO、INSERT...INTO、DELETE、或UPDATE 表達(dá)式中,可以包括SELECT表達(dá)式,這個(gè)SELECT表達(dá)式叫做子查詢(sub query)。
您可以使用三種語法建立子查詢:
表達(dá)式 [ANY | ALL | SOME] (子查詢)
表達(dá)式 [NOT] IN (子查詢)
[NOT] EXISTS (子查詢)
子查詢的一個(gè)SELECT表達(dá)式,與一般SELECT表達(dá)式的語法相同,必須包括在括號(hào)之中。
您可以使用子查詢來替代SELECT表達(dá)式的運(yùn)算式,或在WHERE或 HAVING子句中的運(yùn)算式。
關(guān)鍵字ANY和SOME的意義相同,用來選擇符合子查詢的任何記錄的比較條件。譬如下例將返回產(chǎn)品中單價(jià)大于訂單中任何數(shù)量大于100的記錄:
SELECT * FROM 產(chǎn)品
WHERE 單價(jià) > ANY
(SELECT 單價(jià) FROM 訂單
WHERE 數(shù)量 > 100)
關(guān)鍵字ALL,用來選擇符合子查詢的所有記錄的比較條件。
譬如在上例中將ANY改為ALL,將返回產(chǎn)品中單價(jià)大于訂單中所有數(shù)量大于100的記錄。
關(guān)鍵字IN 述語來擷取在主查詢中且只有在子查詢之中包含相同值的某些記錄。下列范例會(huì)返回以百分之 25 或更高的折扣賣出的所有產(chǎn)品:
關(guān)鍵字IN,用來選擇在子查詢之中的記錄。譬如下例將返回訂單中數(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,用來選擇不在子查詢之中的記錄。
在true/false比較中,可以使用EXISTS關(guā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 "
All高于張三算術(shù)所有分?jǐn)?shù)"
Do while not rs2.EOF
Response.Write "
" & rs2("姓名") & " " & rs2("科目") & " 分?jǐn)?shù): " & rs2("分?jǐn)?shù)")
rs2.MoveNext
Loop
rs2.Close
%>
以上的 ASP程式rs24.asp,在用戶端使用瀏覽器,瀏覽執(zhí)行的結(jié)果,顯示分?jǐn)?shù)大于或等于張三的算術(shù)考試的算術(shù)記錄。
Any
子查詢
在一個(gè)SELECT、SELECT...INTO、INSERT...INTO、DELETE、或UPDATE 表達(dá)式中,可以包括SELECT表達(dá)式,這個(gè)SELECT表達(dá)式叫做子查詢(sub query)。
您可以使用三種語法建立子查詢:
表達(dá)式 [ANY | ALL | SOME] (子查詢)
表達(dá)式 [NOT] IN (子查詢)
[NOT] EXISTS (子查詢)
子查詢的一個(gè)SELECT表達(dá)式,與一般SELECT表達(dá)式的語法相同,必須包括在括號(hào)之中。
您可以使用子查詢來替代SELECT表達(dá)式的運(yùn)算式,或在WHERE或 HAVING子句中的運(yùn)算式。
關(guān)鍵字ANY和SOME的意義相同,用來選擇符合子查詢的任何記錄的比較條件。譬如下例將返回產(chǎn)品中單價(jià)大于訂單中任何數(shù)量大于100的記錄:
SELECT * FROM 產(chǎn)品
WHERE 單價(jià) > ANY
(SELECT 單價(jià) FROM 訂單
WHERE 數(shù)量 > 100)
關(guān)鍵字ALL,用來選擇符合子查詢的所有記錄的比較條件。
譬如在上例中將ANY改為ALL,將返回產(chǎn)品中單價(jià)大于訂單中所有數(shù)量大于100的記錄。
關(guān)鍵字IN 述語來擷取在主查詢中且只有在子查詢之中包含相同值的某些記錄。下列范例會(huì)返回以百分之 25 或更高的折扣賣出的所有產(chǎn)品:
關(guān)鍵字IN,用來選擇在子查詢之中的記錄。譬如下例將返回訂單中數(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,用來選擇不在子查詢之中的記錄。
在true/false比較中,可以使用EXISTS關(guā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 "
All高于張三算術(shù)所有分?jǐn)?shù)"
Do while not rs2.EOF
Response.Write "
" & rs2("姓名") & " " & rs2("科目") & " 分?jǐn)?shù): " & rs2("分?jǐn)?shù)")
rs2.MoveNext
Loop
rs2.Close
%>
以上的 ASP程式rs24.asp,在用戶端使用瀏覽器,瀏覽執(zhí)行的結(jié)果,顯示分?jǐn)?shù)大于或等于張三的算術(shù)考試的算術(shù)記錄。
Any