【分享成果,随喜正能量】人有两个眼睛,看世间、看万物、看他人,就是看不到自己;能看到别人过失,却看不到自己的缺点;能看到别人的贪婪,却看不到自己的吝啬;能看到别人的愚昧,却看不到自己的无知;能看到别人的目光短浅,却看不到自己的狭隘。人生要多些反思,也要多些扪心自问,认识自己、看清自己。

《VBA数据库解决方案》教程是我推出第二套教程,目前已经是第一版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,教程第一版的修订内容主要是完成所有程序文件的32位和64位OFFICE系统测试。

这套教程共两册,八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是第20讲:VBA数据库应用中SQL语句的表达方式

第二十讲 SQL在VBA中几种常见的表达方式

在之前的讲解中我们从ADO的创建、连接到记录集的操作,已经讲了很多VBA对数据库的实际操作,到这里,读者应该对用VBA操作数据库有了一个清晰的印象,从各个步骤上看我们不难得出一个重要结论:要让ADO有效工作,关键是我们给它发出什么样的SQL指令。

在每一讲的讲解中,我已经简单介绍了SQL的情况。现在我们有必要总结一下VBA中SQL语句的几种常见查询的表达方式。

1 Select 查询表达式 From 数据区域

其中,查询表达式可以是下列之一或其组合,或者多种方式的组合,用逗号搁开:

(1)星号(*)表示数据源的所有字段。

(2)字段名

(3)常量表达式

(4)任何有效的计算表达方式

这类查询的SQL语句我们已经用了非常多了:如 strSQL = “SELECT * FROM 员工信息”

  • 注意点:

1) 有时使用AS重新命名字段名称 当查询表达式使用字段名时,字段名就是其本身,使用常量表达式和任何有效的计算表达方式时,系统将为该字段重新命名一个字段名,这个字段名通常没有意义,这时可以在表达式中使用AS为字段重新命名,当然对字段名也可以通过使用AS为其重新命名。AS并不对查询结果造成实质影响。下面是使用AS的一个例子:strSQL = “Select 班级,姓名 AS 名字,语文+数学+英语 AS 总成绩 from员工信息”

2) 使用DISTINCT删除重复记录

例如:在员工信息表中有重复记录,如果希望若干重复的记录只显示一条,可以使用DISTINCT进行限定。

strSQL = “Selectdistinct* from 员工信息”

例如:数据库中信息参考表内容如下:

上述数据中很多是有重复的。我们可以用下面的代码进行排重处理:

Sub mynz_20_1() 有重复数据,排重 第20讲 结构化查询语言SQL在VBA中的几种常见的查询表达方式

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

Sheets(“20”).Select

Cells.ClearContents

For i = 0 To rsADO.Fields.Count – 1

Sheets(“20”).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(“20”).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

部分代码截图:

运行后显示数据:

2 Select 查询表达式 From 数据区域 Where 条件表达式

这种方式可以通过使用Where可以设置查询条件,查询的条件表达式可以是:

(1)任何逻辑表达式

如:strSQL = “SELECT * FROM 员工信息 WHERE 部门=一厂”

这种查询在之前的讲解中讲过,这里不再举例。

(2)IN/NOT IN ( 表达式1,表达式2,…. ) 注意上面的括号不可少,各表达式用逗号搁开。

查询姓名在括号中列出名单范围内的人,如总数据如下:

我们要显示的是姓名为马17和张11的信息,SQL语句如下:

strSQL = “SELECT * FROM 员工信息 where 姓名 in (马17,张11)” 代码如下:

Sub mynz_20_2() 总数据内的数据指定显示 第20讲 结构化查询语言SQL在VBA中几种常见的查询表达方式

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 * FROM 员工信息 where 姓名 in (马17,张11)”

rsADO.Open strSQL, cnADO, 1, 3

Sheets(“20”).Select

Cells.ClearContents

For i = 0 To rsADO.Fields.Count – 1

Sheets(“20”).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(“20”).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

代码截图和运行结果如下图:

3 Select 查询表达式 From 数据区域 [Where 条件表达式] Order by 排序字段

1) 可以使用Top限制返回行数,可以使用Top限制返回的行数。如:下面语句返回前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 mynz_20_3() 第20讲 结构化查询语言SQL在VBA中几种常见的查询表达方式 排序前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

Sheets(“20”).Select

Cells.ClearContents

For i = 0 To rsADO.Fields.Count – 1

Sheets(“20”).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(“20”).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 上述实例希望读者能自己亲自操作一下。

本讲内容参考程序文件:VBA与数据库操作(第一册).xlsm

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

第7套教程(共三册):《VBA之EXCEL应用》:是对VBA基本的讲解

第1套教程(共三册):《VBA代码解决方案》是入门后的提高教程

第4套教程(16G):VBA代码解决方案之视频(第一套的视频讲解)

第3套教程(共两册):《VBA数组与字典解决方案》:是对数组和字典的专题讲解

第2套教程(共两册):《VBA数据库解决方案》:是对数据库的专题讲解

第6套教程(共两册):《VBA信息获取与处理》:讲解VBA的网络及跨程序应用

第5套教程(共两册):VBA中类的解读和利用:类及接口技术的讲解

第8套教程(共三册):VBA之Word应用(最新教程):word中VBA的利用

上述教程的学习顺序:

① 7→1→3→2→6→5或者7→4→3→2→6→5。

② 7→8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注