在ADO使用SELECT語法四
作者:Eve Cole
更新時間:2009-05-30 19:54:28
HAVING
HAVING使用於SELECT 表達式中,篩選已經GROUP BY統計的記錄。在GROUP BY統計記錄後,HAVING將篩選與HAVING子句中條件相符的記錄。
文法如下:
SELECT fieldlist
FROM table
WHERE selectcriteria
GROUP BY groupfieldlist
[HAVING groupcriteria]
.groupcriteria表示決定應篩選的統計記錄。
HAVING與WHERE相類似,是用來決定選取哪些記錄。當使用GROUP BY來統計記錄後,HAVING會決定應顯示的記錄,譬如:
SELECT 產品名稱
FROM 產品
GROUP BY 分類
HAVING 單價> 1000
一個HAVING子句最多可包含40個運算式,運算式之間將由AND或OR等邏輯運算子來連結。
讓我們來看一個於ASP程式當中使用這個SQL指令的範例。
我們可以利用HAVING子句決定應顯示的記錄,譬如ASP程序rs23.asp如下,[SELECT 姓名,科目,Avg(分數) As 平均From 考試Group By 姓名,科目Having Avg(分數) >=60],使用Having Avg(分數) >=60找出平均分數大於或等於60分的記錄:
<%
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 姓名,科目,Avg(分數) As 平均From 考試Group By 姓名,科目Having Avg(分數) >=60"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Having Avg(分數) >=60"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 平均: " & rs2("平均")
rs2.MoveNext
Loop
rs2.Close
%>
以上的ASP程式rs23.asp,在用戶端使用瀏覽器,瀏覽執行的結果,顯示找出平均分數大於或等於60分的記錄。
我們也可以利用HAVING子句找出重複的記錄,譬如ASP程序rs23.asp如下,[SELECT 代號From 產品Group By 代號Having Count(代號) > 1],使用Having Count(代號) > 1找出代號重複的記錄:
<%
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 代號From 產品Group By 代號Having Count(代號) > 1"
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>找出重複Having Count(代號) > 1"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("代號")
rs2.MoveNext
Loop
rs2.Close
%>
以上的ASP程式rs23.asp,在用戶端使用瀏覽器,瀏覽執行的結果,顯示代號重複的記錄。
Union
Union可以合併多組查詢的結果。
文法如下:
查詢1 UNION [ALL] 查詢2 [UNION [ALL]查詢3 [ ... ]]
查詢為一個SELECT表達式。
當您使用一個UNION 運算時,不會傳回重複的記錄;若要傳回所有的記錄,您可以於UNION後面加上ALL,加上ALL執行查詢的速度比較快。
在一個UNION運算中的所有查詢,字段數目必須相同。字段大小可以不同,字段資料類型也可以不同。
只有在第一個SELECT表達式中可使用別名,在其它SELECT表達式中省略。
可以在每一個SELECT表達式中使用GROUP BY或HAVING子句,以統計查詢的結果。
最後一個SELECT表達式可以使用ORDER BY 子句,以指定查詢的結果的排列順序。
讓我們來看一個於ASP程式當中使用這個SQL指令的範例。
可以利用Union合併兩組查詢的結果,譬如ASP程序rs25.asp如下,[(SELECT 姓名,科目,分數From 考試Where 科目='算術' and 姓名='李四') Union (SELECT 姓名,科目,分數From 考試Where 科目='算術' and 姓名='張三')],使用Union合併兩組SELECT查詢的結果,一組為查詢李四的算術成績記錄,另一組查詢張三的算術成績記錄:
<%
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 姓名,科目,分數From 考試Where 科目='算術' and 姓名='李四') Union (SELECT 姓名,科目,分數From 考試Where 科目='算術' and 姓名='張三') "
rs2.Open SqlStr,conn1,1,1
Response.Write "<p>Union"
Do while not rs2.EOF
Response.Write "<BR>" & rs2("姓名") & " " & rs2("科目") & " 分數: " & rs2("分數")
rs2.MoveNext
Loop
rs2.Close
%>
以上的ASP程式rs25.asp,在用戶端使用瀏覽器,瀏覽執行的結果,顯示李四和張三的算術分數記錄。