模擬sql
A. access2013 VBA中怎樣運行sql語句
sql在vba里的運用比較專業需要認真的學習研究一下,給你詳細一點的資料和一個實例
你自己學著模擬練習一下
一、簡單的查詢
1、建立查詢
數據選項卡—現有連接—瀏覽更多或者按快捷鍵Alt+D+D+D
選擇要查詢的Excel文件和文件中的的工作表,就可以將相應工作表的數據取過來。表現形式可以是表,也可以是數據透視表等。
2、SQL查詢語句
如果是挑選部分列數據,就需要用SQL語句(取所有數據也可以用SQL語句)。
建立查詢時,選擇工作表後不要點擊「確定」按鈕,而是先點擊「屬性」按鈕,彈出窗口中選擇「定義」選項卡,在命令文本框中輸入SQL查詢語句(原來的工作表名稱,表示所有數據,可以認為是取所有數據的SQL的一種特殊寫法):
Select欄位列表from[工作表名$]
--其中欄位列表就是需要選擇的欄位,數據源用工作表名稱加「$「再用中括弧括起來,例如:
selectprov_name,city_name,xs_mc,xs_codefrom[Sheet1$]
select*from[Sheet1$]--取所有數據
偶然發現,欄位名不能用no,估計是保留字,如需要,用中括弧括起來,例如:
select[no],prov_name,city_name,xs_mc,xs_codefrom[Sheet1$]
欄位名中含有特殊字元的也要用中括弧括起來,如/?空格等
Excel查詢沒有偽表概念,對於表達式的計算直接用select既可,例如
Select23+45--返回68
Selectdate()--返回當前日期
3、修改查詢語句
方法:點擊右鍵—彈出菜單—表格—編輯查詢
通過修改SQL語句可以變更所取的數據,也可以將建立查詢時的簡單SQL語句改成復雜的SQL語句。
欄位名更換:如果想換個欄位名,用「as新欄位名」既可,例如:
selectprov_nameas省,city_nameas城市,xs_mcas縣市,xs_codeas編碼from[Sheet1$]
非正常表格:數據區域(含欄位名)不在第一行
需要在工作表名稱後面指定數據范圍,例如:
selectprov_name,city_name,xs_mc,xs_codefrom[Sheet1$B2:G2000]
或者,將數據塊定義為一個名稱,假設定義為mydata,SQL語句如下:
selectprov_name,city_name,xs_mc,xs_codefrommydata
注意:使用名稱時沒有$符號,也沒有方括弧了。
數據更新:數據源發生變化,需要更新數據,方法:點擊右鍵—彈出菜單—刷新
意外:如果打開Excel文件後彈出不是選擇工作表的窗口而是一個「數據連接屬性」窗口,可以關閉這個窗口,然後將Excel應用極小化再極大化方式消除,或者在彈出選擇文件的窗口時,退回上一級文件夾,刪除那個Queries文件夾,就行了。
二、復雜的查詢
1、多表聯合
相同結構的多個表合並到一起,用union連接SQL語句,例如:
Select*from[財務部$]unionallSelect*from[市場部$]
Union是去重復的,即相同的記錄保留一個(類似distinct),Unionall則是直接相加兩個結果,不去重復。
增加一個部門欄位可以將查詢結果中的區分開來,以便知道數據來自哪個表。Union的三個一致,即:欄位的數量、類型和順序。例如:
Select「財務部」as部門,*from[財務部$]unionallSelect「市場部」as部門,*from[市場部$]
多表聯合查詢
Select*from[部門$]bm,[員工$]ygwherebm.部門編碼=yg.部門編碼跨工作簿查詢果數據不僅來自不同的工作表,還來自不同的文件,一樣可以用union聯合,例如:
Select「分公司1」as公司,「財務部」as部門,*from[F:SQL之Excel應用分公司1.xlsx].[財務部$]unionall
Select「分公司1」as公司,「市場部」as部門,*from[F:SQL之Excel應用分公司1.xlsx].[市場部$]unionall
Select「分公司2」as公司,「財務部」as部門,*from[F:SQL之Excel應用分公司2.xlsx].[財務部$]unionall
Select「分公司2」as公司,「市場部」as部門,*from[F:SQL之Excel應用分公司2.xlsx].[市場部$]
因為SQL中已經指定了文件名和表名,所以建立連接時連接誰並不重要,這種情況下,建立連接的時候就連接自己,然後再改寫SQL語句。
SubUsingSQL()
DimSqlAsString
DimjAsInteger
DimrAsInteger
DimCnnAsADODB.Connection
DimrsAsADODB.Recordset
WithSheet1
.Cells.Clear
SetCnn=NewADODB.Connection
WithCnn
.Provider="Microsoft.ACE.OLEDB.12.0"
.ConnectionString="ExtendedProperties=Excel12.0;"_
&"DataSource="&ThisWorkbook.Path&"數據.xlsx"
.Open
EndWith
Setrs=NewADODB.Recordset
Sql="Select*From[Sheet1$]"
rs.OpenSql,Cnn,adOpenKeyset,adLockOptimistic
Forj=0Tors.Fields.Count-1
.Cells(1,j+1)=rs.Fields(j).Name
Next
r=.Cells(.Rows.Count,1).End(xlUp).Row
.Range("A"&r+1).CopyFromRecordsetrs
EndWith
rs.Close
Cnn.Close
Setrs=Nothing
SetCnn=Nothing
EndSub