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 中配置数据源
- 单击“开始”按钮,单击“控制面板”,然后执行下列操作之一:
- 在分类视图中,单击“系统和维护”,然后单击“管理工具”。
- 在经典视图中,单击“管理工具”。
- 双击“数据源(ODBC)”。
将出现“用户帐户控制”确认对话框。
- 单击“继续”。
- 单击“系统 DSN”选项卡。
- 请执行下列操作之一:
- 要为已安装的驱动程序定义新数据源,请单击“添加”。
- 要修改现有数据源的定义,请单击数据源的名称,然后单击“配置”。
- 根据需要更改对话框中的信息。
有关不同选项的详细信息,请单击每个对话框中的“帮助”按钮。
在 Microsoft Windows XP 中配置 ODBC 数据源
- 单击“开始”按钮,单击“控制面板”,然后执行下列操作之一:
- 在分类视图中,单击“性能和维护”,然后单击“管理工具”。
- 在经典视图中,单击“管理工具”。
- 双击“数据源(ODBC)”。
将出现“ODBC 数据源管理器”对话框。
- 单击“系统 DSN”选项卡。
- 请执行下列操作之一:
- 要为已安装的驱动程序定义新数据源,请单击“添加”。
- 要修改现有数据源的定义,请单击数据源的名称,然后单击“配置”。
- 根据需要更改对话框中的信息。
有关不同选项的详细信息,请单击每个对话框中的“帮助”按钮。
创建传递查询
- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 关闭“显示表”对话框。
- 在“设计”选项卡上的“查询类型”组中,单击“传递”。
Access 将隐藏查询设计网格并显示“SQL 视图”对象选项卡。
- 如果尚未显示属性表,请按 F4 来显示它。
- 在属性表中,单击“ODBC 连接字符串”属性框,然后单击“构建”。
将出现“选择数据源”对话框。
- 单击“计算机数据源”选项卡。
- 在“数据源名称”下,单击在前面的过程中配置的服务器计算机的名称,然后单击“确定”。
注释 如果尚未配置 ODBC 数据源,请单击“新建”,然后执行创建新数据源向导中的步骤。
- 如果提示您登录,请输入用户名和密码。
- 如果提示您在连接字符串中保存密码,请不要保存您的密码。
不保存密码有助于提高您的服务器数据库系统的安全性。
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;