文档库 最新最全的文档下载
当前位置:文档库 › access数据库操作

access数据库操作




一.使用SQL的多表查询
创建多表查询要求查询中所涉及的表要有公共字段。比如你有这样两个表客户表(ID,NAME,ADDRESS)订单表(ORDERNO,ORDERDATE,ID,)。你想在查询中显示订单表中所有字段和客户表中相应的客户的所有字段。转换成SQL语句会是这样的:
SELECT ORDERNO,ORDERDATE,ID,NAME,ADDRESS FROM 客户表,订单表 WHERE 客户表.ID=订单表.ID;

这种通过用公共字段将两个表联接起来,以访问两个不同表中的字段的操作就称为“联接”。
二.使用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 BY 学生表.学生姓名
HAVING 学生表.学生姓名="王";
这里的HAVING相当于WHERE条件,但只有与GROUP BY一起使用的时候才能使用HAVING而且坚决不能用WHERE。

子查询

分析这样一种情况,要显示一名教师教(比如王老师)的学生成绩。我们要如何处理?一种方法,

是用一条SQL语句从课程表中查到王老师教的课程编号,再用一条SQL语句从成绩表中查到学生这门课程的成绩。这样的方法不是最有效率的,因为它要发出两条SQL语句。我们可以用一个子查询来完成它。“子查询”就是一个嵌入到另一个查询中的“查询”。内部或嵌入的查询部是首先被求值,然后其值就被做为一个参数提供给外面的查询。上面的问题我们在ACCESS中用子查询处理就是这样的:在查询栏中添加课程名称,学生名称,成绩。课程名称的准则中写上“(select 课程名称 from 课程表 where 教师=’王’)”。这样整条SQL语句就变为:
SELECT 课程表.课程名称, 学生表.学生姓名, 成绩表.成绩
FROM 课程表 INNER JOIN (学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号) ON 课程表.课程编号 = 成绩表.课程编号
WHERE (课程表.课程名称)=(select 课程名称 from 课程表 where 教师='王');
在这里子查询返回的记录(也就是王老师教的课程名称)做为外部查询的条件。

索引

影响数据检索速度的要素之一是RDBMS查找记录所能达到的速度。大多数RDBMS提供了“索引”概念以帮助解决此问题。在成千上万条记录是查找一条记录是非常冗长乏味的。最初的“数据库”中就是这样一条一条的记录比较,直到找到特定记录。索引提供了解决此问题的方法。
索引就像一本书的目录,使用页号定位书中的主题。在ACCESS中表的设计视图中字段的“索引”属性可用来对特定字段进行索引。在前面讨论过的“主键”就是一种特殊的索引。不过我们还可以创建“唯一”索引。它与“主键”索引的区别在于“主键”不能为NULL。

优化查询

RDBMS都提供了一个内置的“优化器”,它可在运行之前“优化”查询。要提高查询的性能需要牢记以下技术,这可以确保快速和有效的信息检索:
1.确保已对“联接”两侧的字段进行了索引。如果在两个表之间存在“主键-外键”关系,那么该索引将会自动创建。
2.从多个表中访问记录时,建议您在查询中包括主表的关键字字段,而不要包括相关表的外键。
3.只包括查询结果中所必需的字段。即尽是改名使用语句“select * from 表”。如果查询准则中包括一个字段,但不需要显示该字段,那么该字段就不应该显示出来。可以发出以下语句:select 学生姓名,地址 from 学生表 where 性别=‘男’;
4.必须对所有要排序的字段进行索引。如果查询需要按字段的组合排序的记录,那么必须首先创建组合索引(对多个字段的索引)。
5.也需要对包含在查询准则中的字段进行索引。
6.非索引字段或计算字段尽是不要包

含在准则中。
7.建议您经常“压缩”数据库。“压缩”数据库的好处我们将在后面讲到。
8.在使用“LIKE”运算符检索记录时,通配符应该放在字符串的结尾处而不是放在字符串的开始处。如果通配符放在字符串的结尾处,可以用索引来检索记录。否则,无法使用索引。
9.尽是避免在查询中包括“备注”或“OLE对象”这样的数据类型的字段。
必须记住的一点是,数据库中的数据通常是通过网络来访问的。在大多数情况下,数据是存储在服务器上的,而查询一般在客户端执行。请求和结果都是通过网络传输的。因此,最好在查询中只包含必需的字段和记录。这样可以使通过网络传输的数据量减少到最小。

SQL是一种功能强大的查询语言,可用来查询数据库,并从中提取信息。但这只是SQL的一个方面。SQL可以用来创建表、删除和插入记录,以及其它功能,这将在后面进行讲述。


一.使用SQL的多表查询

创建多表查询要求查询中所涉及的表要有公共字段。比如你有这样两个表客户表(ID,NAME,ADDRESS)订单表(ORDERNO,ORDERDATE,ID,)。你想在查询中显示订单表中所有字段和客户表中相应的客户的所有字段。转换成SQL语句会是这样的:

SELECT ORDERNO,ORDERDATE,ID,NAME,ADDRESS FROM 客户表,订单表 WHERE 客户表.ID=订单表.ID;

这种通过用公共字段将两个表联接起来,以访问两个不同表中的字段的操作就称为“联接”。

二.使用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 BY 学生表.学生姓名

HAVING 学生表.学生姓名="王";

这里的HAVING相当于WHERE条件,但只有与GROUP BY一起使用的时候才能使用HAVING而且坚决不能用WHERE。

子查询

分析这样一种情况,要显示一名教师教(比如王老师)的学生成绩。我们要如何处理?一种方法,是用一条SQL语句从课程表中查到王老师教的课程编号,再用一条SQL语句从成绩表中查到学生这门课程的成绩。这样的方法不是最有效率的,因为它要发出两条SQL语句。我们可以用一个子查询来完成它。“子查询”就是一个嵌入到另一个查询中的“查询”。内部或嵌入的查询部是首先被求值,然后其值就被做为一个参数提供给外面的查询。上面的问题我们在ACCESS中用子查询处理就是这样的:在查询栏中添加课程名称,学生名称,成绩。课程名称的准则中写上“(select 课程名称 from 课程表 where 教师=’王’)”。这样整条SQL语句就变为:

SELECT 课程表.课程名称, 学生表.学生姓名, 成绩表.成绩

FROM 课程表 INNER JOIN (学生表 INNER JOIN 成绩表 ON 学生表.学生编号 = 成绩表.学生编号) ON 课程表.课程编号 = 成绩表.课程编号

WHERE (课程表.课程名称)=(select 课程名称 from 课程表 where 教师='王');

在这里子查询返回的记录(也就是王老师教的课程名称)做为外部查询的条件。

索引

影响数据检索速度的要素之一是RDBMS查找记录所能达到的速度。大多数RDBMS提供了“索引”概念以帮助解决此问题。在成千上万条记录是查找一条记录是非常冗长乏味的。最初的“数据库”中就是这样一条一条的记录比较,直到找到特定记录。索引提供了解决此问题的方法。

索引就像一本书的目录,使用页号定位书中的主题。在ACCESS中表的设计视图中字段的“索引”属性可用来对特定字段进行索引。在前面讨论过的“主键”就是一种特殊的索引。不过我们还可以创建“唯一”索引。它与“主键”索引的区别在于“主键”不能为NULL。


优化查询

RDBMS都提供了一个内置的“优化器”,它可在运行之前“优化”查询。要提高查询的性能需要牢记以下技术,这可以确保快速和有效的信息检索:

1.确保已对“联接”两侧的字段进行了索引。如果在两个表之间存在“主键-外键”关系,那么该索引将会自动创建。

2.从多个表中访问记录时,建议您在查询中包括主表的关键字字段,而不要包括相关表的外键。

3.只包括查询结果中所必需的字段。即尽是改名使用语句“select * from 表”。如果查询准则中包括一个字段,但不需要显示该字段,那么该字段就不应该显示出来。可以发出以下语句:select 学生姓名,地址 from 学生表 where 性别=‘男’;

4.必须对所有要排序的字段进行索引。如果查询需要按字段的组合排序的记录,那么必须首先创建组合索引(对多个字段的索引)。

5.也需要对包含在查询准则中的字段进行索引。

6.非索引字段或计算字段尽是不要包含在准则中。

7.建议您经常“压缩”数据库。“压缩”数据库的好处我们将在后面讲到。

8.在使用“LIKE”运算符检索记录时,通配符应该放在字符串的结尾处而不是放在字符串的开始处。如果通配符放在字符串的结尾处,可以用索引来检索记录。否则,无法使用索引。

9.尽是避免在查询中包括“备注”或“OLE对象”这样的数据类型的字段。

必须记住的一点是,数据库中的数据通常是通过网络来访问的。在大多数情况下,数据是存储在服务器上的,而查询一般在客户端执行。请求和结果都是通过网络传输的。因此,最好在查询中只包含必需的字段和记录。这样可以使通过网络传输的数据量减少到最小。

SQL是一种功能强大的查询语言,可用来查询数据库,并从中提取信息。但这只是SQL的一个方面。SQL可以用来创建表、删除和插入记录,以及其它功能,这将在后面进行讲述。


多表联接建立记录集是十分有用的,因为某些情况下,我们需要把数字数据类型显示为相应的文本名称,这就遇到了多表联接建立记录集的问题。
比如作一个会员注册系统,共有五个表,会员信息数据表member、会员身份表MemberIdentity、会员权限表MemberLevel会员类别表MemberSort和会员婚姻状况表Wedlock。
如果想把会员注册信息全部显示出来,肯定要将这四个表连起来,否则大家看到的某些会员信息可能只是数据编号。
以会员类别表来说,在其数据表中,1代表普通会员,2代表高级会员,3代表终身会员,在显示时,如果不将会员类别表与会员详细数据表相关联,
那么假如我们现在看到的是一名普通会

员的注册信息,我们只能看到其类别为1,而谁又会知道1代表的是普通会员呢?所以要将会员类别表与会员详细数据表相关联,
关联后,1就显示为普通会员,2就显示为高级会员,3就显示为终身会员,这样多好?同理,其它两个表也要与会员详细数据表相关联才能把数据编号显示为相应的名称。

前天制作网站后台时遇到此问题,在面包论坛、狂迷俱乐部、蓝色理想、和5D多媒体论坛发了贴子求救,都没有获得答案,只好自己研究,花了两天时间终于成功,
现将其写成教程供大家分享,希望大家少走弯路。
本教程是把五个表联在一起,如果愿意,您可以将更多的表联在一起,方法大同小异啦~

步骤一:用Access软件建立一个名为Member的数据库,在其中建五个表,分别为:会员信息数据表member、会员身份表MemberIdentity、会员权限表MemberLevel、会员类别表MemberSort和会员婚姻状况表Wedlock。

●会员信息数据表member:
MemberID:自动编号,主键(ID号)
MemberSort:数字(会员类别)
MemberName:文本,会员姓名
Password:文本(会员密码)
MemberLevel:数字(会员权限)
MemberIdentity:数字(会员身份)
Wedlock:数字(婚姻状况)
MemberQQ:文本(QQ号码)
MemberEmail:文本(会员邮箱)
MemberDate:日期/时间(会员注册日期)

●会员身份表MemberIdentity:
MemberIdentity:自动编号,主键(ID号)
IdentityName:文本(会员身份名称)

●会员权限表MemberLevel:
MemberLevel:自动编号,主键(ID号)
LevelName:文本(会员权限名称)

●会员类别表MemberSort:
MemberSort:自动编号,主键(ID号)
SortName:文本(会员类别名称)

●会员婚姻状况表Wedlock
Wedlock:自动编号,主键(ID号)
WedlockName:文本(会员婚姻状况类别)
说明:五个表建好后,您可以自行设置您想要的类别,如会员权限,您可以设置两个类别--“未付费会员”和“已付费会员”,编号分别为“1”、“2”,如您设置了三个选项,那么第三个选项的编号当然就是“3”了。
下面我们所要作的工作就是把“1”、“2”之类的编号显示为“未付费会员”和“已付费会员”,否则,大家谁会知道“1”代表的是“未付费会员”,“2”代表的是“已付费会员”?

步骤二:建DSN数据源,建记录集
●运行Dreamweaver MX软件,在会员注册信息显示页面建一个名为ConnMember(您也可以起其它的名称)的DSN数据源。

●点击服务器行为面板中的“绑定”,建一个名为MemberShow的数据集,“连

接”选择ConnMember,“表格”选择Member,“列”全选,“排序”选择MemberDate,降序。




点击“高级”按钮,修改SQL框中自动生成的代码:
原代码为:
SELECT *
FROM Member
ORDER BY MemberDate DESC

将代码修改为:
SELECT *
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
ORDER BY MemberDate DESC
修改完代码后,点击“确定”,大功告成!
现在,您可以打开记录集看一下,五个表中的字段全部集成在MemberShow记录集中,您只要将相应的字段绑定在该字段想显示的单元格中即可。这下好了,所有的数字编号全部变成了相应的名称,如会员权限,不再是“1”和“2”的数字形式了,而是变成了相应的名称“未付费会员”和“已付费会员”。其它的数字编号也变成了显示的文本名称,是不是很开心呢?

注意事项:
●在输入字母过程中,一定要用英文半角标点符号,单词之间留一半角空格;
●在建立数据表时,如果一个表与多个表联接,那么这一个表中的字段必须是“数字”数据类型,而多个表中的相同字段必须是主键,而且是“自动编号”数据类型。否则,很难联接成功。
●代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加“INNER JOIN 表名X ON 表1.字段号=表X.字段号”代码即可,这样就可以无限联接数据表了:)

语法格式:
其实 INNER JOIN ……ON的语法格式可以概括为:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X ON Member.字段号=表X.字段号
您只要套用该格式就可以了。

现成格式范例:
虽然我说得已经比较明白了,但为照顾初学者,我还是以本会员注册系统为例,提供一些现成的语法格式范例,大家只要修改其中的数据表名称和字段名称即可。

连接两个数据表的用法:
FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort
语法格式可以概括为:
FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号

连接三个数据表的用法:
FROM (Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel
语法格式可以概括为:

FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号

连接四个数据表的用法:
FROM ((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity
语法格式可以概括为:
FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号

连接五个数据表的用法:
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
语法格式可以概括为:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

连接六个数据表的用法:略,与上述联接方法类似,大家举一反三吧:)


Format用法详解

Format$(Now,"EEOA")
只要这么一句~~~~~就可以得到“ 二○○六年五月二十六日”
亏我还得写得那么多。。。
所以对FORMAT函数进行研究,参照HELP文件,把一些用法写了下来。
现拿给大家共享。。。
---------------------------------
Format[$] ( expr [ , fmt ] )
format 返回变体型
format$ 强制返回为文本
--------------------------------
数字类型的格式化
--------------------------------
固定格式参数:
General Number 普通数字,如可以用来去掉千位分隔号
format$("100,123.12","General Number") 返回值 100123.12
Currency 货币类型,可添加千位分隔号和货币符号
format$("100123.12","Currency") 返回值 ¥100,123.12
Fixed 格式为带两位小数的数字
format$("100123","Fixed") 返回值 100123.00
Standard 标准,即带千位分隔号和两位小数
format$("100123","Standard") 返回值 100,123.00
Percent 百分数
format$("100123","Percent") 返回值 10012300.00%
Scientific 科学记数法
format$("100123","Scientific") 返回值 1.00E+05
Yes/No 当值为0时返回 NO,否则返回 YES
format$("100123","Yes/No") 返回值 Yes
True/False 当值为0时返回 False,否则返回 True
format$("100123","True/False") 返回值 True
On/Off 当值为0时返回 Off,否则返回 On
format$("100123","Yes/No") 返回值 On
自定义格式参数
"" 不进行格式化 返回值 原值
0 占位格式化,不足补0
format$("100123","0000000") 返回值 0100123
# 占位格式化,不足时不补0
format$("100123","#######") 返回值 100123
. 强制显示小数点
format$("100123.12",".000") 返回值 100123.120

% 转化为百分数,一个%代表乘以100
format$("10.23","0.00%") 返回值 1023.00%
format$("10.23","0.00%%") 返回值 102300.00%%
, 以千为单位格化
format$("10.23",",") 返回值 0
format$("10010.23",",") 返回值 10
format$("10010.23",",0.00") 返回值 10.01
E- E+ e- e+ 显示为科学记数(要注意格式语句,否则会和E的其它含义相混)
Format$(12.5,"0.00E+00") 返回值 1.25E+01
$ 强制显示货币符号
format$("10.23","{threadcontent}.00") 返回值 ¥10.23
- + ( ) space 按位置显示本样
Format$("1234.56","-(0.00)") 返回值 -(1234.56)
\ 转义符,显示出特殊符号
Format$("1234.56","\#.00") 返回值 #1234.56
"ABC" 显示双引号 (" ") 之内的字符串。如在代码中想在 format 中包含一个字符串,必须用 Chr(34) 将文本括起来(34 为双引号 ("))
Format$(123.45,"TTT") 返回值 TTT
注:当双引号中的文本包含特殊的参数符号如e,要使用转义符"\",否则会按e的作用显示
; 类似多目运算符的作用。
当共有 四 部分时,
当大于0时,按第一部分进行格式化,
当小于0时按第二部分进行格式化,
当等于0时按第三部分进行格式化,
当为null值时,按第四部分进行格式化。如:
Format$(0,"0.00;负数;零;空") 返回值 零
当共有 三 部分时,
当大于0时,按第一部分进行格式化,
当小于0时按第二部分进行格式化,
当等于0时按第三部分进行格式化,如:
Format$(-10,"0.00;ttt;零") 返回值 ttt
当共有 两 部分时,
当大于或等于0时,按第一部分进行格式化,
当小于0时按第二部分进行格式化,
Format$(-123,"0.00;abc") 返回值 abc
Format$(123,"0.00;abc") 返回值 123.00
当共有 一 部分时,按分号左边进行格式化
---------------------------------
日期类型的格式化
---------------------------------
注意:在中文操作系统中,系统自动将月份输为如:五月,而非 May
固定格式参数
General Date 基本类型

Format(Date,"YYYY年MM月DD日")
'M 个位月只显示一位,
'MM 显示两位月,
'MMM显示英文月简称,
'MMMM显示英文全名

Format$(Now,"General Date") 返回值 2006-5-25 14:56:15
Long Date 操作系统定义的长日期
Format$(Now,"Long Date") 返回值 2006年5月25日
Medium Date 中日期(yy/mmm/dd)
Format$(Now,"Medium Date") 返回值 06-5月-25
Short Date 操作系统定义的短日期
Format$(Now,"Short Date") 返回值 2006-5-25
Long Time 操作系统定义的长时间
Format$(Now,"Long Time") 返回值 15:06:36
Medium Time 带AM/PM的12小时制,不带秒
Format$(Now,"Medium Time") 返回值 03:08 PM
Short Time 24时制的时间,不带秒
Format$(Now,"Short Time") 返回值 15:08
自定义格式参数
: 用来标识时间字符的间隔
Format$(Time(),"hh:nn") 返回值 15:25
/ 用来标识日期字符的间隔
Format$(now,"yyyy/mm/dd") 返回值 2006-05-25
c 格式化为国

标的日期和时间
Format$(Now,"c") 返回值 2006-5-25 14:56:15
y 一年中的第几天
Format$(Now,"y") 返回值 145
d 一个月中的第几天(1-366)
Format$(Now,"d") 返回值 25
dd 当小于10时前面带0的天数(01-31)
Format$("2006-1-7","dd") 返回值 07
ddd 周几
Format$(Now,"ddd") 返回值 周四
dddd 星期几
Format$(Now,"dddd") 返回值 星期四
ddddd 显示标准日期
Format$(Now,"ddddd") 返回值 2006-05-25
dddddd 长日期
Format$(Now,"dddddd") 返回值 2006年5月25日
w 一个星期中的第几天
Format$(Now,"w") 返回值 5
ww 一年中的第几周
Format$(Now,"ww") 返回值 21
m 月数(注:当用于时间时,也可以表时为分钟)
Format$(Now,"m") 返回值 5
Format$(Now,"h:m") 返回值 16:11
mm 当小于10时前面带0的月数(注:当用于时间时,也可以表时为带0的分钟)
Format$(Now,"m") 返回值 05
Format$(Now,"hh:mm") 返回值 16:09
mmm 月份
Format$(Now,"mmm") 返回值 五月
q 一年中的第几季(1-4)
Format$(Now,"q") 返回值 2
yy 两位数的年份(00-99)
Format$(Now,"yy") 返回值 06
yyyy 四位数的年份(0100-9999)
Format$(Now,"yyyy") 返回值 2006
h 一天中的第N小时(0-23)
Format$(Now,"h") 返回值 16
hh 当小于10时带0的小时数(00-23)
Format$("7:30:28","hh") 返回值 07
n 一小时的分钟数(0-59)
Format$("7:30:28","n") 返回值 30
nn 当小于10时带0的分钟数(00-59)
Format$("7:3:28","n") 返回值 03
s 一分钟中的秒数(0-59)
Format$("7:30:8","s") 返回值 8
ss 当小于10时带0的分钟数(00-59)
Format$("7:3:8","ss") 返回值 08
ttttt 标准时间,小时数当小于10时不带0,与h:mm:ss相同
Format$("7:3:28","ttttt") 返回值 7:03:28
AM/PM 显示当前为AM或为PM
Format$(Now,"AM/PM") 返回值 PM
A/P 显示当前为A或为P
Format$(Now,"A/P") 返回值 P
AMPM 对0至2359的数值进行判断是AM还是PM,可以看作是同等于对00:00至23:59的数字进行判断,如1000可以看作是10:00。
Format$(1000,"AMPM") 返回值 AM
联合格式化
m/d/yy Format$(Now,"m/d/yy") 返回值 5-25-06
d-mmm-yy Format$(Now,"d-mmm-yy") 返回值 25-5月-06
d-mmmm Format$(Now,"d-mmmm") 返回值 25-五月
mmmm-yy Format$(Now,"mmmm-yy") 返回值 五月-06
hh:mm AM/PM Format$(Now,"hh:mm AM/PM") 返回值 04:50 PM
h:mm:ss a/p Format$(Now,"h:mm:ss a/p") 返回值 4:51:38 p
h:mm Format$(Now,"h:mm") 返回值 16:51
h:mm:ss Format$(Now,"h:mm:ss") 返回值 16:51:38
m/d/yy h:mm Format$(Now,"m/d/yy h:mm") 返回值 5-25-06 16:54
----------------------------------
文本类型的格式化
----------------------------------
; 当两部分时,则第一部分为非空格式化,第二部分为null值或空值的格式化表达式
@ 匹配位置插入格式化文本,占位位置不存在时,显示空白(空字符串)
只有一个@符号时,是在最后面加上格式化文本
Format$("CHIN","@a") 返回值 CHINa
有多个@占位符,是按从右至左匹配

,并在相应的位置上显示格式化文本
Format$("CHIN","@a@@") 返回值 CHaIN
当与 ! 配合时,则变为从左至右匹配
Format$("CHIN","[email=!@a]!@a[/email]@@") 返回值 CaHIN
当占位符比原文本字符串多时,刚在相应位置上添加空格
Format$("C","@@a@") 返回值 空白空白aC
& 字符占位符。除在当占位位置不存在时,不显示外,其余均与@相同
当占位符比原文本字符串多时,刚在相应位置上添加空格
Format$("C","&&a&") 返回值 aC
< 强制小写。将所有字符以小写格式显示。
Format$("I love you","<") 返回值 i love you
> 强制大写。将所有字符以大写格式显示。
Format$("I love you",">") 返回值 I LOVE YOU
! 强制由左而右填充字符占位符。缺省值是由右而左填充字符占位符。
Format$("CHIN","[email=!@a]!@a[/email]@@") 返回值 CaHIN
----------------------------------------
强制使用中文格式的日期时间
----------------------------------------
aaaa 星期
Format$(Now,"aaaa") 返回值 星期五
O 中文月份
Format$(Now,"O") 返回值 五月
o 单字节月份
Format$(Now,"o") 返回值 5月
A 中文日期
Format$(Now,"A") 返回值 二十六日
a 单字节日期
Format$(Now,"a") 返回值 26日
E 短中文年份
Format$(Now,"E") 返回值 六年
e 单单字节年份
Format$(Now,"e") 返回值 6年
EE 中文年份
Format$(Now,"EE") 返回值 二○○六年
ee 单字节年份
Format$(Now,"ee") 返回值 2006年

想不到中文日期的问题就这么容易解决。

一是ACCESS数据库中日期型转换字符型使用函数Format()。其语法:Format(expression [, format ] [, firstdayofweek ] [, firstweekofyear ] ),参数expression必选,为任何有效的表达式; format可选,有效的命名格式表达式,或用户定义的格式表达式;firstdayofweek可选,指定一周的第一天;firstweekofyear可选,常量,指定一年的第一周。 UQd中国国家审计网

本例中实现上例功能语法如下:

select 个人编号,姓名, sum(金额) as金额 group by个人编号,姓名 where format(参保时间,’yyyymmdd’) between ‘20060430’ and ‘20070501’ order by sum(金额) desc,在AO2008里面使用Format()函数可以达到同样的效果。 UQd中国国家审计网

二是SQL SERVER2000数据库中日期型转换字符型。在SQL SERVER2000数据库中有两组日期型转换字符型函数Cast()或convert()。Cast()语法:CAST ( expression AS data_type[(length)])参数expression ,任何有效的表达式;data_type,目标数据类型;length,指定目标数据类型长度的可选整数。默认值30。Convert()语法:CONVERT(datatype,expression[,format-style])参数datatype,表达式将转换成的数据类型;expression,要转换的表达式;format-style,对于将字符串转换为日期或时间数据类型以及相反的转换过程;format-style是描述要使用的日期格式字符

串的样式代码。实现上例使用convert()函数如下:select 个人编号,姓名, sum(金额) as金额 group by个人编号,姓名 where convert(char(10),参保时间,112) between ‘20060430’ and ‘20070501’ order by sum(金额) desc。 UQd中国国家审计网

三是ORACLE数据库中日期型转换字符型。使用函数To_char(),to_char(timestamp, text) 把时间戳转换成字串,语法及参数略。实现上例使用具体语法:select 个人编号,姓名, sum(金额) as金额 group by个人编号,姓名 where to_char(参保日期,’yyyymmdd’) between ‘20060430’ and ‘20070501’ order by sum(金额) desc。 UQd中国国家审计网

Accees数据库虽然可以称得上是小型的关系型数据库,并且也是使用的结构化查询语言SQL,但它的语法(主要体现在函数上),却类似vbscript的语法,我想,这应该和Access属于Office系列有关,基于它的开发和应用,自然就与VBA扯上关系,因而Access的函数库也就是VBA的函数库,而非SQL函数库。下面,我们来具体看下Access和SQL Server在查询语句的编写上具体的不同。

一、数据类型转换:

Access: SELECT '调查'+CStr(Did) as diaocha FROM CZdengji
SQL Server: select artid,'调查'+Cast(listid As varchar) as did from kingart where artdate>=getdate()
Access中SQL查询的数据类型转换有很多函数,每一个函数都可以强制将一个表达式转换成某种特定数据类型。

具体如下:CBool(expression) 、CByte(expression) 、CCur(expression) 、CDate(expression) 、CDbl(expression) 、CDec(expression) 、CInt(expression) 、CLng(expression) 、CSng(expression) 、CStr(expression) 、CVar(expression) 、CStr(expression),相信不用说明,大家也看得懂这各种转换符的意思。

二、IIF函数(ACCESS专用)

Access: SELECT Id,IIF(Isfinished=1,'已完成','进行中'),Name,Diaocharen FROM CZdiaocha ORDER BY Isfinished ASC
SQL Server 的写法就相对更多,可以自定义函数,也可以使用case语句,如select Id,case Isfinished when 1 then '已完成'
when 0 then '进行中' end,Name,Diaocharen FROM CZdiaocha ORDER BY Isfinished ASC
三、DISTINCT关键字用法: Access里面distinct(expression)的用法单一, expression 只能为指定字段,而不能为表达式,SQL Server则不同, expression 除了可以为单个字段,也可以为一个子查询等复杂表达式。

四、日期格式化

Access: 使用format()函数,SELECT TOP 5 arttitle,format(artdate,'YY-MM-DD') as arttime FROM kingart WHERE listid=9,这里使用format()函数,指定artdate(日期型)查询出来的格式为YY-MM-DD。
SQL Server: 使用convert()函数,select Id,lanmu,title,content, convert(varchar(10),updatetime ,120) as update_time from news,这里的120,是指定格式为YY-MM-DD,如果是其他数字(101-120),就是其他的格式。
其它一些常用的SQL语句集



SELECT Top 5 * From Food WHERE Fid not in(Select top 5 Fid FROM Food) //查询第5到第10条记录
delete from Food where charindex('2007',uptime)>0 or charindex('2008', uptime )>0 //删除Food表中uptime列包含有2007或2008的记录,即删除时间为2007年和2008年的更新记录
select Id,lanmu,title,content, convert(varchar(10),updatetime ,120) as update_time from news // SQL Server里面的convert函数,转换成 varchar(10)类型, 120为指定转换后的格式。
select Mealtype as 餐别,Fname as 食物名称,sum(rjjingshisz)/2 as 人均净食生重总和 from CZdengji WHERE Did=6 group by Mealtype,Fname //分组查询,GROUP BY的本意就是重复的字段合为一,对应的信息,进行汇总(count、sum等运算)
Select Count(ID) from Flow where convert(varchar(21),visittime,120) like '2007-01-26% ' ,日期型数据模糊查询。

select * from ('MSDASQL','DRIVER={SQL Server};SERVER=服务器名字;UID=对端数据库的账号;PWD=对端密码', 对端数据库.权限者.对端的表) as 表 //跨服务器查询



string.Format("{0:C3}", 2) $2.000
D 十进制 string.Format("{0:D3}", 2) 002
E 科学计数法 1.20E+001 1.20E+001
G 常规 string.Format("{0:G}", 2) 2
N 用分号隔开的数字 string.Format("{0:N}", 250000) 250,000.00
X 十六进制 string.Format("{0:X000}", 12) C


string.Format("{0:000.000}", 12.2) 012.200

Strings

以下SQL语句在ACCESS XP的查询中测试通过
建表:
Create Table Tab1 (
ID Counter,
Name string,
Age integer,
[Date] DateTime);
技巧:
自增字段用 Counter 声明.
字段名为关键字的字段用方括号[]括起来,数字作为字段名也可行.

建立索引:
下面的语句在Tab1的Date列上建立可重复索引
Create Index iDate ON Tab1 ([Date]);
完成后ACCESS中字段Date索引属性显示为 - 有(有重复).
下面的语句在Tab1的Name列上建立不可重复索引
Create Unique Index iName ON Tab1 (Name);
完成后ACCESS中字段Name索引属性显示为 - 有(无重复).
下面的语句删除刚才建立的两个索引
Drop Index iDate ON Tab1;
Drop Index iName ON Tab1;

ACCESS与SQLSERVER中的UPDATE语句对比:
SQLSERVER中更新多表的UPDATE语句:
UPDATE Tab1
SET https://www.wendangku.net/doc/b88069077.html, = https://www.wendangku.net/doc/b88069077.html,
FROM Tab1 a,Tab2 b
WHERE a.ID = b.ID;
同样功能的SQL语句在ACCESS中应该是
UPDATE Tab1 a,Tab2 b
SET https://www.wendangku.net/doc/b88069077.html, = https://www.wendangku.net/doc/b88069077.html,
WHERE a.ID = b.ID;

即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.
上例中如果Tab2可以不是一个表,而是一个查询,例:
UPDATE Tab1 a,(Select ID,Name From Tab2) b
SET https://www.wendangku.net/doc/b88069077.html, = https://www.wendangku.net/doc/b88069077.html,
WHERE a.ID = b.ID;

访问多个不同的ACCESS数据库-在SQL中使用In子句:
Select a.*,b.* From Tab1 a,Tab2 b In 'db2.mdb' Where a.ID=b.ID;
上面的SQL语句查询出当前数据库中Tab1和db2.mdb(当前文件夹中)中Tab2以ID为关联的所有记录.
缺点-外部数据库

不能带密码.

在ACCESS中访问其它ODBC数据源
下例在ACCESS中查询SQLSERVER中的数据
SELECT * FROM Tab1 IN [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
外部数据源连接属性的完整参数是:
[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=password;]
其中的DRIVER=driver可以在注册表中的
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\
中找到

ACCESS支持子查询

ACCESS支持外连接,但不包括完整外部联接,如支持
LEFT JOIN 或 RIGHT JOIN
但不支持
FULL OUTER JOIN 或 FULL JOIN

ACCESS中的日期查询
注意:ACCESS中的日期时间分隔符是#而不是引号
Select * From Tab1 Where [Date]>#2002-1-1#;

在DELPHI中我这样用
SQL.Add(Format(
'Select * From Tab1 Where [Date]>#%s#;',
[DateToStr(Date)]));

ACCESS中的字符串可以用双引号分隔,但SQLSERVER不认,所以为了迁移方便和兼容,
建议用单引号作为字符串分隔符.

相关文档