Access一些常用的SQL语句

您可以将 Microsoft Office Access 2013 用作创建、修改数据库以及处理数据的工具,还可将 Office Access 2013 用作服务器数据库管理系统(如 Microsoft SQL Server)的前端(界面)。通常,使用 Office Access 2013 作为前端应用程序时,需要链接到服务器数据库管理系统中的表,然后就像这些链接的表位于 Access 数据库中那样使用它们。结构化查询语言 (SQL) 的处理由 Access 在您的本地计算机上执行。

不过,在某些情况下,您可能希望由服务器计算机执行 SQL 处理。例如,您的台式机速度较慢,而数据库服务器计算机功能强大,此时在服务器计算机上处理查询可提高性能。或者,您可能要运行位于服务器计算机上的存储过程 (存储过程:由 SQL 语句和可选流控制语句组成的预编译集合,按一个名称存储,并作为一个单元处理。此集合存储在 SQL 数据库中,可以通过某应用程序的一个调用运行。),而在本地计算机上 Access 正在处理 SQL,那么将无法执行此操作。要想在数据库服务器计算机上处理 SQL,请使用传递查询 (传递查询:SQL 特定查询,可以用于直接向 ODBC 数据库服务器发送命令。通过使用传递查询,可以直接使用服务器上的表,而不用让 Microsoft Jet 数据库引擎处理数据。)。

连接到服务器数据库管理系统

要连接到服务器数据库管理系统,您可将服务器数据库管理系统配置为 ODBC 数据源 (ODBC 数据源:位于支持开放式数据库连接性 (ODBC) 协议的程序或数据库中,需要进行访问的数据和信息。)。

 注释   只有本地计算机的 Administrators 组的成员才可以配置 ODBC 数据源。

在 Windows Vista 中配置数据源

  1. 单击“开始”按钮,单击“控制面板”,然后执行下列操作之一:
  • 在分类视图中,单击“系统和维护”,然后单击“管理工具”。
  • 在经典视图中,单击“管理工具”。
  1. 双击“数据源(ODBC)”。

将出现“用户帐户控制”确认对话框。

  1. 单击“继续”。
  2. 单击“系统 DSN”选项卡。
  3. 请执行下列操作之一:
  • 要为已安装的驱动程序定义新数据源,请单击“添加”。
  • 要修改现有数据源的定义,请单击数据源的名称,然后单击“配置”。
  1. 根据需要更改对话框中的信息。

有关不同选项的详细信息,请单击每个对话框中的“帮助”按钮。

在 Microsoft Windows XP 中配置 ODBC 数据源

  1. 单击“开始”按钮,单击“控制面板”,然后执行下列操作之一:
  • 在分类视图中,单击“性能和维护”,然后单击“管理工具”。
  • 在经典视图中,单击“管理工具”。
  1. 双击“数据源(ODBC)”。

将出现“ODBC 数据源管理器”对话框。

  1. 单击“系统 DSN”选项卡。
  2. 请执行下列操作之一:
  • 要为已安装的驱动程序定义新数据源,请单击“添加”。
  • 要修改现有数据源的定义,请单击数据源的名称,然后单击“配置”。
  1. 根据需要更改对话框中的信息。

有关不同选项的详细信息,请单击每个对话框中的“帮助”按钮。

 

创建传递查询

  1. 在“创建”选项卡上的“其他”组中,单击“查询设计”。
  2. 关闭“显示表”对话框。
  3. 在“设计”选项卡上的“查询类型”组中,单击“传递”。

Access 将隐藏查询设计网格并显示“SQL 视图”对象选项卡。

  1. 如果尚未显示属性表,请按 F4 来显示它。
  2. 在属性表中,单击“ODBC 连接字符串”属性框,然后单击“构建”。

将出现“选择数据源”对话框。

  1. 单击“计算机数据源”选项卡。
  2. 在“数据源名称”下,单击在前面的过程中配置的服务器计算机的名称,然后单击“确定”。

 注释   如果尚未配置 ODBC 数据源,请单击“新建”,然后执行创建新数据源向导中的步骤。

  1. 如果提示您登录,请输入用户名和密码。
  2. 如果提示您在连接字符串中保存密码,请不要保存您的密码。

不保存密码有助于提高您的服务器数据库系统的安全性。

10. 在“SQL 视图”对象选项卡中键入查询。

 注释   请记住要使用适于您的数据库管理系统的 SQL 语法,此语法可能与 Access SQL 语法不同。

11. 在键入查询之后,请在“设计”选项卡上的“结果”组中,单击“运行”。

您的查询将发送到数据库服务器计算机进行处理。

  注释  

  某些传递查询不会返回数据。例如,您可能要运行一个不向 Access 返回任何数据的存储过程,例如将数据库权限授予组或用户的脚本。如果传递查询不向 Access 返回数据,应该将查询的属性表中的“返回记录”属性值更改为“否”。

  某些传递查询可能将服务器处理消息返回给 Access。如果要将这些消息收集在一个表中以供以后查看,请将查询的属性表中的“日志消息”属性值更改为“是”。存储这些消息的表的名称格式为用户名连接一个连字符以及一个以 00 开始的连续数字。

 

以下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 a.Name = b.Name
FROM Tab1 a,Tab2 b
WHERE a.ID = b.ID;

同样功能的SQL语句在ACCESS中应该是 

UPDATE Tab1 a,Tab2 b
SET a.Name = b.Name
WHERE a.ID = b.ID;

即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.

上例中如果Tab2可以不是一个表,而是一个查询,例:

UPDATE Tab1 a,(Select ID,Name From Tab2) b
SET a.Name = b.Name
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=SQLServer;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]

部数据源连接属性的完整参数是: 

[ODBC;DRIVER=driver;SERVER=server;DATABASE=database;UID=user;PWD=pass(word);]

其中的DRIVER=driver可以在注册表中的

HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.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不认,所以为了迁移方便和兼容,

建议用单引号作为字符串分隔符.

查询时生成序号

SELECT (SELECT Count([xlh].[aa]) AS AutoNum FROM xlh WHERE  (((xlh.aa)<=xlh_Alias.aa));) AS 序号, xlh.aa
FROM xlh AS xlh_Alias INNER JOIN xlh ON xlh_Alias.aa=xlh.aa
ORDER BY xlh.aa;

多表sql查询

SELECT test.aa AS 第一个字段, test1.bb AS 第二个字段, test1.cc
FROM test, test1
WHERE test.aa=test1.aa;

多表sql查询1

SELECT a.aa, b.bb, b.cc, b.cc*100 AS 合计
FROM test AS a, test1 AS b
WHERE a.aa=b.aa;

多表sql查询排序

SELECT a.aa, b.bb, b.cc AS 第三个字段
FROM test AS a, test1 AS b
WHERE a.aa=b.aa
ORDER BY b.cc;

查询例子

SELECT a.dhhm
FROM xl11a AS a, xl919 AS b
WHERE a.dhhm=b.dhhm and aa<>"1";

日期时间分隔符是#而不是引号

Select * From Tab1 Where [Date]>#2002-1-1#; 

两个表关联修改多个字段

UPDATE chhl AS a, jbsj AS b SET a.fzr = b.fzr, a.gh = b.gh
WHERE a.dhhm=b.dhhm;

update  chhl set (fzr,gh)=
(SELECT b.fzr, b.gh
FROM chhl AS a, jbsj AS b
WHERE a.dhhm=b.dhhm);

如果Tab2可以不是一个表,而是一个查询

UPDATE Tab1 a,(Select ID,Name From Tab2) b 
SET a.Name = b.Name 
WHERE a.ID = b.ID;

UPDATE Tab1 a,Tab2 b 
SET a.Name = b.Name 
WHERE a.ID = b.ID;

访问多个不同的ACCESS数据库-SQL中使用In子句,外部数据库不能带密码

Select a.*,b.* From Tab1 a,Tab2 b In 'db2.mdb' Where a.ID=b.ID;

将一个表的某个字段置空

UPDATE chhl AS a SET a.fzr = null, a.gh = null;

删除两个表中字段一样的记录

delete from xl11 where dhhm in(SELECT a.dhhm
FROM xl11 AS a, xl919 AS b
WHERE a.dhhm=b.dhhm;);

完成后ACCESS中字段Name索引属性显示为--(无重复)

Create Unique Index iName ON Tab1 (Name);

下面的语句删除刚才建立的两个索引 

Drop Index iDate ON Tab1; 
Drop Index iName ON Tab1;

 

posted @ 2016-01-19 16:53  laf-studio  阅读(3128)  评论(0编辑  收藏  举报