SQL语句在ACCESS中的应用

来源:互联网 发布:网络信息保密协议 编辑:程序博客网 时间:2024/05/16 17:29

一、基本语句

1、 ACCESS中一般的 select Select 要查询的字段(全部查询则为“*”)from Tabel名 where 查询条件 select ID,姓名,性别,生日 from 会员信息; ACCESS中的字符串可以用双引号分隔,建议用单引号作为字符串分隔符.

ACCESS中日期查询Select * From Tab1 Where [Date]>#2010-1-1#;

 例:Select 记录时间 From 记录 Where时间>=#2009-11-1# ;

   Select 记录时间 From 记录 Where 时间<#2009-11-1# ;

注意:ACCESS中的日期时间分隔符是#而不是引号

2、 ACCESS中UPDATE UPDATE Tab1 a,Tab2 b SET a.Name = b.Name WHERE a.ID = b.ID;

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

3、 delete Delete from Tabel名 where 删除条件 若将表中记录全部删除则:

       Delete * from Tabel名 例:delete from 记录 Where 时间<=#2005-4-1# ;

二、基本函数

1、 计算函数

1)函数count()—计算纪录数Select count(*) From 会员信息 ;Select count(ID) From 记录 Where 时间>=#2009-11-1# ;

2)函数sum()Select sum(记录数) From 记录 ;Select sum(记录数)From 记录 Where 时间>=#2009-11-1# ;

3)max()—求最大值函数Select max(记录数) From 记录 ;Select max(记录数)From 记录 Where 时间>=#2009-11-1# ;

2、 日期函数

1) Date() 返回一个表示当前系统时间的格式化字符串select 记录时间, mid(date(),1,7) from 记录 ;※ Format() 将一个日期变体或一个数值转化成格式化字符串select 记录时间, format(记录时间,'yyyy/mm/dd') from 记录 ;select 记录时间, mid(format(时间,'yyyy/mm/dd'),1,7) from 记录 ;select 记录时间 from 记录 where mid(format(记录时间,'yyyy/mm/dd'),1,7)='2005-11' ;select distinct mid(format(记录时间,'yyyy/mm/dd'),1,7) from 记录 ;

2) Year(Date) 返回日期中的年值select Year(记录时间) from 记录 ;3) Month(Date) 返回日期中的月份值(1到12)select Month(记录时间) from 记录 ;

3、 数值函数

1)Abs(n) 返回n的绝对值select 记录数,abs(记录数) from 记录 ;

2) Int(n) 返回数字的整数部分 select 记录数,int(记录数) from 记录;

4、 转换函数

1) Format() 将一个日期变体或一个数值转化成格式化字符串select 记录时间, format(记录时间,'yyyy/mm/dd') from 记录 ;select 记录时间, mid(format(记录时间,'yyyy/mm/dd'),1,7) from 记录 ;select 记录时间 from 记录 where mid(format(记录时间,'yyyy/mm/dd'),1,7)='2005-11' ;select distinct mid(format(记录时间,'yyyy/mm/dd'),1,7) from 记录 ;

2)Val(n) 把字符串转换为数值值select 编号,val(编号) from 记录;

3)CSng()将表达式转换成字符select 记录数,csng(记录数) from 记录; //数值转换字符select 记录时间,csng(记录时间) from 记录; //日期转换字符

4) 字符串处理函数关键字 说明 示例 Ucase 将字符串中的字母改为大写 Ucase("Kim")返回KIM Lcase() 将字符串中的字母改为小写 Lcase("Kim")返回kim Len() 确定字符串的长度(以字符为单位) Len("Mississ")返回7 Right() 返回字符串右部指定个数的字符 Right("Budapest",3)返回pes Left() 返回字符串左部指定个数的字符 Left("Budapest",4)返回Buda Mid() 从某一指定起始点开始返回字符串中指定个数的字符 Mid("Sommers", 4, 3) 返回mer trim() 去除字符串前后空格 Rtrim() 去除字符串前右边空格 Ltrim() 去除字符串前左边空格 InStr() 从一个较大字符串中查找另一个字符 start% = InStr("bob","bobby")start%变量返回值1 String() 重复指定字符串中的字符,返回新的字符串 String(8, "*")返回******** Asc() 返回指定字母的ASCII代码 Asc("A") 返回65 Xor() 对两个数字执行“异或”操作,其返回值可用来对文本进行加密、解密 65 Xor 50 返回115 115 Xor 50 返回65 5、 函数min()—求最小值Select min(记录数) From 记录 ;Select min(记录数)From 记录 Where 记录时间>=#2009-11-1# ;三、关键字1、 @@IDENTITY 变量 @@IDENTITY 变量是一个全局的SQL变量,用户可以用它来提取使用COUNTER数据类型的列的最后使用值。用户在提取@@IDENTITY 变量时,不能指定表的名称。返回值总是最近的通过代码插入了数据的表的COUNTER域。 SELECT @@IDENTITY ;要给@@IDENTITY 值加上某个值,要将该变量用方括号括起来。 SELECT [@@IDENTITY] + 1 ;注意 上面SQL 语句中的@@IDENTITY变量只能通过Jet OLE DB provider 和 ADO执行提取,通过Access SQL View 用户界面提取的值将是0,另外,该值只有在通过代码插入记录时才会改变,如果通过用户接口,不管是数据表单、窗体还是Access SQL View窗口中的SQL语句, @@IDENTITY返回值都是0。因此, @@IDENTITY 的值只有在刚刚通过代码加入了记录是才是准确的。2、 DISTINCT关键字DISTINCT关键字用来控制结果集中重复的值如何进行处理,那些对于指定的列来说用户相同值的行将被过滤掉。如果多于指定的列大于一,则所有指定的列的结合将作为过滤条件。例如,如果用户查询Customers表中姓氏不同的记录,则返回的值都将是唯一的,任何重复姓氏的名字都将以结果集中的一个记录作为其结果。SELECT DISTINCT [Last Name] FROM tblCustomers ;尤其要注意的是,使用DISTINCT关键字的查询所返回的结果集不能更新,即是只读的。 例:select distinct ID from 记录 ; 3、 ORDER BY例:select * from 记录 ORDER BY 编号; 4、 IN操作IN操作是用来判断一个表达式的值是否属于一个指定列表中的值。如果这个表达式等于列表中的一个值,IN操作的返回值为True。而当没有找到,IN操作返回值为False。让我们假设我们想找到所有住在华盛顿州或乔治亚州的销售部成员。我们可以写一个带着长长的WHERE 子句,并使用AND逻辑操作符的SQL语句,而使用IN操作符会缩短我们写的语句。SELECT * FROM tblShipping WHERE State IN ('WA','GA') ;例:select * from 记录 where 编号 in ('06-03','06-04') ;通过使用NOT逻辑操作符,我们可以检索出IN操作的反操作结果,这个语句会返回所有不住在华盛顿州的销售部成员。SELECT * FROM tblShipping WHERE State NOT IN ('WA') ;例:select * from 记录 where 编号 not in ('06-03','06-04') ; 5、 BETWEEN操作BETWEEN操作用于判断一个表达式的值是否介于一个特定的范围之间。如果这个表达式的值介于这个特定范围之间,包括范围开始和结束的值,这个BETWEEN操作返回True。如果这个表达式得值不属于这个范围,则BETWEEN操作返回值为False。假设我们想找到所以金额介于50美圆到100美圆之间的所有发票。我们最好在WHERE 子句使用BETWEEN 操作以及关键字AND设定范围。SELECT * FROM tblInvoices WHERE Amount BETWEEN 50 and 100 ;通过使用NOT逻辑操作符,我们可以检索出BETWEEN操作的反操作结果,找到不在范围中的所有发票数量。SELECT * FROM tblInvoices WHERE Amount NOT BETWEEN 50 and 100 ;注意这个范围可以设定为相反的顺序并依旧得到相同的结果 (BETWEEN 100 和 50),但许多的适用于ODBC的数据库要求这个范围遵从从头到尾的顺序。如果你设计你的应用程序可以兼容或升级为适用于ODBC的数据库,你就应该总是按照从头到尾的方法使用。 6、 LIKE操作LIKE 操作一个样式就是就是一个完全的字符串或是一个包含有一个或多个通配符的部分字符串。通过使用LIKE 操作,你可以在一个结果集里查找一个域并找到所有符合特殊的样式的值。为了返回所有的名字以字母J开头的顾客,我们使用星号通配符。SELECT * FROM tblCustomers WHERE [Last Name] LIKE 'J%' ;例:select * from 记录 where 编号 like '06%' ;通过使用NOT逻辑操作符,我们可以检索出LIKE操作的反操作。SELECT * FROM tblCustomers WHERE [Last Name] NOT LIKE 'Johnson' ;例:select * from 记录 where 编号 not like '06%' ; 你在LIKE 操作样式里可以使用多种通配符,如下表所示:通配符描述%(百分号)-----匹配所有字符并可以被用在结构字符串的任何位置。?(问号)--匹配任何单个字符并可以被用在结构字符串的任何位置。_(下划线)---匹配任何单个字符并可以被用在结构字符串的任何位置。(只适用于ADO 和 the Jet OLE DB provider) #(数字符号)---匹配任何单个数字并可以被用在结构字符串的任何位置。[](方括号)---匹配任何被包括在方括号里面的单个字符,并可以被用在结构字符串的任何位置。!(感叹号)---匹配任何不属于被方括号所包含的字符列表中的单个字符。-(连字符)---匹配任何一个在方括号中的字符。注意: 上表所述的“%”和“_”通配符只能通过Jet OLE DB provider 或 ADO运行。如果通过. Access SQL View 用户界面运行它们将获得一个空的结果集。 7、 IS NULL 操作符空值就是指无值或不可知值。IS NULL操作符被用于判断一个表达式的值是否和一个空值相等。SELECT * FROM tblInvoices WHERE Amount IS NULL 通过添加NOT逻辑操作符,我们可以检索IS NULL操作符的反操作。在这个例子里,SQL语句将会除掉所有包含丢失的或未知值的发票记录。SELECT * FROM tblInvoices WHERE Amount IS NOT NULL ;8、SELECT INTO 语句SELECT INTO 语句,也可以理解为一个表单创建查询,可以用来从一个或多个已存在工作表中创建一个新的工作表。它所创建的工作表可以基于任何有效的SELECT语句。SELECT INTO 语句可以用来存储记录、创建备份表单或在一个外部数据库里创建新的工作表。当你用SELECT INTO 语句创建一个新工作表时,所有的新工作表里的域都继承于原始工作表。然而,不包括其他的工作表属性,如主关键字或索引都是在新工作表中被创建。一旦新的工作表被创建,你当然可以使用ALTER TABLE语句添加这些属性。如果你要创建一个新的工作表,可以使用一个带有你希望在工作表种包含的列的域列表和你新工作表的名称的SELECT INTO 语句,并在FROM子句里提供数据资源。SELECT * INTO tblNewCustomers FROM tblCustomers ;为了为新的工作表指定确定的域,把域名列表里的原始工作表的域名用星号代替,并用AS关键字来命名新的工作表中的各列。SELECT [First Name] & ' ' & [Last Name] AS FullName INTO tblNewCustomerNames FROM tblCustomers如果要在一个已经存在的外部数据库里创建新的工作表,你可以用IN关键字。如果外部数据库不存在,SELECT INTO 语句将会返回一个错误信息。SELECT * INTO tblNewCustomers IN 'C:\Customers.mdb' FROM tblCustomers ; 四、其他查询1、 子查询子查询就是在用在另一个SELECT、SELECT INTO、INSETT INTO 、DELETE 或UPDATE语句内部的SELECT语句。它可以帮助你对基于另一个结果集的结果进行进一步的限制。这叫做嵌入,并且因为一个子查询就是一个SELECT语句,你也可以把一个子查询嵌入到另一个子查询里面。当你在一个SQL语句中使用一个子查询的时候,它可以作为一个域列表、WHERE子句或者HAVING子句的一部分。这里由三种基本的子查询形式,并且每种都使用不同种类的谓词。IN子查询IN 子查询用于检索这样的一组值,即其中记录的某一列的值都为另一个工作表或查询中的一列的值包含。它从其它工作表中只能返回一列,这是一个限制条件。如果返回的多于一列就会产生一个错误。使用发票数据库例子,我们可以写出一个返回所有拥有发票的顾客的列表的SQL语句。SELECT * FROM tblCustomers WHERE CustomerID IN (SELECT CustomerID FROM tblInvoices)通过使用NOT逻辑操作符,我们可以检索和IN子查询相反的记录,从而可以获得所有没有任何发票的顾客列表。SELECT * FROM tblCustomers WHERE CustomerID NOT IN (SELECT CustomerID FROM tblInvoices)1) ANY/SOME/ALL子查询ANY、 SOME和ALL子查询谓词被用于比较主查询的记录和子查询的多个输出记录。ANY 和 SOME谓词是同义词并可以被替换使用。当你需要从主查询中检索任何符合在子查询中满足比较条件的记录时可以使用ANY或 SOME谓词。谓词应该恰好放在子查询开始的括号前面。SELECT * FROM tblCustomers WHERE CustomerID = ANY (SELECT CustomerID FROM tblInvoices)注意由上面SQL语句所返回的结果集和IN子查询例子所返回的那个相同。而与ANY和SOME谓词的不同之处就在于它们都可以使用等于(=)以外的操作符,比如大于(>)和小于(<)。SELECT * FROM tblCustomers WHERE CustomerID > ANY (SELECT CustomerID FROM tblInvoices)当我们想在主查询中检索满足子查询比较条件的所有记录时使用谓词ALL。SELECT * FROM tblCustomers WHERE CustomerID > ALL(SELECT CustomerID FROM tblInvoices)2)EXISTS子查询EXISTS谓词是用于子查询来在一个结果集中检查所以存在值的记录。换句话说,就是如果子查询没有返回任何行,这个比较就False。而如果它返回了一行或多行,这个比较就为True。SELECT * FROM tblCustomers AS A WHERE EXISTS(SELECT * FROM tblInvoices WHERE A.CustomerID = tblInvoices.CustomerID)注意在前面的SQL 语句里, tblCustomers 工作表使用了一个别名。这就是为何我们可以在后来的子查询中引用它的原因。当一个子查询以这种格式与一个主查询联接时就称相关查询。通过使用NOT逻辑操作符,我们可以检索和EXISTS子查询相反的记录,从而可以得到所有没有任何发票的顾客的结果集。SELECT * FROM tblCustomers AS A WHERE NOT EXISTS 2、 连接在一个如同Access的相关数据库系统中,你会常常需要同时从多个工作表中摘出信息记录。这可以通过使用一个SQL JOIN语句来实现。JOIN语句可以让你从已经定义了相互关系的工作表中检索记录,而不用管记录和工作表之间的关系是一对一、一对多还是多对多。1)内部连接内部连接,也被理解为对等连接,就是被使用的连接里最一般的形式。这种连接通过匹配一个各个工作表中共有的域值来从两个或更多的工作表中检索记录。你所连接的域必须具有类似的数据类型,但你就不能对MOMO和OLEOBJECT数据类型进行连接。为了建立一个INNER JOIN语句,在SELECT语句的FROM子句里使用INNER JOIN关键字。让我们使用INNER JOIN 建立所有拥有发票的顾客的结果集,并带上那些发票的时间和金额。SELECT [Last Name], InvoiceDate, Amount FROM tblCustomers INNER JOIN tblInvoicesON tblCustomers.CustomerID=tblInvoices.CustomerID ORDER BY InvoiceDate注意工作表名被INNER JOIN关键字所分开,并且相关的比较是在ON关键字的后面。对于相关的比较,你也可以使用<、 >、 <=、 >=或 <> 操作符,并且你也可以使用BETWEEN关键字。同时注意各个工作表只在比较关系中使用的ID域,它们都不是最后结果集的组成。如果要进一步的限制SELECT 语句我们可以在ON子句中的比较连接后面使用WHERE子句。在下面的例子中我们通过只包括1998年1月1日以后的发票来缩小结果集。SELECT [Last Name], InvoiceDate, Amount FROM tblCustomers INNER JOIN tblInvoices ON tblCustomers.CustomerID=tblInvoices.CustomerID WHERE tblInvoices.InvoiceDate > #01/01/1998# ORDER BY InvoiceDate在希望连接多个工作表的案例中,你可以嵌入INNER JOIN子句。在这个例子里,我们将在过去的一个SELECT语句的基础上产生我们的结果集,但我们也将通过为tblShipping工作表添加INNER JOIN使结果包括每个顾客的所在城市和国家。SELECT [Last Name], InvoiceDate, Amount, City, State FROM (tblCustomers INNER JOIN tblInvoices ON tblCustomers.CustomerID=tblInvoices.CustomerID) INNER JOIN tblShipping ON tblCustomers.CustomerID=tblShipping.CustomerID ORDER BY InvoiceDate注意第一个JOIN子句为圆括号所包含以使之从逻辑上和第二个JOIN子句分开。而在FROM子句中使用一个第二个工作表的别名把一个工作表连接到自身也是可能的。让我们假设我们想找到所有具有相同的名的顾客记录。我们可以通过为第二个工作表创建一个别名“A”并查找其姓氏不同的记录来实现。SELECT tblCustomers.[Last Name], tblCustomers.[First Name] FROM tblCustomers INNER JOIN tblCustomers AS A ON tblCustomers.[Last Name]=A.[Last Name] WHERE tblCustomers.[First Name]<>A.[First Name] ORDER BY tblCustomers.[Last Name]2)外部连接外部连接是在当记录保存在某一个工作表中时用于在多个工作表进行记录检索,即使在其它的工作表中没有匹配的记录也行。Jet 数据库引擎共支持两种类型的外部连接。考虑两个互相相近的工作表,一个在左边,另一个在右边。左外部连接将在右工作表中选择所有匹配比较关系标准的所有行和左工作表中的所有行,即使在右工作表中没有匹配记录存在。而右外部连接则是左外部连接的简单反转;即所有在右工作表中的行将被保存。作为一个例子,让我们假设我们想测定每个顾客的所有发票数量,但如果一个顾客没有发票,我们希望通过消息“NONE”来显示其信息。SELECT [Last Name] & ', ' & [First Name] AS Name, IIF(Sum(Amount) IS NULL,'NONE',Sum(Amount)) AS TotalFROM tblCustomers LEFT OUTER JOIN tblInvoicesON tblCustomers.CustomerID=tblInvoices.CustomerIDGROUP BY [Last Name] & ', ' & [First Name]在前面的SQL语句中仍然有几个问题。第一个是对字符串连接操作符“&”的使用,这个操作符允许你把两个或更多的域连接到一起组成一个字符串。第二个是 immediate if(IIF)语句,它会检查合并后的字符串是否为空。如果为空,这个语句将返回消息“NONE”,而如果组合不是空,将返回组合后的值。最后一点是外部连接子句。使用左外部连接保存左工作表的行从而让我们可以看到所有的顾客,包括那些没有发票在帐目中的。在一个多工作表的连接中外部连接可以被嵌套在内部连接里,但内部连接不可以被嵌套在外部连接中。3)笛卡儿乘积当我们讨论联接时常常遇到的一个术语是笛卡儿乘积。笛卡儿乘积的定义为“把所有表单的所有行完全合并”。例如,如果你想不用任何约束把两个工作表联合在一起,你就完成了一个笛卡儿乘积。SELECT * FROM tblCustomers, tblInvoices这不是一个好东西,特别当你要处理的工作表中包含有成百上千行数据时。所以你应该通过约束你的连接来避免笛卡儿乘积。The UNION operator虽然UNION 的操作也可以视为一个合并查询,但我们不可以技术性地把它看作是一个联接,它之所以被提到是因为它能把从多个来源获得的数据合成一个结果表单中,而这一点和某些类型的联接是类似的。UNION 操作一般被用来把来自表单、SELECT语句或查询的数据结合,并省略掉任何重复的行。所有的数据源必须有相同数目的域,不过这些域不一定要是相同的数据类型。让我们假设我们有一个雇员表单,其中具有和顾客工作表单相同的结构,那么我们希望合并这两个工作表得到一个姓名和电子邮件地址信息的列表。SELECT [Last Name], [First Name], Email FROM tblCustomers UNION SELECT [Last Name], [First Name], Email FROM tblEmployees如果你希望找到这些表中的所有域,我们可以使用TABLE关键字,如同下面一样:TABLE tblCustomers UNION TABLE tblEmployeesUNION操作不会显示任何在两个表单中重复出现的记录,但它可以通过在UNION关键字后使用谓词ALL来覆盖重复信息,如下所示:SELECT [Last Name], [First Name], Email FROM tblCustomers UNION ALL SELECT [Last Name], [First Name], Email FROM tblEmployees3、 交叉表查询(转换语句)虽然转换语句也可以视为一个交叉表查询,但我们不可以技术性地把它看作是一个联接,它之所以被提到是因为它能把从多个来源获得的数据合成一个结果表单中,而这一点和某些类型的联接是类似的。TRANSFORM 语句通常用于计算总数、平均值、数目以及其它对记录进行总体统计的算法。并在计算后把结果信息显示在一个格子或数据表中,其中的数据分别按照行和列排列。一个TRANSFORM 语句的一般形式如下:TRANSFORM aggregating function SELECT Statement PIVOT column heading field我们假设我们可以建立一个按照每一年为基础显示每个顾客的所有发票的数据表。这个列名应该是顾客的姓名,而行名则将是年份。让我们修改原来的SQL语句以符合转变后的语句.TRANSFORM IIF(Sum([Amount]) IS NULL,'NONE',Sum([Amount])) AS Total SELECT [Last Name] & ', ' & [First Name] AS Name FROM tblCustomers LEFT JOIN tblInvoices ON tblCustomers.CustomerID=tblInvoices.CustomerIDGROUP BY [Last Name] & ', ' & [First Name]PIVOT Format(InvoiceDate, 'yyyy')IN ('1996','1997','1998','1999','2000')注意SUM函数是合计函数,组里的列的题头用在SELECT 语句的子句里,而行的名字由PIVOT关键字后所列出的域名决定。

0 0