查询和筛选常用表达式示例
时 间:2020-07-20 08:01:25
作 者:宏鹏 ID:21115 城市:上海
摘 要:查询和筛选常用表达式示例
正 文:
本节包含的表达式示例可用于在查询中创建计算字段或向查询提供条件。 计算字段即查询中由表达式所得的列。 例如,可以计算值、组合名字和姓氏等文本值,或设置部分日期的格式。
在查询中使用条件可限制所处理的记录。 例如,可使用 Between 运算符,提供起始和结束日期并将查询结果限制为在这两个日期之间装运的订单。
下面提供在查询中使用的表达式示例。
文本操作
下表中的表达式使用 & 和 + 运算符来组合文本字符串、内置函数以操作文本字符串,或操作文本以创建计算字段。
表达式 |
说明 |
---|---|
FullName: [FirstName] & " " & [LastName] |
创建名为 FullName 的字段,显示 FirstName 和 LastName 字段的值(用空格分隔)。 |
Address2: [City] & " " & [Region] & " " & [PostalCode] |
创建名为 Address2 的字段,显示 City、Region 和 PostalCode 字段中的值(用空格分隔)。 |
ProductInitial:Left([ProductName], 1) |
创建名为 ProductInitial 的字段,然后使用 Left 函数,在 ProductInitial 字段中显示 ProductName 字段中值的第一个字符。 |
TypeCode:Right([AssetCode], 2) |
创建名为 TypeCode 的字段,然后使用 Right 函数,显示 AssetCode 字段中值的最后两个字符。 |
AreaCode:Mid([Phone],2,3) |
创建名为 AreaCode 的字段,然后使用 Mid 函数,显示从 Phone 字段中值的第 2 个字符开始的 3 个字符。 |
ExtendedPrice:CCur([Order Details].[Unit Price]*[Quantity]*(1-[Discount])/100)*100 |
命名计算字段 ExtendedPrice,并使用 CCur 函数来计算已享受折扣的行项目总计。 |
算数运算
可使用表达式对两个或更多字段或控件中的值进行加减乘除运算。 也可以对日期执行算术运算。 例如,假设有名为 RequiredDate 的日期/时间字段。 表达式 =[RequiredDate] - 2 将返回 RequiredDate 字段中值之前 2 天的日期/时间值。
表达式 |
说明 |
---|---|
PrimeFreight: [Freight] * 1.1 |
创建名为 PrimeFreight 的字段,然后在该字段中显示运费增加 10% 后的值。 |
OrderAmount: [Quantity] * [UnitPrice] |
创建名为 orderAmount 的字段,然后显示 Quantity 和 UnitPrice 字段中值的积。 |
LeadTime: [RequiredDate] - [ShippedDate] |
创建名为 LeadTime 的字段,然后显示 RequiredDate 和 ShippedDate 字段中值之差。 |
TotalStock: [UnitsInStock]+[UnitsOnOrder] |
创建名为 TotalStock 的字段,然后显示 UnitsInStock 和 UnitsOnOrder 字段中值之和。 |
FreightPercentage:Sum([Freight])/Sum([Subtotal]) *100 |
创建名为 FreightPercentage 的字段,然后显示每项小计中运费的百分比。 此表达式使用 Sum 函数计算 Freight 字段中值的总和,然后再将这些总和除以 Subtotal 字段中值之和。 若要使用此表达式,必须将选择查询转换为总计查询,因为需要在设计网格中使用“总计”行;并且必须将此字段的“总计”单元格设置为“表达式”。 有关创建总计查询的详细信息,请参阅使用查询对数据进行求和一文。 如果将该字段的“格式”属性设置为“百分比”,请勿包含 *100。 |
有关如何使用聚合函数以及汇总字段和列中值的详细信息,请参阅使用查询对数据进行求和、使用查询对数据进行计数、使用“汇总行”在数据表中显示列汇总和在数据表中显示列汇总。
数据操作
几乎所有数据库都存储和跟踪日期和时间。 将表中的日期和时间字段设置为“日期/时间”数据类型,即可在 Access 中处理日期和时间。 Access 可对日期执行算术计算,例如,可计算从发票日期起已经过的天数,以计算应收帐款的帐龄。
表达式 |
说明 |
---|---|
LagTime:DateDiff("d", [OrderDate], [ShippedDate]) |
创建名为 LagTime 的字段,然后使用 DateDiff 函数,显示订单日期和装运日期之间的天数。 |
YearHired:DatePart("yyyy",[HireDate]) |
创建名为 YearHired 的字段,然后使用 DatePart 函数,显示每个员工的聘用年份。 |
MinusThirty:日期 ( )- 30 |
创建名为 MinusThirty 的字段,然后使用 Date 函数,显示当前日期前 30 天的日期。 |
SQL 聚合函数
下表中的表达式使用了聚合或汇总数据的 SQL(结构化查询语言)函数。 这些函数(例如 Sum、Count 和 Avg)常称为聚合函数。
除聚合函数外,Access 还提供“域”聚合函数,可用于对值进行选择性求和或计数。 例如,可仅对特定区域内的值进行计数,或查找另一表中的值。 域聚合函数集合包括 DSum 函数、DCount 函数和 DAvg 函数。
若要计算总计,通常需要创建总计查询。 例如,按组汇总就需要使用总计查询。 若要在查询设计网格中启用总计查询,请单击“视图”菜单上的“总计”。
表达式 |
说明 |
---|---|
RowCount:Count(*) |
创建名为 RowCount 的字段,然后使用 Count 函数计算查询中记录的数量,包括 null(空白)字段的记录。 |
FreightPercentage:Sum([Freight])/Sum([Subtotal]) *100 |
创建名为 FreightPercentage 的字段,然后将 Freight 字段中值之和除以 Subtotal 字段中值之和,计算每项小计中运费的百分比。 (此示例使用 Sum 函数。) 此表达式必须用于总计查询。 如果将该字段的“格式”属性设置为“百分比”,请勿包含 *100。 有关创建总计查询的详细信息,请参阅使用查询对数据进行求和一文。 |
AverageFreight:DAvg("[Freight]", "[Orders]") |
创建名为 AverageFreight 的字段,然后使用 DAvg 函数,计算总计查询中所有订单的平均运费。 |
包含缺失数据的字段
此处显示的表达式适用于可能缺少信息的字段,例如包含 null(未知或未定义)值的字段。 null 值很常见,例如新产品的未知价格或同事忘记添加到订单的值。 查找和处理 null 值的能力对数据库操作而言至关重要,下表中的表达式介绍了处理 null 值的一些常见方法。
表达式 |
说明 |
---|---|
CurrentCountryRegion:IIf(IsNull([CountryRegion]), " ", [CountryRegion]) |
创建名为 CurrentCountryRegion 的字段,然后使用 IIf和 IsNull 函数,在 CountryRegion 字段包含 null 值时显示空字符串;否则显示 CountryRegion 字段的内容。 |
LeadTime:IIf(IsNull([RequiredDate] - [ShippedDate]), "Check for a missing date", [RequiredDate] - [ShippedDate]) |
创建名为 LeadTime 的字段,然后使用 IIf 和 IsNull 函数,在 RequiredDate 字段或 ShippedDate 字段中的值为 null 时显示消息“Check for a missing date”;否则显示两日期之差。 |
SixMonthSales:Nz([Qtr1Sales]) + Nz([Qtr2Sales]) |
创建名为 SixMonthSales 的字段,首先使用 Nz 函数将任何 null 值转换为 0,然后显示 Qtr1Sales 和 Qtr2Sales 字段中值的总和。 |
包含子查询的计算字段
可使用嵌套查询(也称子查询)创建计算字段。 下表中的表达式是由子查询得出计算字段的一个示例。
表达式 |
说明 |
---|---|
Cat:(Select [CategoryName] FROM [Categories] Where [Products].[CategoryID]=[Categories].[CategoryID]) |
创建名为 Cat 的字段,如果 Categories 表中的 CategoryID 与 Products 表中的 CategoryID 相同,则显示 CategoryName。 |
匹配文本值
此表中的示例表达式演示匹配整个或部分文本值的条件。
字段 |
表达式 |
说明 |
---|---|---|
ShipCity |
"London" |
显示发往 London 的订单。 |
ShipCity |
"London" or "Hedge End" |
使用 Or 运算符,显示发往 London 或 Hedge End 的订单。 |
ShipCountryRegion |
In("Canada", "UK") |
使用 In 运算符显示发往 Canada 或 UK 的订单。 |
ShipCountryRegion |
Not "USA" |
使用 Not 运算符,显示发往 USA 以外国家/地区的订单。 |
ProductName |
Not Like "C*" |
使用 Not 运算符和 * 通配符,显示名称不以 C 开头的产品。 |
CompanyName |
>="N" |
显示发往名称以字母 N 到 Z 开头的公司的订单。 |
ProductCode |
Right([ProductCode], 2)="99" |
使用 Right 函数,显示 ProductCode 值以 99 结尾的订单。 |
ShipName |
Like "S*" |
显示发往名称以字母 S 开头的客户的订单。 |
匹配日期条件
下表中的表达式演示条件表达式中日期及相关函数的使用方法。 有关输入和使用日期值的详细信息,请参阅设置日期和时间字段的格式一文。
字段 |
表达式 |
说明 |
---|---|---|
ShippedDate |
#2/2/2017# |
显示在 2017 年 2 月 2 日发货的订单。 |
ShippedDate |
Date() |
显示今天装运的订单。 |
RequiredDate |
Between Date( ) And DateAdd("m", 3, Date( )) |
使用 Between...And 运算符、DateAdd 和 Date 函数,显示今天和 3 个月前的今天之间下的订单。 |
orderDate |
< Date( ) - 30 |
使用 Date 函数显示 30 天前的订单。 |
orderDate |
Year([OrderDate])=2017 |
使用 Year 函数显示订单日期在 2017 年的订单。 |
orderDate |
DatePart("q", [OrderDate])=4 |
使用 DatePart 函数显示第 4 日历季度的订单。 |
orderDate |
DateSerial(Year ([OrderDate]), Month([OrderDate])+1, 1)-1 |
使用 DateSerial、Year 和 Month 函数,显示每个月最后一天的订单。 |
orderDate |
Year([OrderDate])= Year(Now()) And Month([OrderDate])= Month(Now()) |
使用 Year、Month 函数和 And 运算符,显示本年本月的订单。 |
ShippedDate |
Between #1/5/2017# And #1/10/2017# |
使用 Between...And 运算符,显示 2017 年 1 月 5 日到 2017 年 1 月 10 日之间发货的订单。 |
RequiredDate |
Between Date( ) And DateAdd("M", 3, Date( )) |
使用 Between...And 运算符,显示今天和 3 个月前的今天之间下的订单。 |
BirthDate |
Month([BirthDate])=Month(Date()) |
使用 Month 和 Date 函数,显示本月过生日的员工。 |
查找丢失的数据
下表中的表达式适用于可能缺少信息的字段,即包含 null 值或零长度字符串的字段。 null 值表示缺少信息,它不表示 0 或其他任何值。 Access 支持缺少信息,因为这一概念对于数据库的完整性至关重要。 现实中,信息的缺失很常见,即使只是暂时的(例如新产品待定的价格)。 因此,模拟业务等现实本质的数据库必须能够将信息记录为缺失。 可使用 IsNull 函数确定字段或控件是否包含 null 值,并可使用 Nz 函数将 null 值转换为 0。
字段 |
表达式 |
说明 |
---|---|---|
ShipRegion |
Is Null |
显示 ShipRegion 字段为 null(缺失)的客户的订单。 |
ShipRegion |
Is Not Null |
显示 ShipRegion 字段包含值的客户的订单。 |
Fax |
"" |
显示不使用传真机的客户的订单,这样的客户,其 Fax 字段中具有零长度字符串值而非 null(缺失)值。 |
匹配包含 Like 的记录模式
尝试匹配遵循模式的行时,Like 运算符可提供极大的灵活性,因为可将 Like 运算符与通配符结合使用,定义 Access 要匹配的模式。 例如,*(星号)通配符将匹配任意类型的字符序列,从而轻松查找以某字母开头的所有名称。 例如,可以使用表达式 Like "S*" 查找以字母 S 开头的所有名称。有关详细信息,请参阅文章 Like 运算符。
字段 |
表达式 |
说明 |
---|---|---|
ShipName |
Like "S*" |
查找 ShipName 字段中以字母 S 开头的所有记录。 |
ShipName |
Like "*Imports" |
查找 ShipName 字段中以“Imports”结尾的所有记录。 |
ShipName |
Like "[A-D]*" |
查找 ShipName 字段中以字母 A、B、C 或 D.开头的所有记录。 |
ShipName |
Like "*ar*" |
查找 ShipName 字段中包含字母序列“ar”的所有记录。 |
ShipName |
Like "Maison Dewe?" |
查找 ShipName 字段中满足以下条件的所有记录:其值的第一部分包含“Maison”,第二部分是由 5 个字母构成的字符串,该字符串前 4 个字母为“Dewe”而最后一个字母未知。 |
ShipName |
Not Like "A*" |
查找 ShipName 字段中不以字母 A 开头的所有记录。 |
SQL 聚合的行
需要选择性求和、计数和求平均值时,请使用 SQL 或域聚合函数。 例如,有时需要对特定范围内的值或计算结果为 Yes 的值进行计数。 有时又需要查找并显示另一表中的值。 下表中的示例表达式使用域聚合函数对一组值执行计算,并将结果用作查询条件。
字段 |
表达式 |
说明 |
---|---|---|
Freight |
> (DStDev("[Freight]", "Orders") + DAvg("[Freight]", "Orders")) |
使用 DStDev 和 DAvg 函数,显示运费高于运费平均值与标准偏差之和的所有订单。 |
Quantity |
> DAvg("[Quantity]", "[Order Details]") |
使用 DAvg 函数,显示订购数量高于平均订购数量的产品。 |
匹配包含子查询的字段
子查询也称嵌套查询,用于计算要用作条件的值。 下表中的示例表达式基于子查询返回结果匹配行。
字段 |
表达式 |
显示 |
---|---|---|
UnitPrice |
(Select [UnitPrice] FROM [Products] Where [ProductName] = "Aniseed Syrup") |
价格与 Aniseed Syrup 相等的产品。 |
UnitPrice |
>(Select AVG([UnitPrice]) FROM [Products]) |
单价高于平均值的产品。 |
Salary |
> ALL (Select [Salary] FROM [Employees] Where ([Title] LIKE "*Manager*") or ([Title] LIKE "*Vice President*")) |
工资高于职位为“Manager”或“Vice President”的所有员工的每个销售代表的工资。 |
orderTotal: [UnitPrice] * [Quantity] |
> (Select AVG([UnitPrice] * [Quantity]) FROM [Order Details]) |
总计高于平均订单价值的订单。 |
更新查询
可使用更新查询修改数据库中一个或多个现有字段中的数据。 例如,可替换或完全删除值。 下表演示在更新查询中使用表达式的一些方法。 对于要更新的字段,在查询设计网格的“更新到”行中使用以下表达式。
有关创建更新查询的详细信息,请参阅创建和运行更新查询一文。
字段 |
表达式 |
结果 |
---|---|---|
标题 |
"Salesperson" |
将文本值更改为 Salesperson。 |
ProjectStart |
#8/10/17# |
将日期值更改为 10-Aug-17。 |
停用 |
是 |
将 Yes/No 字段中的 No 值更改为 Yes。 |
PartNumber |
"PN" & [商品编号] |
将 PN 添加到每个指定部件号的开头。 |
LineItemTotal |
[单价] * [数量] |
计算 UnitPrice 和 Quantity 的积。 |
运费 |
[运费] * 1.5 |
将运费增加 50%。 |
Sales |
DSum("[Quantity] * [UnitPrice]", "Order Details", "[ProductID]=" & [ProductID]) |
当前表中的 ProductID 值与 order Details 表中的 ProductID 值相等时,基于 Quantity 和 UnitPrice 的积更新总销售额。 |
ShipPostalCode |
Right([ShipPostalCode], 5) |
截断最左侧的字符,保留最右侧的 5 个字符。 |
UnitPrice |
Nz([UnitPrice]) |
将 UnitPrice 字段中的 null(未定义或未知)值更改为零(0)。 |
SQL 语句
Access 使用结构化查询语言(或称 SQL)作为查询语言。 在查询设计视图中创建的每个查询也可使用 SQL 表示。 若要查看任意查询的 SQL 语句,请单击“视图”菜单上的“SQL 视图”。 下表显示了使用表达式的 SQL 语句示例。
使用表达式的 SQL 语句 |
结果 |
---|---|
Select [FirstName],[LastName] FROM [Employees] Where [LastName]="Danseglio"; |
显示姓氏为 Danseglio 的员工所对应 FirstName 和 LastName 字段中的值。 |
Select [ProductID],[ProductName] FROM [Products] Where [CategoryID]=Forms![New Products]![CategoryID]; |
对于 Products 中 CategoryID 值与打开的 New Products 窗体中所指定 CategoryID 值相等的记录,显示其 ProductID 和 ProductName 字段中的值。 |
Select Avg([ExtendedPrice]) AS [Average Extended Price] FROM [Order Details Extended] Where [ExtendedPrice]>1000; |
计算 ExtendedPrice 字段中值大于 1000 的订单的延伸价格,并将结果显示在名为 Average Extended Price 的字段中。 |
Select [CategoryID], Count([ProductID]) AS [CountOfProductID] FROM [Products] GROUP BY [CategoryID] HAVING Count([ProductID])>10; |
在名为 CountOfProductID 的字段中,显示包含 10 种以上产品的类别的产品总数。 |
Access软件网QQ交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- 【Access IIF函数嵌套示例...(11.26)
- Access快速开发平台--使用组...(11.25)
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)