在之前的講解中我們從ADO的創建、連接到記錄集的操作,已經講了很多VBA對資料庫的實際操作了,到這裡,讀者應該對用VBA操作資料庫有了一個清晰的印象,從各個步驟上看我們不難得出一個重要結論:要讓ADO有效工作,關鍵是我們給它發出什麼樣的SQL指令。
在每一講的講解中,我已經簡單介紹了SQL的情況。現在我們有必要總結一下VBA中SQL語句的幾種常見查詢的表達方式。
方式一:Select 查詢表達式 From 數據區域
其中,」查詢表達式」可以是下列之一或其組合,對多種方式的組合,用逗號擱開:
(1)星號(*)表示「數據源」的所有欄位。
(2)欄位名
(3)常量表達式
(4)任何有效的計算表達方式
這類查詢的SQL語句我們已經用了非常多了:如 strSQL = "SELECT * FROM 員工信息"
注意點:
1 有時使用AS重新命名欄位名稱 當查詢表達式使用(2)欄位名時,欄位名就是其本身,使用(3)常量表達式和(4)任何有效的計算表達方式時,系統將為該欄位重新命名一個欄位名,這個欄位名通常沒有意義,這時可以在表達式中使用AS為欄位重新命名,當然對欄位名也可以通過使用AS為其重新命名。AS並不對查詢結果造成實質影響。下面是使用AS的一個例子:strSQL = "Select 班級,姓名 AS 名字,語文+數學+英語 AS 總成績 from員工信息"
2 使用DISTINCT刪除重複記錄
例如:在「員工信息」表中有重複記錄,如果希望若干重複的記錄只顯示一條,可以使用DISTINCT進行限定。
strSQL = "Select distinct * from 員工信息"
例如:資料庫中員工信息表內容如下:
上述數據中很多是有重複的。我們可以用下面的代碼進行排重處理:
Sub mynzdate_2() '有重複數據,排重
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.RecordSet")
strPath = ThisWorkbook.Path & "\mydata2.accdb"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
'strSQL = "SELECT * FROM 信息參考"
strSQL = "Select distinct * from 信息參考"
rsADO.Open strSQL, cnADO, 1, 3
Cells.ClearContents
For i = 0 To rsADO.Fields.Count - 1
Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
Next i
For i = 1 To rsADO.RecordCount
For j = 0 To rsADO.Fields.Count - 1
Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
Next j
rsADO.MoveNext
Next i
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代碼截圖:
運行後顯示數據:
方式二 Select 查詢表達式 From 數據區域 Where 條件表達式,通過使用Where可以設置查詢條件。
查詢的條件表達式可以是:
(1)任何邏輯表達式
如:strSQL = "SELECT * FROM 員工信息 WHERE 部門='一廠'"
這種查詢在之前的講解中講過,這裡不再舉例。
(2)IN/NOT IN ( 表達式1,表達式2,…. ) 注意上面的括號不可少,各表達式用逗號擱開。
'查詢姓名在括號中列出名單範圍內的人,如總數據如下:
我們要顯示的是姓名為劉1和朱5的信息,SQL語句如下:
strSQL = "SELECT * FROM 員工信息 where 姓名 in ('劉1','朱5')" 代碼如下:
Sub mynzdata_4() '總數據內的數據指定顯示
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.RecordSet")
strPath = ThisWorkbook.Path & "\mydata2.accdb"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
strSQL = "SELECT * FROM 員工信息 where 姓名 in ('劉1','朱5')"
rsADO.Open strSQL, cnADO, 1, 3
Cells.ClearContents
For i = 0 To rsADO.Fields.Count - 1
Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
Next i
For i = 1 To rsADO.RecordCount
For j = 0 To rsADO.Fields.Count - 1
Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
Next j
rsADO.MoveNext
Next i
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
三 Select 查詢表達式 From 數據區域 [Where 條件表達式] Order by 排序欄位。同時可以使用Top限制返回行數,可以使用Top限制返回的行數。
1 下面語句返回前2條記錄。
Sql = "Select top 2 * from 員工信息"
2 通過使用Order by可以對查詢結果按一列或多列進行排序。
'首先按語文成績降序排列,語文成績相同的按數學成績升序排列
Sql = "Select * from學生信息Order by 語文 desc,數學 asc"
備註:ASC是升序排列,在不指定排序方式的情況下是默認的,因此可以省略
如員工信息中我們要顯示的是,按生日排序的前5人 SQL語句如下:
strSQL = "SELECT Top 5 * FROM 員工信息 Order by 出生日期 asc"
代碼:
Sub mynzdata_5() '排序前5名顯示
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Dim i As Integer
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.RecordSet")
strPath = ThisWorkbook.Path & "\mydata2.accdb"
cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath
strSQL = "SELECT Top 5 * FROM 員工信息 Order by 出生日期 asc"
rsADO.Open strSQL, cnADO, 1, 3
Cells.ClearContents
For i = 0 To rsADO.Fields.Count - 1
Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
Next i
For i = 1 To rsADO.RecordCount
For j = 0 To rsADO.Fields.Count - 1
Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
Next j
rsADO.MoveNext
Next i
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
顯示的結果:
今日內容回向:
1 本講講了幾種常用的SQL查詢,讀者是否明白?
2 上述實例希望讀者能自己親自操作一下。