結構化查詢語言SQL在VBA中幾種常見的查詢表達方式

2020-12-12 VBA語言專家

在之前的講解中我們從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 上述實例希望讀者能自己親自操作一下。

相關焦點

  • SQL基礎培訓--SQL語言基本概念及簡單查詢
    什麼是SQL語句,及簡單的寫法sql 語句是對資料庫進行操作的一種語言。結構化查詢語言(Structured Query Language)簡稱SQL,結構化查詢語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係資料庫系統。
  • spark結構化數據處理:Spark SQL、DataFrame和Dataset
    SQL使用Spark SQL的一種方式就是通過SQL語句來執行SQL查詢。當在程式語言中使用SQL時,其返回結果將被封裝為一個DataFrame。但是在有些情況下RDD可以表達的邏輯用DataFrame無法表達,所以後續提出了Dataset API,Dataset結合了RDD和DataFrame的好處。
  • sql常見的幾種連接查詢
    在 FROM子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外連接的結果集包括  LEFT OUTER子句中指定的左表的所有行,而不僅僅是連接列所匹配的行。
  • 資料庫分頁查詢的幾種實現思路
    筆者曾經就遇到過這種問題,應用中有些代碼調用了startPage方法,忘記在finally塊中清除,結果導致某些select count(*) from t之類的sql被框架轉換套上count之後報錯。
  • 在 Linux 上用 SQL 語句查詢 Apache 日誌
    我們將在這篇文章中著重講解 Apache HTTP web server 生成的 Apache access 日誌。這次,我們會通過另類的途徑來分析 Apache access 日誌,我們使用的工具是 asql。asql 是一個開源的工具,它能夠允許使用者使用 SQL 語句來查詢日誌,從而通過更加友好的格式展現相同的信息。
  • 資料庫之SQL查詢語句
    SQL(Structured Query Language) :結構化查詢語言 SQL是在關係資料庫上執行數據操作
  • 用Select×進行SQL查詢的七宗罪
    【51CTO.com快譯】如今,網上許多文章都已明確地指出:使用「SELECT * 」作為SQL查詢方式是一種極其危險的代碼書寫習慣。開發人員應該儘量在自己的程序中避免出現此類查詢,取而代之的應該是明確地指定要查詢的列名。不過,大家可能只是「知其然,而不知其所以然」。
  • SQL查詢語句場景應用
    SQL(Structured Query Language 結構化查詢語言 )是一種特殊目的的程式語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢
  • MyBatis系列:模糊查詢的4種實現方式
    >步驟三:分析 此種方式需要在調用處手動的去添加「%」通配符。1.2、方式二說明: 使用方式一可以實現模糊查詢,但是有一點不方便的地方就是:在測試類中,調用selectList()方法傳參時需要調用者手動的添加%號通配符,顯然是麻煩的,能否在映射配置文件中直接將%號寫好呢?
  • 通過 SQL 查詢學習 Pandas 數據處理
    作者:張吉來源:http://shzhangji.com/cnblogs/2017/07/23/learn-pandas-from-a-sql-perspective/Pandas 是一款廣泛使用的數據處理工具。
  • 一次神奇的 sql 查詢經歷,group by 慢查詢優化記錄
    一、問題背景  現網出現慢查詢,在500萬數量級的情況下,單表查詢速度在30多秒,需要對sql進行優化,sql如下:  我在測試環境構造了500萬條數據,模擬了這個慢查詢。  簡單來說,就是查詢一定條件下,都有哪些用戶的,很簡單的sql,可以看到,查詢耗時為37秒。
  • sql子查詢面試題
    這是《從零學會sql》系列課程第4節課《複雜查詢》的練習題,也是常考常考的面試題。
  • SQL語句面試題目:一般查詢和高級子查詢(上)
    查詢平均工資高於公司平均工資的部門有哪些? 9. 查詢出公司中所有manager 的詳細信息.  10. 各個部門中 最高工資中最低的那個部門的 最低工資是多少 11. )  FROMemployees)   9.查詢出公司中所有 manager的詳細信息.
  • Excel VBA+ADO+SQL入門教程003:SQL查詢中欄位技巧的總結
    查詢按照複雜性劃分,可以從一個簡單的語句返回所有表中所有的記錄,到用一個語句連結多個表並定義多種搜索條件……現在,就讓我們從最簡單的部分走起吧——走你,少年。倘若數據源是Excel表格,需要在表名後增加美元符號$,並用中括號包起來,例如[Sheet1$]。另外需要說明的是,SQL語言對關鍵字大小寫不敏感。
  • 優化SQL查詢:如何寫出高性能SQL語句
    執行計劃是資料庫根據SQL語句和相關表的統計信息作出的一個查詢方案,這個方案是由查詢優化器自動分析產生的,比如一條SQL語句如果用來從一個 10萬條記錄的表中查1條記錄,那查詢優化器會選擇「索引查找」方式,如果該表進行了歸檔,當前只剩下5000條記錄了,那查詢優化器就會改變方案,採用 「全表掃描」方式。
  • Mysql中一條SQL查詢語句是如何執行的?
    2.查詢流程解析select * from table1 where ID=10;這條語句相信大家再熟悉不過了,下面我們就看看這一條語句在mysql中是怎麼執行的。第一步:一條sql語句要經過連接器,客戶端要和mysql建立連接。
  • 產品經理學SQL(二)一天學會用SQL解決業務查詢問題
    本篇文章意在幫助大家系統地入門SQL,教大家如何解決sql查詢任務。前言回顧一下,上一篇文章我們已經知道了SQL語言的基本框架,並能完成簡單的單表查詢和雙表連接查詢。這篇文章希望能幫助你系統地入門SQL,從而解決產品經理80%的sql查詢任務。和上篇的一個小時入門SQL一樣,這篇文章的建議學習時間為一天。
  • VBA如何處理多條件查詢?
    再如下圖所示,表名為「查詢表」的數據是需要查詢的數據。現在我們需要根據查詢表的姓名和課目兩個條件,在明細表中查詢相關的成績對於VBA來說,處理這樣的問題總是有一個固定的套路,確定條件關係後,將明細數據循環裝入字典,其中明細表的條件作為關鍵字(Key),需要查詢的結果作為條目(Item),最後遍歷查詢表,根據提取相應的結果。
  • Oracle常用經典SQL查詢(一)
    註:本文的查詢測試以oracle11.2.0.4.0企業版作為查詢測試,截圖只是為了證明SQL的可用性及正確性,查詢結果因測試環境不同各有差異
  • MySQL如何完成一次查詢?
    MySQL相信大家都不陌生,是一種關係型資料庫,通過sql語言操作數據的增刪改查。那麼從發出一條sql指令到返回結果mysql都做了什麼事情呢?