Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-查询/SQL语句

全面掌握MS ACCESS SQL(47)

时 间:2018-01-26 16:18:55
作 者:Big Young   ID:252  城市:襄阳
摘 要:    ACCESS SQL子查询应用实例详解。
正 文:

第二节 ACCESS SQL子查询应用实例详解

有时,我们可能希望将一个查询的结果用作其他查询中的字段或用作查询字段的条件。例如,假设您想查看每类产品的订单之间的时间间隔。若要创建查询以显示此时间间隔,需要将同类产品的各个订单日期进行相互比较。比较这些订单日期时也需要查询。通过使用子查询,可以将此查询嵌入到主查询中。

ACCESSSQL视图中,可以用表达式或结构化查询语言(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关键字为:ALLANYSOME EXISTSIN等。

需要说明的是:这里列出的只是常用的SQL关键字,并不是可用的关键字的详尽列表。大家可以在子查询中使用任何有效的SQL关键字,当然数据定义关键字除外。

1ALL:在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]);

2ANY:在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关键字意义相同。

3EXISTS:在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]);

4IN:在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源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助