全面掌握MS ACCESS SQL(47)
时 间:2018-01-26 16:18:55
作 者:Big Young ID:252 城市:襄阳
摘 要: ACCESS SQL子查询应用实例详解。
正 文:
第二节 ACCESS SQL子查询应用实例详解
有时,我们可能希望将一个查询的结果用作其他查询中的字段或用作查询字段的条件。例如,假设您想查看每类产品的订单之间的时间间隔。若要创建查询以显示此时间间隔,需要将同类产品的各个订单日期进行相互比较。比较这些订单日期时也需要查询。通过使用子查询,可以将此查询嵌入到主查询中。
在ACCESS的SQL视图中,可以用表达式或结构化查询语言(SQL)语句编写子查询。下面我们还是以系统自带的罗斯文示例数据库为例来说明具体运用。
一、将查询结果用作其他查询中的字段
可以将子查询用作字段别名(SQL)。如果您希望将子查询结果用作主查询中的字段,则可以使用子查询作为字段别名。需要注意的是:用作字段别名的子查询不能返回多个字段。
可以使用子查询字段别名显示依赖于当前行中的其他值的值,如果不使用子查询,则无法做到这一点。
例如,让我们回到您要查看每类产品的订单之间的时间间隔的示例。若要确定此时间间隔,需要将同类产品的各个订单日期进行相互比较。通过使用罗斯文数据库模板,可以创建显示此信息的查询。
Select [产品 ID], 订单日期, (Select MAX(订单日期)
FROM 产品订单数 AS 既往订单
Where 既往订单.订单日期 < 产品订单数.订单日期
AND 既往订单.[产品 ID] = 产品订单数.[产品 ID]) AS 既往日期, [订单日期]-[既往日期] AS 间隔
FROM 产品订单数
ORDER BY 产品订单数.[产品 ID], 产品订单数.订单日期 DESC;
该查询将运行,并显示一个列表,列表中包含产品名称、订单日期、前一个订单日期以及订单日期之间的时间间隔。结果先按照“产品 ID”(升序)、再按照“订单日期”(降序)进行排序。
二、将子查询用作查询字段的条件
可以将子查询用作字段条件。如果要使用子查询的结果限制字段所显示的值,则可以将子查询用作字段条件。
例如,假设您要查看由非销售代表员工处理的订单列表。若要生成此列表,需要将每个订单的员工ID与非销售代表员工的员工ID列表进行比较。若要创建此列表并将其用作字段条件,可以使用子查询,SQL语句示例如下:
Select 订单.[员工 ID], 订单.[订单 ID], 订单.订单日期, 员工.职务
FROM 员工 INNER JOIN 订单 ON 员工.ID = 订单.[员工 ID]
Where (((订单.[员工 ID]) In (Select [ID] FROM 员工
Where 职务<>'销售代表')));
该查询将运行,并且查询结果显示由非销售代表员工处理的订单列表。
三、在子查询中使用的常见SQL关键字
在子查询中可以使用的几个SQL关键字为:ALL、ANY、SOME 、EXISTS、IN等。
需要说明的是:这里列出的只是常用的SQL关键字,并不是可用的关键字的详尽列表。大家可以在子查询中使用任何有效的SQL关键字,当然数据定义关键字除外。
1、ALL:在Where子句中使用ALL,可以检索在与子查询返回的每个行进行比较时满足条件的行。
例如,假设您要分析一所大学中的学生数据。学生必须维持最低GPA(注:平均分数),它随着专业的不同而不同。“专业”和“最低GPA”存储在名为Majors的表中,相关的学生信息存储在名为Student_Records的表中。
要查看相应专业中的每个学生都超过了最低GPA的专业(及其最低GPA)的列表,可以使用以下查询:
Select [Major], [Min_GPA]
FROM [Majors]
Where [Min_GPA] < ALL
(Select [GPA] FROM [Student_Records]
Where [Student_Records].[Major]=[Majors].[Major]);
2、ANY:在Where子句中使用ANY,可以检索在与子查询返回的至少一行进行比较时满足条件的行。
例如,假设您要分析一所大学中的学生数据。学生必须维持最低GPA,它随着专业的不同而不同。“专业”和“最低GPA”存储在名为Majors的表中,相关的学生信息存储在名为Student_Records的表中。
要查看相应专业中的任何学生都未达到最低GPA的专业(及其最低GPA)的列表,可以使用以下查询:
Select [Major], [Min_GPA]
FROM [Majors]
Where [Min_GPA] > ANY
(Select [GPA] FROM [Student_Records]
Where [Student_Records].[Major]=[Majors].[Major]);
注意:我们还可以使用SOME关键字达到同样的目的;SOME关键字与ANY关键字意义相同。
3、EXISTS:在Where子句中使用EXISTS可以指示子查询至少应该返回一行。我们还可以添加NOT作为EXISTS的前缀,以指示子查询不应该返回任何行。
例如,以下查询返回在至少一个现有订单中存在的产品的列表:
Select *
FROM [Products]
Where EXISTS
(Select * FROM [Order Details]
Where [Order Details].[Product ID]=[Products].[ID]);
如果使用NOT EXISTS,则该查询返回在现有所有订单中都不存在的产品的列表:
Select *
FROM [Products]
Where NOT EXISTS
(Select * FROM [Order Details]
Where [Order Details].[Product ID]=[Products].[ID]);
4、IN:在Where子句中使用IN可以验证主查询的当前行中的某个值是子查询返回的结果集的一部分。我们还可以添加NOT作为IN的前缀,以验证主查询的当前行中的某个值不是子查询返回的结果集的一部分。
例如,以下查询返回由非销售代表员工处理的订单(以及订单日期)的列表:
Select [Order ID], [Order Date]
FROM [Orders]
Where [Employee ID] IN
(Select [ID] FROM [Employees]
Where [Job Title]<>'Sales Representative');
通过使用 NOT IN,可以按照以下方式编写同一查询:
Select [Order ID], [Order Date]
FROM [Orders]
Where [Employee ID] NOT IN
(Select [ID] FROM [Employees]
Where [Job Title]='Sales Representative');
Access软件网QQ交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- 统计当月之前(不含当月)的记录...(03.11)
- 【Access Inputbo...(03.03)
- 按回车键后光标移动到下一条记录...(02.12)
- 【Access Dsum示例】...(02.07)
- Access对子窗体的数据进行...(02.05)
- 【Access高效办公】上月累...(01.09)
- 【Access高效办公】上月累...(01.06)
- 【Access Inputbo...(12.23)
- 【Access Dsum示例】...(12.16)

学习心得
最新文章
- 仓库管理实战课程(8)-商品信息功...(04.01)
- 仓库管理实战课程(7)-链接表(03.31)
- 仓库管理实战课程(6)-创建查询(03.29)
- 仓库管理实战课程(5)-字段属性(03.27)
- 设备装配出入库管理系统;基于Acc...(03.24)
- 仓库管理实战课程(4)-建表操作(03.22)
- 仓库管理实战课程(3)-需求设计说...(03.19)
- 仓库管理实战课程(2)-软件背景和...(03.18)
- 仓库管理实战课程(1)-讲师介绍(03.16)
- 统计当月之前(不含当月)的记录数怎...(03.11)