|
ACCESS入门(二)
多表查询
一.使用SQL的多表查询
创建多表查询要求查询中所涉及的表要有公共字段。比如你有这样两个表客户表(ID,NAME,ADDRESS)订单表(ORDERNO,ORDERDATE,ID,)。你想在查询中显示订单表中所有字段和客户表中相应的客户的所有字段。转换成SQL语句会是这样的:
SELECT ORDERNO,ORDERDATE,ID,NAME,ADDRESS FROM 客户表,订单表 WHERE 客户表.ID=订单表.ID;
这条SQL语句中还可以包含上一节中指定的准则和排序等等。
这种通过用公共字段将两个表联接起来,以访问两个不同表中的字段的操作就称为“联接”。
二.使用ACCESS的多表查询
用ACCESS创建多表查询选择表并指定它们之间的关系。一旦完成该操作,就需要选择必需的字段并指定准则。还可以提供排序顺序。新建一个查询的设计视图,把成绩表的所有字段和学生表的学生姓名添加进去。这时候,如果你去查看“SQL视图”,你会发现它的SQL语句是这样的:
SELECT 学生表.学生编号, 学生表.学生姓名, 成绩表.课程编号, 成绩表.成绩
FROM 学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号;
注意到“INNER JOIN”没有,这一子句就是ACCESS的特征,是它自己的方言。这再一次说明了每个RDBMS都有自己的SQL方言,并使用相似的结构和不同的语法。
联接
在上一节中,我们讨论了可以通过指定两个表中字段之间的联接或关系来设置关系。基于公共字段,使关系数据库中的两个或多个字段建立起关系称为“联接”。联接是一项数据库操作,在该操作中两个或更多个表中的相关行合并在一起,形成概念上的单个表。就像上一节我们做的学生表和成绩表的例子。当查询完成时,我们看到的记录集合让人感觉好像是联接创建了另一个表。
联接可以有不同的类型。ACCESS提供了用户友好的方法来指定“联接”类型。在默认情况下,在ACCESS中创建“内部联接”。
一.内部联接
在学生表与成绩表那个例子中,两个表只有在公共字段内有相同值的记录才被联接起来。因此,结果记录集合里只显示在两个表中都存在ID的记录。这样的“联接”称为“等值联接”,因为它将两个表中公共字段有相等值的记录联接起来。这是最常用的联接,在ACCESS中称为“内部联接”。
另一类型的联接称为“非等值联接”,当表是基于比较运算符而不是“=”建立关系时,就会使用这类联接。这类联接不经常使用。
二.外部联接
外部联接,除了两个表中的公共的记录以外,该联接选择一个表中的所有记录。外部联接分左联接和右联接。在ACCESS的关系视图中,右键单击“联接线”(联接不同表中公共字段的线),然后选择“联接属性”。其中单选按钮第一项是内部联接,第二项就是左联接,第三项是右联接。如果客户表与订单表以ID相联,左联接将显示客户表所有内容和订单表中相等的记录,右联接相反。
三.自联接
假设有这样一个表:
员工号 员工姓名 主管经理的员工号
001 张三
002 李四 001
003 王二 001
004 马五 002
005 赵大 002
这时候如果我想知道每个员工的姓名和他们的主管姓名,该如何做呢?有人可能会说:可以再建一个经理表,其中记录着经理和他们的员工号。但这会造成数据冗余。(注:冗余,指数据库中存在重复的数据)。一个更有效率的解决方案则是采用“自联接”。
在ACCESS中,你可以这样完成:在设计视图中新建一个查询,在“显示表”中选择“员工表”->添加,再选择“员工表”->添加。第二次添加进来的表名称为“员工表_1”,你可以通过在表上单击右键->属性,给这个表起个“别名”(比如“经理”)。现在我们只要把员工表. 主管经理的员工号拖到经理.员工号上就可以了。这时,把员工姓名和主管经理号添加到查询中,你就会看到每个员工姓名及他们的主管姓名了。
使用聚合函数查询
通常,除显示现有数据之外,还有必要在表中以求和、平均值、最大值和最小值的形式计算总计信息。RDBMS提供了各种不同的聚合函数来完成这些工作。在这里我们还用学生成绩那个例子。我们想在一个查询中得到每个同学各门课程的总成绩,在ACCESS中我们可以这样做:新建一个查询,把学生表.学生姓名和成绩表.成绩添加到查询中。在查询栏的学生姓名上单击右键->合计,在这面将出现GROUP BY 字样。单击查询栏中成绩下的BROUP BY,它会列出很多表达式,选择SUM (求和)。这时候的SQL语句是这样的:
SELECT 学生表.学生姓名, Sum(成绩表.成绩) AS 成绩之Sum
FROM 学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号
GROUP BY 学生表.学生姓名;
GROUP BY子句是分组语句,在这里是以学生姓名为条件进行分组,SUM是求和的函数。AS是给字段起个“别名”,你可以用(AS 总成绩)来给字段命名。
如果在查询栏姓名下方的准则再中写上“王二”,那么得到的将是王二同学的总成绩。SQL语句将变成:
SELECT 学生表.学生姓名, Sum(成绩表.成绩) AS 总成绩
FROM 学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号
GROUP |
|