第7章無條件查詢
所謂無條件查詢,就是在查詢時不使用WHERE子句設(shè)置任何條件。例如,查詢數(shù)據(jù)表中的全部記錄、查詢某些字段的全部記錄數(shù)據(jù)、查詢不重復(fù)記錄、查詢前n條記錄等。
7.1 范例數(shù)據(jù)庫設(shè)計及使用
為了更好地掌握利用SELECT查詢數(shù)據(jù)庫數(shù)據(jù)的方法,從本章開始,所有的范例數(shù)據(jù)均是以一個數(shù)據(jù)庫“研究生管理”為例,其包含有5個數(shù)據(jù)表:“院系”、“導(dǎo)師”、“研究生”、“課程”和“成績”等,它們的字段設(shè)計分別如表7-1、表7-2、表7-3、表7-4和表7-5所示,所使用的范例數(shù)據(jù)分別如圖7-1~圖7-5所示。
這里注意,導(dǎo)師編號、編輯編號和學(xué)號的前3位數(shù)據(jù)就是院系編號。
表7-1 “院系”數(shù)據(jù)表字段設(shè)計
字段 | 數(shù)據(jù)類型 | 字段長度 | 是否允許為空 |
院系編號 | 文本型Char | 3 | 否,主鍵 |
院系名 | 文本型Char | 12 | 否 |
電話 | 文本型Char | 8 | 否 |
表7-2 “導(dǎo)師”數(shù)據(jù)表字段設(shè)計
字段 | 數(shù)據(jù)類型 | 字段長度 | 是否允許為空 |
導(dǎo)師編號 | 文本型Char | 6 | 否,主鍵 |
姓名 | 文本型Char | 8 | 否 |
性別 | 文本型Char | 2 | 否 |
職稱 | 文本型Char | 6 | 否 |
院系編號 | 文本型Char | 3 | 否 |
表7-3 “研究生”數(shù)據(jù)表字段設(shè)計
字段 | 數(shù)據(jù)類型 | 字段長度 | 是否允許為空 |
學(xué)號 | 文本型Char | 10 | 否,主鍵 |
姓名 | 文本型Char | 8 | 否 |
性別 | 文本型Char | 2 | 否 |
入學(xué)日期 | 日期/時間 Datetime | | 否 |
班級 | 文本型Char | 10 | 否 |
研究方向 | 文本型VarChar | 20 | 是 |
導(dǎo)師編號 | 文本型Char | 6 | 否 |
表7-4 “課程”數(shù)據(jù)表字段設(shè)計
字段 | 數(shù)據(jù)類型 | 字段長度 | 是否允許為空 |
課程代碼 | 文本型Char | 10 | 否,主鍵 |
課程名稱 | 文本型Char | 20 | 否 |
課程名稱 | 文本型Char | 4 | 否 |
學(xué)時 | 整型 smallint | 2 | 否 |
學(xué)分 | 整型 tinyint | 1 | 否 |
授課教師 | 文本型Char | 6 | 否 |
表7-5 “成績”數(shù)據(jù)表字段設(shè)計
字段 | 數(shù)據(jù)類型 | 字段長度 | 是否允許為空 |
學(xué)號 | 文本型Char | 10 | 否 |
課程代碼 | 文本型Char | 10 | 否 |
成績 | 整型 smallint | 2 | 否 |
學(xué)期 | 文本型Char | 20 | 否 |
為了方便讀者學(xué)習(xí),在本書的光盤中收錄了數(shù)據(jù)庫“研究生管理”及其5個數(shù)據(jù)表的范例數(shù)據(jù),只要將光盤的數(shù)據(jù)庫附加到SQL Server服務(wù)器上就可以了。具體步驟如下;
1)單擊Windows的【開始】→【程序】→【Microsoft SQL Server】→【企業(yè)管理器】命令,打開SQLServer的企業(yè)管理器窗口,選擇“數(shù)據(jù)庫”節(jié)點,如圖7-6所示。
2)單擊【操作】→【所有任務(wù)】→【附加數(shù)據(jù)庫】命令,如圖7-7所示,打開【附加數(shù)據(jù)庫】對話框,如圖7-8所示。
3)在“要附加數(shù)據(jù)庫的MDF文件”欄中輸入數(shù)據(jù)庫文件的詳細(xì)路徑和名稱,然后單擊【驗證】按鈕,就得到如圖7-9所示的情形,然后單擊【確定】按鈕,即可將數(shù)據(jù)庫附加到SQL Server服務(wù)器上。
也可以將光盤的實例數(shù)據(jù)庫文件復(fù)制到電腦中,然后單擊【附加數(shù)據(jù)庫】對話框上的按鈕
7.2 查詢表中所有記錄
查詢表中所有記錄的方法有兩種:一種是使用ADO的Connection對象的Excute方法或Recordset對象的Open方法下面的SQL語句:
SQL = “select *from 數(shù)據(jù)表名
set rs = cnn.Execute(SQL)
或者 rs.Open SQL,cnn,adopenKeyset,adLockOptimistic
這里的星號(*)表示表中的所有字段。
另一種方法是直接執(zhí)行查詢表的命令,如下所示:
Set rs = cnn.Execute(數(shù)據(jù)表名)
或者rs.Open數(shù)據(jù)表名,cnn,adOpenKeyset,adLockOptimistic
【例7-1】下面的例子是數(shù)據(jù)庫“研究生管理”中的數(shù)據(jù)表“導(dǎo)師”的全部記錄復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—1()
Dim cnn As New ADODB.Connection
Dim rs As New 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數(shù)據(jù)庫服務(wù)器上指定數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" &mydata
cnn.Open
'查詢?nèi)碛涗?/span>
SQL = "select * from" & mytable
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
Set ws = Nothing
End Sub
運行上面的程序,就得到如圖7-11所示的結(jié)果。
7.3 查詢表中所有記錄的指定字段
查詢表中某些字段的所有記錄,要使用下面的SQL語句:
SQL = “select 字段1,字段2,……from 數(shù)據(jù)表名”
這里,各個字段名之間用逗號隔開。
【例7-2】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“導(dǎo)師”的全部導(dǎo)師的姓名、性別和職稱數(shù)據(jù)查詢出來,并復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—2()
Dim cnn As New ADODB.Connection
Dim rs As New 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數(shù)據(jù)庫服務(wù)器上指定數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?/span>
SQL = "select 姓名,性別,職稱 from" & mytable
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
Set ws = Nothing
End Sub
運行上面的程序,就得到如圖7-12所示的結(jié)果。
7.4 查詢結(jié)果不顯示重復(fù)記錄
在一個數(shù)據(jù)表中,有可能有一些重復(fù)記錄,比如在“成績表”中,每個研究生可能選修了幾門課程,而某個課程也可能被幾個研究生選修。如果我們要想在“成績表”中查詢本學(xué)期研究生共選修了哪些課程,那么就需要將不重復(fù)的課程篩選出來。此時,在SQL語句中要使用DISTINCT關(guān)鍵詞,而SQL語句的結(jié)構(gòu)如下:
SQL = “selectDISTINCT 字段1,字段2,……from 數(shù)據(jù)表名”
【例7-3】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“成績”中的所有課程編號記錄(不包括重復(fù)記錄),并復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—3()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定要修改的數(shù)據(jù)庫
mytable = "成績" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server數(shù)據(jù)庫服務(wù)器上指定數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?/span>
SQL = "select distinct 課程代碼 from" & mytable
Set rs = cnn.Execute(SQL)
'復(fù)制字段名
Range("A1") = rs.fielse(0).Name
Range("A1").Font.Bold = True
'復(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
Set ws = Nothing
End Sub
運行上面的程序,就可以得到如圖7-13所示的結(jié)果。
從圖7-13可以看出本學(xué)期共開設(shè)了哪些調(diào)和。由于在“成績”表中只是課程代碼,為了獲取課程名稱,需要使用多表查詢的方法從“課程”數(shù)據(jù)表中獲取“成績”表中課程代碼所對應(yīng)的課程名稱,具體方法可參閱第14章的有關(guān)內(nèi)容。
7.5 查詢前n條記錄
如果要查詢數(shù)據(jù)表中的前n條記錄,那么就需要在SQL語句中使用TOP關(guān)鍵詞,此時的SQL語句結(jié)構(gòu)如下所示:
SQL = “select TOPn 字段1,字段2……from 數(shù)據(jù)表名”
【例7-4】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“成績”中的前5行記錄,并復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—4()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定要修改的數(shù)據(jù)庫
mytable = "成績" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?/span>
SQL = "select top 5 from" & mytable
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
Set ws = Nothing
End Sub
運行上面的程序,就得到如圖7-14所示的結(jié)果。
7.6 查詢前百分?jǐn)?shù)n的記錄
如果要查詢數(shù)據(jù)表中的前百分?jǐn)?shù)n的記錄,那么就需要在SQL語句中使用PERCENT關(guān)鍵詞,此時的SQL語句結(jié)構(gòu)如下所示。
SQL = “select TOPn PERCENT 字段1,字段2,……from 數(shù)據(jù)表名”
【例7-5】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“成績”中的前30%的數(shù)據(jù)記錄,并復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—5()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定要修改的數(shù)據(jù)庫
mytable = "成績" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?/span>
SQL = "select top 30 from" & mytable
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
Setcnn = Nothing
End Sub
運行上面的程序,就得到如圖7-15所示的結(jié)果。
7.7 將表達(dá)式作為查詢字段進(jìn)行查詢
在查詢SQL語句中,我們還可以使用表達(dá)式作為查詢字段進(jìn)行查詢,這里的表達(dá)式可以是由各種運算符和函數(shù)構(gòu)成。這樣,我們就可以進(jìn)行更加復(fù)雜的查詢,獲取需要的各種數(shù)據(jù)。
為了使表達(dá)式返回值的意義清楚,我們可以使用AS為表達(dá)式的結(jié)果命名一個別名,即“表達(dá)式 AS 別名”。
將表達(dá)式作為查詢字段進(jìn)行SQL語句結(jié)構(gòu)如下:
SQL = “select 表達(dá)式1 as 別名1,表達(dá)式2 as 別名2,字段1,字段2,……from 數(shù)據(jù)表名”
這里的表達(dá)式與數(shù)據(jù)表的原字段順序排列可以是任意的。
【例7-6】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“研究生”中的各個研究生的入學(xué)年份和月份,并復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—6()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定要修改的數(shù)據(jù)庫
mytable = "研究生" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?/span>
SQL = "select 姓名,性別,year(入學(xué)日期) as 入學(xué)年份," _
& "month(入學(xué)日期) as 入學(xué)月份from" & mytable
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
運行上面的程序,就得到如圖7-16所示的結(jié)果。
7.8 將查詢結(jié)果以別名輸出
除了可以為表達(dá)式命名別名外,我們還可以對數(shù)據(jù)表的原字段命名別名,即輸出結(jié)果不是原字段名,而是一個新的名稱,此時的SQL語句的結(jié)構(gòu)如下:
SQL = “select 字段1 as 別名1,字段2 as 別名2,字段3 as 別名3,……from 數(shù)據(jù)表名”
【例7-7】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“研究生”中的各個研究生的姓名、性別、班級等名稱以“Name”、“Sex”、“Class”名稱輸出復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—7()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理" '指定要修改的數(shù)據(jù)庫
mytable = "研究生" '指定數(shù)據(jù)表
'清除工作表的所有數(shù)據(jù)
Cells.Clear
'建立與SQL Server數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄蔚挠涗?/span>
SQL = "select 姓名 as Name,性別 as Sex,班級 as Classno from" & mytable
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
運行上面的程序,就得到如圖7-17所示的結(jié)果。
7.9 將字段合并并以別名查詢輸出
我們可以在SELECT語句中利用加號(+)將某些字段進(jìn)行合并,形成一個新字段,并以一個別名輸出,此時的SQL語句的結(jié)構(gòu)如下:
SQL = “select字段1+字段2+……as 別名 from 數(shù)據(jù)表名”
【例7-8】下面的例子是查詢“研究生管理”中的數(shù)據(jù)表“導(dǎo)師”中,將導(dǎo)師的姓名和職稱組成一個新列,并以一個別名“全稱”輸出復(fù)制到Excel工作表。
在運行下面的程序之前,要確保已經(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 例7—8()
Dim cnn As New ADODB.Connection
Dim rs As New 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數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查詢?nèi)砟承┳侄尾⒑喜橐粋€記錄
SQL = "select 姓名 + 職稱 as 全稱 from" & mytable
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
運行上面的程序,就得到如圖7-18所示的結(jié)果。
7.10 合并查詢
我們可以使用UNION子句將多個SQL命令連接起來生成單個SQL無法做到的結(jié)果集合。此時的SQL語句的結(jié)構(gòu)如下:
SQL = “第1個SELECT語句 UNION第2個SELECT語句”
需要注意的是:
1)使用UNION連接的SELECT必須有相同的輸出表達(dá)式,即對應(yīng)欄目應(yīng)具有相同的數(shù)據(jù)類型和字段長度。
2)僅最后一個SELECT可以帶ORDER BY及INTO子句。
3)UNION不能連接嵌套的SELECT語句。
【例7-9】下面的例子是查詢所有的導(dǎo)師和研究生的姓名和性別,并輸出復(fù)制到Excel工作表。
Public Sub 例7—9()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String
'建立與SQL Server數(shù)據(jù)庫的連接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=研究生管理"
cnn.Open
'查詢數(shù)據(jù)
SQL = "select 姓名,性別 from 導(dǎo)師 " _
& " union " _
& " select 姓名,性別 from 研究生"
Set rs = cnn.Execute(SQL)
'復(fù)制查詢出的數(shù)據(jù)
Cells.Clear
Range("A1:B1") = Array("姓名","性別")
Range("A1:B1").Font.Bold = True
Range("A2").CopyFromRecordset rs
'字段設(shè)置列寬至合適的寬度
Columns.AutoFit
'關(guān)機(jī)記錄集以及與數(shù)據(jù)庫的連接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub