其中,”查询表达式”可以是下列之一或其组合,或者多种方式的组合,用逗号搁开:(1)星号(*)表示“数据源”的所有字段。(2)字段名(3)常量表达式(4)任何有效的计算表达方式这类查询的SQL语句我们已经用了非常多了:如 strSQL = "SELECT * FROM 员工信息"l注意点:1) 有时使用AS重新命名字段名称 当查询表达式使用“字段名”时,字段名就是其本身,使用“常量表达式”和“任何有效的计算表达方式”时,系统将为该字段重新命名一个字段名,这个字段名通常没有意义,这时可以在表达式中使用AS为字段重新命名,当然对字段名也可以通过使用AS为其重新命名。AS并不对查询结果造成实质影响。下面是使用AS的一个例子:strSQL = "Select 班级,姓名 AS 名字,语文+数学+英语 AS 总成绩 from员工信息"2) 使用DISTINCT删除重复记录例如:在“员工信息”表中有重复记录,如果希望若干重复的记录只显示一条,可以使用DISTINCT进行限定。 strSQL = "Select distinct * 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 = NothingEnd 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 = NothingEnd 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 = NothingEnd Sub代码截图: 显示的结果: 今日内容回向:1 本讲讲了几种常用的SQL查询,读者是否明白?2 上述实例希望读者能自己亲自操作一下。