第8章 條件查詢 所謂條件查詢,就是在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)系運算符、邏輯運算符和特殊的運算符組合起來的。 在條件表達(dá)式中,各個條件的條件值依數(shù)據(jù)類型的不同要用不同的方式表示:對于數(shù)值類型的條件值,直接寫上條件值即可,比如“WHERE學(xué)分= 8.2 WHERE條件子句中的運算符 WHERE條件子句中的運算符包括關(guān)系運算符、邏輯運算符和特殊的運算符。 關(guān)系運算符用來表示兩個表達(dá)式之間的關(guān)系。WHERE條件子句中的可使用的關(guān)系運算符如表8-1所示。 表8-1 比較運算符及其含義
邏輯運算符用來表示兩個表達(dá)式之間的邏輯關(guān)系。邏輯運算符返回帶有TRUE、FALSE或UNKNOWN值的Boolean數(shù)據(jù)類型。WHERE條件子句中的可使用的邏輯運算符如表8-2所示。 表8-2 邏輯運算符及其含義
特殊運算符用來進(jìn)行特殊的運算,比如判斷是否為空、進(jìn)行模糊查詢等。WHERE條件子句中的可使用的特殊運算符如表8-3所示。 表8-3 SQL命令中搜索條件運算符的匯總
8.3 單條件查詢 所謂單條件查詢,就是在WHERE子句中只有一個條件。下面介紹常見的幾種單條件查詢。 等于或不等于查詢,就是WHERE子句中使用表8-1的比較運算符進(jìn)行單條件查詢,此時的SQL語句結(jié)構(gòu)如下: SQL = “select 字段列表 from 數(shù)據(jù)表名 where 某字段 (等于或不等于) 條件值” 【例8-1】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“研究生”的全部男研究生記錄查詢出來并復(fù)制到Excel工作表。 在運行下面的程序之前,要確保已經(jīng)引用了ADO對象庫Microsoft
Active 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 運行上面的程序,就得到如圖8-1所示的結(jié)果。 【例8-2】本例是將數(shù)據(jù)庫“研究生管理”中的數(shù)據(jù)表“成績”的全部考試成績分?jǐn)?shù)在90分以上的研究生記錄查詢出來并復(fù)制到Excel工作表。本例的程序與【例8-1】基本相同,唯一區(qū)別在于SQL語句,如下所示: SQL = “select *
from ” & mytable & “ where 成績 > 運行上面的程序,就得到如圖8-2所示的結(jié)果。 就是判斷一個字段的值是否在一組定義的值之中,此時的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)砟承┳侄蔚挠涗?/span>
SQL = " select * from " & mytable & " where 研究方向 in ('風(fēng)險投資','項目投資')"
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 運行上面的程序,就得到如圖8-3所示的結(jié)果。 【例8-4】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向不為“風(fēng)險投資”或者“項目投資”研究生記錄查詢出來并復(fù)制到Exce工作表。本例的程序與【例8-3】基本相同,唯一區(qū)別在于SQL語句,如下所示: SQL=“select *
from” & mytable & “ where 研究方向 not in (‘風(fēng)險投資’,’項目投資’)“ 運行上面的程序,就得到如圖8-4所示的結(jié)果。 介于查詢用于完成數(shù)值型(也包括日期型字段)字段在某個數(shù)值區(qū)間內(nèi)的查詢,此時的SQL語句結(jié)構(gòu)如下: SQL=“select 字段列表 from 數(shù)據(jù)表名 where 數(shù)值型字段
between 值1 and值 或者: SQL=“select 字段列表 from 數(shù)據(jù)表名 where 日期型字段
between ‘日期1‘ and ‘日期 【例8-5】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“成績”中,考試成績在80到90之間的研究生記錄查詢出來并復(fù)制到Excel工作表。 Public Sub 例8—5()
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)砟承┳侄蔚挠涗?/span>
SQL = " select * from " & mytable & " where 成績 between 80 and 90 "
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 運行上面的程序,就得到如圖8-4所示的結(jié)果。 模糊查詢就是利用like及一些特殊運算符進(jìn)行匹配查詢。比如,要從數(shù)據(jù)表“研究生”中查詢所有姓張的研究生記錄,SQL語句如下: SQL=“select *
from 研究生 where 姓名 like ‘張%’” 【例8-6】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,查詢所有姓張的研究生記錄,SQL語句如上所示,而程序的其他部分與【例8-4】完全相同。運行上面的程序,就得到如圖8-6所示的結(jié)果。 【例8-7】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“導(dǎo)師”中,查詢所有的職稱名稱含有“教授”字樣的導(dǎo)師記錄: Public Sub 例8—7()
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 = "導(dǎo)師"
'指定數(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)砟承┳侄蔚挠涗?/span>
SQL = " select * from " & mytable & " where 職稱 like '%教授%'"
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 注意,由于是查詢字符類型字段,因此要用單引號將條件值括起來,即:‘%教授%’。運行上面的程序,就得到如圖8-7所示的結(jié)果。 是否為空查詢,就是利用is null或is not
null判斷某個字段的值是否為空值。此時的SQL語句結(jié)構(gòu)如下: SQL=“select 字段列表 from 數(shù)據(jù)表名 where 某字段 is nul ” 或者: SQL=“select 字段列表 from 數(shù)據(jù)表名 where 某字段 is not
nul” 【例8-8】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,研究方向為空值(意思就是目前還沒有研究方向)的研究生記錄查詢出來并復(fù)制到Excel工作表。 Public Sub 例8—8()
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)砟承┳侄蔚挠涗?/span>
SQL = " select * from " & mytable & " where 研究方向 is null"
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 運行上面的程序,就得到如圖8-8所示的結(jié)果。 如果要查詢出已經(jīng)確定了研究方向的研究生記錄,則SQL語句如下: SQL=“select *
from ” & mytable & “wherr 研究方向 is not null” 8.4 復(fù)雜條件查詢 所謂復(fù)雜條件查詢,就是在WHERE子句中使用關(guān)系運算符、邏輯運算符和特殊的運算符,構(gòu)建復(fù)雜的條件進(jìn)行查詢。 例如,要查詢所有考試成績在80分以上、課程代碼為200601004的研究生考試記錄,則SQL語句如下: SQL = “select *
from 成績 where 成績> 80
and 課程代碼 =‘ 【例8-9】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“成績”中,查詢所有考試成績在80分以上、課程代碼為200601004的研究生考試記錄,并復(fù)制到Excel工作表。 Public Sub 例8—9()
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)砟承┳侄蔚挠涗?/span>
SQL = " select * from " & mytable & " where 成績> 80 and 課程代碼
='200601004'"
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 運行上面的程序,就得到如圖8-9所示的結(jié)果。 【例8-10】本例是將數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,查詢所有考試成績在80分以上、課程代碼為200601004、并且學(xué)號的前3位字為“A03”的研究生考試記錄,并復(fù)制到Excel工作表。本例的程序代碼與【例8-9】基本相同,唯一不同的是SQL語句,如下所示: SQL = “select *
from ” & mytable_
& “where 成績> 80
and 課程代碼 = ‘200601004‘ and left(學(xué)號,3)=’A03‘” 運行上面的程序,就得到如圖8-10所示的結(jié)果。 8.5 計算條件下的查詢 所謂計算條件下的查詢,就是在WHERE子句中使用計算公式,并將計算公式的結(jié)果作為條件值進(jìn)行查詢。 【例8-11】本例是在數(shù)據(jù)庫“研究生管理”的數(shù)據(jù)表“研究生”中,查詢所有到現(xiàn)在為止入學(xué)滿1年的研究生考試記錄,并復(fù)制到Excel工作表。 Public Sub 例8—11()
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)砟承┳侄蔚挠涗?/span>
SQL = " select * from " & mytable & " where
datediff(yy,入學(xué)日期,getdate())>=1"
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 運行上面的程序,就得到如圖8-11所示的結(jié)果。 |
|