所謂條件查詢,就是在SELECT語句中使用WHERE子句。因為在實際工作中,我們碰到的大多數(shù)情況是按照一定的條件進(jìn)行查詢的,因此條件查詢是使用最多的查詢。
8.1 WHERE條件子句的語法結(jié)構(gòu)
帶有WHERE條件子句的SELECT語句的結(jié)構(gòu)如下:
SQL = “select 字段列表 from 數(shù)據(jù)表名 where 條件表達(dá)式”
這里,條件表達(dá)式是由各種字段、常量、表達(dá)式、關(guān)系運(yùn)算符、邏輯運(yùn)算符和特殊的運(yùn)算符組合起來的。
在條件表達(dá)式中,各個條件的條件值依數(shù)據(jù)類型的不同要用不同的方式表示:對于數(shù)值類型的條件值,直接寫上條件值即可,比如“WHERE學(xué)分=3”;對于文本類型和日期類型的條件值,要用單引號括起來,比如單引號“’”括起來,如“WHERE 姓名=‘黃小立’”,“WHERE入學(xué)日期=‘2006-9-1’”。
8.2 WHERE條件子句中的運(yùn)算符
WHERE條件子句中的運(yùn)算符包括關(guān)系運(yùn)算符、邏輯運(yùn)算符和特殊的運(yùn)算符。
8.2.1 關(guān)系運(yùn)算符
關(guān)系運(yùn)算符用來表示兩個表達(dá)式之間的關(guān)系。WHERE條件子句中的可使用的關(guān)系運(yùn)算符如表8-1所示。
表8-1 比較運(yùn)算符及其含義
運(yùn)算符
含義
=
等于,用于測試兩個表達(dá)式是否相等
>
大于,用于測試一個表達(dá)式是否大于另一個表達(dá)式
<
小于,用于測試一個表達(dá)式是否大于另一個表達(dá)式
>=
大于或等于,用于測試一個表達(dá)式是否大于或等于另一個表達(dá)式
<=
小于或等于,用于測試一個表達(dá)式是否小于或等于另一個表達(dá)式
<>
不等于,用于測試一個表達(dá)式是否不等于另一個表達(dá)式
!=
不等于(非SQL-92標(biāo)準(zhǔn)),用于測試一個表達(dá)式是否不等于另一個表達(dá)式
!<
不小于(非SQL-92標(biāo)準(zhǔn)),用于測試一個表達(dá)式是否不小于另一個表達(dá)式
!>
不大于(非SQL-92標(biāo)準(zhǔn)),用于測試一個表達(dá)式是否不大于另一個表達(dá)式
8.2.2 邏輯運(yùn)算符
邏輯運(yùn)算符用來表示兩個表達(dá)式之間的邏輯關(guān)系。邏輯運(yùn)算符返回帶有TRUE、FALSE或UNKNOWN值的Boolean數(shù)據(jù)類型。WHERE條件子句中的可使用的邏輯運(yùn)算符如表8-2所示。
表8-2 邏輯運(yùn)算符及其含義
運(yùn)算符
含義
ALL
如果一組值的比較都為TRUE,那么就為TRUE
AND
如果兩個布爾表達(dá)式都為TRUE,那么就為TRUE
ANY
如果一組值的比較中任何一個為TRUE,那么就為TRUE
BETWEEN
如果操作數(shù)在某個范圍之內(nèi),那么就為TRUE
EXISTS
如果子查詢包含一些行,那么就為TRUE
IN
如果操作數(shù)等于表達(dá)式列表中的一個,那么就為TRUE
LIKE
如果操作數(shù)與一種模式相匹配,那么就為TRUE
NOT
對任何其他布爾運(yùn)算符的值取反
OR
如果兩個布爾表達(dá)式中的一個為TRUE, 那么就為TRUE
SOME
如果在一組值比較中,有些為TRUE, 那么就為TRUE
8.2.3 特殊運(yùn)算符
特殊運(yùn)算符用來進(jìn)行特殊的運(yùn)算,比如判斷是否為空、進(jìn)行模糊查詢等。WHERE條件子句中的可使用的特殊運(yùn)算符如表8-3所示。
表8-3 SQL命令中搜索條件運(yùn)算符的匯總
運(yùn)算符
含義
%
通配符,代表任意多個字符。例如,WHERE字段名LIKE’%a%’表示所有含有字母“A”的字段數(shù)據(jù)
-
通配符,代表嚴(yán)格的一個字符。例如,WHERE字段名LIKE’__AB’表示所有4個字母的數(shù)據(jù)中以“AB”結(jié)尾的字段數(shù)據(jù)
[]
指定范圍內(nèi)的任意單個字符。例如,WHERE字段名LIKE’[BC]%’表示所有以“B”或“C”開頭的字段數(shù)據(jù)
[^]
不屬于指定范圍或集合的任何單個字符。例如,WHERE字段名LIKE[B^a]%’表示所有以“B”開頭,且第2個字母不是“a”的字段數(shù)據(jù)
BETWEEN
測試值的范圍,使用AND將開始值與結(jié)束值分開。例如,WHERE字段名BETWEEN 50 AND 100表示所有的50(含50)和100(含100)之內(nèi)的字段數(shù)據(jù)
LIKE[NOT]LIKE
字段匹配符(通常只限于字符數(shù)據(jù)類型)
IS[NOT]NULL
測試字段的數(shù)據(jù)或表達(dá)式的結(jié)果是否為空
[NOT]IN
一個字段的直是否在一組定義的值之中,匹配特定值的列表
ANY(SOME)
子查詢結(jié)果集中的一個或多個行是否滿足指定的條件
ALL
子查詢結(jié)果集的所有行是否都滿足指定的條件
[NOT]EXISTS
子查詢是否返回任何結(jié)果(不只是特定的結(jié)果)
8.3 單條件查詢
所謂單條件查詢,就是在WHERE子句中只有一個條件。下面介紹常見的幾種單條件查詢。
8.3.1 等于或不等于查詢
等于或不等于查詢,就是WHERE子句中使用表8-1的比較運(yùn)算符進(jìn)行單條件查詢,此時的SQL語句結(jié)構(gòu)如下:
SQL = “select 字段列表 from 數(shù)據(jù)表名 where 某字段 (等于或不等于) 條件值”
【例8-1】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“研究生”的全部男研究生記錄查詢出來并復(fù)制到Excel工作表。
在運(yùn)行下面的程序之前,要確保已經(jīng)引用了ADO對象庫MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同時,還要根據(jù)電腦實際情況,將連接字符串中的SQL Server服務(wù)器名稱進(jìn)行變更,并輸入相應(yīng)的用戶名和密碼(如果有的話)。
Public Sub 例8—1()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定數(shù)據(jù)庫
mytable = "研究生" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server服務(wù)器的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'檢查全表某些字段的記錄
SQL = " select * from " & mytable & " where 性別='男'"
Set rs = cnn.Execute(SQL)
'復(fù)制字段名
For i = 0 To rs.Fields.Count - 1
Cells(1, i + 1) = rs.Fields(i).Name
Cells(1, i + 1).Font.Bold = True
Next i
'復(fù)制全部記錄數(shù)據(jù)
Range("A2").CopyFromRecordset rs
'字段設(shè)置列寬至合適的寬度
Columns.AutoFit
'關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
運(yùn)行上面的程序,就得到如圖8-1所示的結(jié)果。
【例8-2】本例是將數(shù)據(jù)庫“研究生管理”中的數(shù)據(jù)表“成績”的全部考試成績分?jǐn)?shù)在90分以上的研究生記錄查詢出來并復(fù)制到Excel工作表。本例的程序與【例8-1】基本相同,唯一區(qū)別在于SQL語句,如下所示:
SQL = “select *from ” & mytable & “ where 成績 >90”
運(yùn)行上面的程序,就得到如圖8-2所示的結(jié)果。
8.3.2 列表(in或not in)查詢
就是判斷一個字段的值是否在一組定義的值之中,此時的SQL語句結(jié)構(gòu)如下:
SQL = “select 字段列表 from 數(shù)據(jù)表名 where 某字段 in(值1,值2,……)”
或者:
SQL = “select 字段列表 from 數(shù)據(jù)表名 where 某字段 not in(值1,值2,……)”
【例8-3】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向為“風(fēng)險投資”或者“項目投資”研究生記錄查詢出來并復(fù)制到Excel工作表。
Public Sub 例8—3()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定數(shù)據(jù)庫
mytable = "研究生" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server服務(wù)器的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?div style="height:15px;">
【例8-4】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向不為“風(fēng)險投資”或者“項目投資”研究生記錄查詢出來并復(fù)制到Exce工作表。本例的程序與【例8-3】基本相同,唯一區(qū)別在于SQL語句,如下所示:
【例8-5】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“成績”中,考試成績在80到90之間的研究生記錄查詢出來并復(fù)制到Excel工作表。