万博广场:第8章 条件查询

来源:百度文库 编辑:偶看新闻 时间:2024/05/02 06:08:39
所谓条件查询,就是在SELECT语句中使用WHERE子句。因为在实际工作中,我们碰到的大多数情况是按照一定的条件进行查询的,因此条件查询是使用最多的查询。
8.1 WHERE条件子句的语法结构
带有WHERE条件子句的SELECT语句的结构如下:
SQL = “select 字段列表 from 数据表名 where 条件表达式”
这里,条件表达式是由各种字段、常量、表达式、关系运算符、逻辑运算符和特殊的运算符组合起来的。
在条件表达式中,各个条件的条件值依数据类型的不同要用不同的方式表示:对于数值类型的条件值,直接写上条件值即可,比如“WHERE学分=3”;对于文本类型和日期类型的条件值,要用单引号括起来,比如单引号“’”括起来,如“WHERE 姓名=‘黄小立’”,“WHERE入学日期=‘2006-9-1’”。
8.2 WHERE条件子句中的运算符
WHERE条件子句中的运算符包括关系运算符、逻辑运算符和特殊的运算符。
8.2.1 关系运算符
关系运算符用来表示两个表达式之间的关系。WHERE条件子句中的可使用的关系运算符如表8-1所示。
表8-1  比较运算符及其含义
运算符
含义
=
等于,用于测试两个表达式是否相等
>
大于,用于测试一个表达式是否大于另一个表达式
<
小于,用于测试一个表达式是否大于另一个表达式
>=
大于或等于,用于测试一个表达式是否大于或等于另一个表达式
<=
小于或等于,用于测试一个表达式是否小于或等于另一个表达式
<>
不等于,用于测试一个表达式是否不等于另一个表达式
!=
不等于(非SQL-92标准),用于测试一个表达式是否不等于另一个表达式
!<
不小于(非SQL-92标准),用于测试一个表达式是否不小于另一个表达式
!>
不大于(非SQL-92标准),用于测试一个表达式是否不大于另一个表达式
8.2.2 逻辑运算符
逻辑运算符用来表示两个表达式之间的逻辑关系。逻辑运算符返回带有TRUE、FALSE或UNKNOWN值的Boolean数据类型。WHERE条件子句中的可使用的逻辑运算符如表8-2所示。
表8-2 逻辑运算符及其含义
运算符
含义
ALL
如果一组值的比较都为TRUE,那么就为TRUE
AND
如果两个布尔表达式都为TRUE,那么就为TRUE
ANY
如果一组值的比较中任何一个为TRUE,那么就为TRUE
BETWEEN
如果操作数在某个范围之内,那么就为TRUE
EXISTS
如果子查询包含一些行,那么就为TRUE
IN
如果操作数等于表达式列表中的一个,那么就为TRUE
LIKE
如果操作数与一种模式相匹配,那么就为TRUE
NOT
对任何其他布尔运算符的值取反
OR
如果两个布尔表达式中的一个为TRUE, 那么就为TRUE
SOME
如果在一组值比较中,有些为TRUE, 那么就为TRUE
8.2.3 特殊运算符
特殊运算符用来进行特殊的运算,比如判断是否为空、进行模糊查询等。WHERE条件子句中的可使用的特殊运算符如表8-3所示。
表8-3   SQL命令中搜索条件运算符的汇总
运算符
含义
%
通配符,代表任意多个字符。例如,WHERE字段名LIKE’%a%’表示所有含有字母“A”的字段数据
-
通配符,代表严格的一个字符。例如,WHERE字段名LIKE’__AB’表示所有4个字母的数据中以“AB”结尾的字段数据
[]
指定范围内的任意单个字符。例如,WHERE字段名LIKE’[BC]%’表示所有以“B”或“C”开头的字段数据
[^]
不属于指定范围或集合的任何单个字符。例如,WHERE字段名LIKE[B^a]%’表示所有以“B”开头,且第2个字母不是“a”的字段数据
BETWEEN
测试值的范围,使用AND将开始值与结束值分开。例如,WHERE字段名BETWEEN 50 AND 100表示所有的50(含50)和100(含100)之内的字段数据
LIKE[NOT]LIKE
字段匹配符(通常只限于字符数据类型)
IS[NOT]NULL
测试字段的数据或表达式的结果是否为空
[NOT]IN
一个字段的直是否在一组定义的值之中,匹配特定值的列表
ANY(SOME)
子查询结果集中的一个或多个行是否满足指定的条件
ALL
子查询结果集的所有行是否都满足指定的条件
[NOT]EXISTS
子查询是否返回任何结果(不只是特定的结果)
8.3 单条件查询
所谓单条件查询,就是在WHERE子句中只有一个条件。下面介绍常见的几种单条件查询。
8.3.1 等于或不等于查询
等于或不等于查询,就是WHERE子句中使用表8-1的比较运算符进行单条件查询,此时的SQL语句结构如下:
SQL = “select 字段列表 from 数据表名 where 某字段 (等于或不等于) 条件值”
【例8-1】下面的例子是查询“研究生管理”中的数据表“研究生”的全部男研究生记录查询出来并复制到Excel工作表。
在运行下面的程序之前,要确保已经引用了ADO对象库MicrosoftActive Data Objects 2.5 Library或其他版本(如Microsoft Active Data Objects 2.1 Library、Microsoft Active Data Objects 2.8 Library等)。同时,还要根据电脑实际情况,将连接字符串中的SQL Server服务器名称进行变更,并输入相应的用户名和密码(如果有的话)。
Public Sub 例8—1()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "研究生"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'检查全表某些字段的记录
SQL = " select * from " & mytable & " where 性别='男'"
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图8-1所示的结果。

【例8-2】本例是将数据库“研究生管理”中的数据表“成绩”的全部考试成绩分数在90分以上的研究生记录查询出来并复制到Excel工作表。本例的程序与【例8-1】基本相同,唯一区别在于SQL语句,如下所示:
SQL = “select *from ” & mytable & “ where 成绩 >90”
运行上面的程序,就得到如图8-2所示的结果。

8.3.2 列表(in或not in)查询
就是判断一个字段的值是否在一组定义的值之中,此时的SQL语句结构如下:
SQL = “select 字段列表 from 数据表名 where 某字段 in(值1,值2,……)”
或者:
SQL = “select 字段列表 from 数据表名 where 某字段 not in(值1,值2,……)”
【例8-3】本例是将数据库“研究生管理”的数据表“研究生”中,研究方向为“风险投资”或者“项目投资”研究生记录查询出来并复制到Excel工作表。
Public Sub 例8—3()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "研究生"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查询全表某些字段的记录
SQL = " select * from " & mytable & " where 研究方向 in ('风险投资','项目投资')"
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图8-3所示的结果。

【例8-4】本例是将数据库“研究生管理”的数据表“研究生”中,研究方向不为“风险投资”或者“项目投资”研究生记录查询出来并复制到Exce工作表。本例的程序与【例8-3】基本相同,唯一区别在于SQL语句,如下所示:
SQL=“select *from” & mytable & “ where 研究方向 not in (‘风险投资’,’项目投资’)“
运行上面的程序,就得到如图8-4所示的结果。

8.3.3 介于(between)查询
介于查询用于完成数值型(也包括日期型字段)字段在某个数值区间内的查询,此时的SQL语句结构如下:
SQL=“select 字段列表 from 数据表名 where 数值型字段between 值1 and值2”
或者:
SQL=“select 字段列表 from 数据表名 where 日期型字段between ‘日期1‘ and ‘日期2’”
【例8-5】本例是将数据库“研究生管理”的数据表“成绩”中,考试成绩在80到90之间的研究生记录查询出来并复制到Excel工作表。
Public Sub 例8—5()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "成绩"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查询全表某些字段的记录
SQL = " select * from " & mytable & " where 成绩 between 80 and 90 "
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图8-4所示的结果。

8.3.4 模糊(like)查询
模糊查询就是利用like及一些特殊运算符进行匹配查询。比如,要从数据表“研究生”中查询所有姓张的研究生记录,SQL语句如下:
SQL=“select *from 研究生 where 姓名 like ‘张%’”
【例8-6】本例是将数据库“研究生管理”的数据表“研究生”中,查询所有姓张的研究生记录,SQL语句如上所示,而程序的其他部分与【例8-4】完全相同。运行上面的程序,就得到如图8-6所示的结果。

【例8-7】本例是将数据库“研究生管理”的数据表“导师”中,查询所有的职称名称含有“教授”字样的导师记录:
Public Sub 例8—7()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "导师"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查询全表某些字段的记录
SQL = " select * from " & mytable & " where 职称 like '%教授%'"
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
注意,由于是查询字符类型字段,因此要用单引号将条件值括起来,即:‘%教授%’。运行上面的程序,就得到如图8-7所示的结果。

8.3.5 是否为空(is null或is not null)查询
是否为空查询,就是利用is null或is notnull判断某个字段的值是否为空值。此时的SQL语句结构如下:
SQL=“select 字段列表 from 数据表名 where 某字段 is nul ”
或者:
SQL=“select 字段列表 from 数据表名 where 某字段 is notnul”
【例8-8】本例是将数据库“研究生管理”的数据表“研究生”中,研究方向为空值(意思就是目前还没有研究方向)的研究生记录查询出来并复制到Excel工作表。
Public Sub 例8—8()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "研究生"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString ="Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查询全表某些字段的记录
SQL = " select * from " & mytable & " where 研究方向 is null"
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图8-8所示的结果。

如果要查询出已经确定了研究方向的研究生记录,则SQL语句如下:
SQL=“select *from ” & mytable & “wherr 研究方向 is not null”
8.4 复杂条件查询
所谓复杂条件查询,就是在WHERE子句中使用关系运算符、逻辑运算符和特殊的运算符,构建复杂的条件进行查询。
例如,要查询所有考试成绩在80分以上、课程代码为200601004的研究生考试记录,则SQL语句如下:
SQL = “select *from 成绩 where 成绩> 80and 课程代码 =‘200601004’”
【例8-9】本例是将数据库“研究生管理”的数据表“成绩”中,查询所有考试成绩在80分以上、课程代码为200601004的研究生考试记录,并复制到Excel工作表。
Public Sub 例8—9()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "成绩"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查询全表某些字段的记录
SQL = " select * from " & mytable & " where 成绩> 80 and 课程代码='200601004'"
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图8-9所示的结果。

【例8-10】本例是将数据库“研究生管理”的数据表“研究生”中,查询所有考试成绩在80分以上、课程代码为200601004、并且学号的前3位字为“A03”的研究生考试记录,并复制到Excel工作表。本例的程序代码与【例8-9】基本相同,唯一不同的是SQL语句,如下所示:
SQL = “select *from ” & mytable_
& “where 成绩> 80and 课程代码 = ‘200601004‘ and left(学号,3)=’A03‘”
运行上面的程序,就得到如图8-10所示的结果。

8.5 计算条件下的查询
所谓计算条件下的查询,就是在WHERE子句中使用计算公式,并将计算公式的结果作为条件值进行查询。
【例8-11】本例是在数据库“研究生管理”的数据表“研究生”中,查询所有到现在为止入学满1年的研究生考试记录,并复制到Excel工作表。
Public Sub 例8—11()
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim SQL As String, mydata As String, mytable As String
mydata = "研究生管理"      '指定数据库
mytable = "研究生"     '指定数据表
'清除工作表的所有数据
Cells.Clear
'建立与SQL Server服务器的连接
cnn.ConnectionString = "Provider=SQLOLEDB;" _
& "User ID=sa;" _
& "password=11111;" _
& "Data Source=THTFCOMPUTER;" _
& "Initial Catalog=" & mydata
cnn.Open
'查询全表某些字段的记录
SQL = " select * from " & mytable & " wheredatediff(yy,入学日期,getdate())>=1"
Set rs = cnn.Execute(SQL)
'复制字段名
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
'复制全部记录数据
Range("A2").CopyFromRecordset rs
'字段设置列宽至合适的宽度
Columns.AutoFit
'关机记录集以及与数据库的连接
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
运行上面的程序,就得到如图8-11所示的结果。