站内搜索

ACCESS入门教程(十七)SQL语言妙用

查询SQL视图的切换

  在使用过程中,我们经常会使用到一些查询,但这些查询用各种查询向导和设计器都无法做出来,不知道你还记不记得,在查询那一课中我们讲过SQL查询,用这种查询就可以完成比较复杂的查询工作。当时你还刚刚开始使用ACCESS,用设计视图和向导就可以建立很多有用的查询,这些足够你掌握一段时间了,而且它的功能已经基本上能满足我们的需要。而SQL语言作为一种通用的数据库操作语言,并不是ACCESS用户必须要掌握的,但在实际的工作中有时必须用到这种语言才能完成一些特殊的工作。
  单纯的SQL语言所包含的语句并不多,但在使用的过程中需要大量输入各种表、查询和字段的名字。这样当你建立一个涉及大量字段的查询时,就需要输入大量文字,与用查询设计视图建立查询相比,就麻烦多了。所以我在建立查询的时候也都是先在查询设计视图将基本的查询功能都实现了,最后再切换到SQL视图通过编写SQL语句完成一些特殊的查询。下面我们就介绍一些在ACCESS使用中常常会用到的一些SQL语言。

  我们说过在建立查询的时候可以切换到SQL视图去,下面来看看是怎么切换的:

“sql数据库”窗口

  当你打开一个查询以后,单击“新建方法”列表的时候并没有一个“使用SQL视图创建查询”的选项,

“新建查询”对话框

  这也表明ACCESS并不提倡在工作中使用SQL语言,那我们就单击“在设计视图中创建查询”这一项,之后将会在屏幕上出现一个设计视图,

“选择查询”窗口

  现在我们要切换到SQL视图,只要将鼠标移动到工具栏最左面的“视图”选项按钮“SQL设计视图”按钮右边的向下按钮上,单击鼠标左键,在弹出的下拉菜单中选中“SQL 设计视图”项就可以将视图切换到SQL状态。

SQL视图状态

基本的SQL语句  

  在SQL语言中用得最多的就是SELECT语句了。我们就先讲讲SELECT语句吧。    SELECT语句构成了SQL数据库语言的核心,它的语法包括5个主要子句,分别是FORMWHEREGROUP BYHAVINGORDER BY子句。
  SELECT语句的结构是这样的。 SELECT 〈字段列表〉 FROM 〈表列表〉 [ WHERE〈行选择说明〉][GROUP BY 〈分组说明〉][ HAVING 〈组选择说明〉] [ORDER BY 〈排序说明〉];

select语句的结构

  实际上,当我们要将表1的字段1和字段3用来建立一个查询的话,只需要书写下面这样一条语句就可以了。 SELECT 表1.字段1,表1.字段3(表的名字、字段名最好和具体的例子结合起来,下同) FROM 表1
  我们可以这样理解这句话,从表1中选择出字段1和字段3,选中的每个字段都用逗号隔开,并且每个字段前面都列的有表或查询的名字,并用“.”联起来。而FROM后面则需要有包含这些字段的所有表的名称,各个名称之间要用逗号联接起来。

一个例子


  现在我们可以单击“工具”菜单上的“执行”按钮“执行”按钮

查询结果的显示

  现在我们看到了这个查询的结果,和直接用查询视图设计的查询产生了相同的效果。其实ACCESS中所有的数据库操作都是由SQL语言构成的,微软公司只是在其上增加了更加方便的操作向导和可视化设计罢了。
  当我们直接用设计视图建立一个同样的查询以后,将视图切换到SQL视图,你会惊奇的发现,在这个视图中的SQL编辑器中有同样的语句。看来是ACCESS自动生成的语句。 原来ACCESS也是先生成SQL语句,然后用这些语句再去操作数据库。
  现在我们再讲讲SELECT语句中后几种子句的用途吧。你发现这些子句都被方括号适起来了,这是表明这些子句在SELECT语句中都是可选项目,其中WHERE 子句是一个行选择说明子句,用这个语句可以对我们所选的行,就是表中的记录进行限制,当WHERE 后面的行选择说明为真的时候才将这些行作为查询的行,而且在WHERE中还可以有多种约束条件,这些条件可以通过“AND”这样的逻辑运算符联接起来。
SELECT 表1.字段1,表1.字段3
FROM 表1
WHERE 表1.字段2 = 2

一个表的连接的例子

  现在我们再单击工具栏中的“执行”按钮,这个操作就不能在查询设计视图中做出来。让我们将视图切换到设计视图,你看,这个功能在设计视图中也能实现。

设计视图

  原来只需要将字段“单价”也作为一个字段放入查询表格中,并在准则中将这个字段的值设置为“<30”。
  下面让我们来看看GROUP BY 子句,这两个词在ACCESS中你一定见过,在用设计视图建立总计查询的时候,在表格中会出现一个总计选项。这时在这个选项对应的表格内就出现GROUP BY这两个词。
分成了组的记录  现在我们就来看看这个子句有什么用处。
SELECT 表1.字段2,SUM( 表1.字段3)
FROM 表1
GROUP BY 字段2

图例

  单击工具栏上的“执行”按钮就会发现这个SQL语句将字段2中的所有记录分成了几组,并将这几组的总消耗都统计了出来,其中SUM函数是用来产生合计的函数。
  现在再讲讲HAVING子句,当你在使用GROUP BY 子句对表或查询中的记录进行分组的时候,有时我们会要求对所选的记录进行限制,只允许满足条件的行进行分组和各种统计计算。于是我们写到
SELECT 表1.字段2,SUM( 表1.字段3)
FROM 表1
GROUP BY 字段2
HAVING 表1.字段2= 2

图例

  单击工具栏上的“执行”按钮,我们发现这两个查询产生的结果是一样的。

共同的查询结果 两种语句

  但在标准的SQL语言中,要和GROUP BY 共同使用的条件限制语句只有 HAVING 子句,所以要记住在使用GROUP BY 子句时最好不要用WHERE 子句来对条件进行限制。   在这个SELECT 语句中还有一个ORDER BY 语句,这个语句是用来将各种记录进行排序。
SELECT 表1.字段2,SUM( 表1.字段3)
FROM 表1
ORDER BY 表1.字段3

  现在执行这个查询,我们发现所有记录的顺序是按照字段3来进行的。

查询结果

  通过这个例子你现在会使用这个子句了吧?
  SQL语句的单一功能非常简单,掌握起来也很容易。但要将这些语句组合起来建立一个较大的查询,还需要在输入各种表、查询和它们中的字段名时要非常仔细。

使用SQL语句联接表

  在SQL中,很多威力都来自于将几个表或查询中的信息联接起来,并将结果显示为单个逻辑记录集的能力。在这种联接中包括INNER、LEFT、RIGHT这三种JOIN操作。
  首先我们来讲讲INNER JOIN 的用法:INNER JOIN 语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,在语法上,INNER JOIN 是这样定义的。

INNER JOINd的定义方式

  举个例子:我们现在要将“图书资料表”和“出版社资料表”联接起来,然后列出出版社所出的图书。让我们先看看这两个表,

出版社资料表

图书资料表

  然后在SQL设计视图中输入以下内容

输入的内容

  现在我们执行这个SQL语句,

执行结果

  发现现在的查询结果将所有出版社和图书都列了出来。
  这个查询好像也可以用下面的语句来实现。

另一种语句

  将两个查询都切换到数据表视图后我们会发现两个查询的查询结果虽然一样,但在使用INNER JOIN操作的查询中可以添加新的数据。就像在表中添加数据一样。而没有使用INNER JOIN 操作的查询就不能添加新数据,相比之下使用INNER JOIN操作的查询更像将两个具有相关内容的表联接在一起新生成的表。
  知道了它的用处,我们来看看LEFT JOIN 的结构:
FROM [表名1] LEFT JOIN [表名2]
ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]

  其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来。而RIGHT JOIN 和LEFT JOIN 相反。
  所以刚才的那个例子还可以写成:

刚才那个例子程序的另一种写法

  单击工具栏上的“执行”按钮,我们看到这时显示的数据表和刚才显示的用LEFT JOIN 的数据表一样。现在看出来了吧,原来它们的功能是可以互换的。

  如果想将几个表联接起来,在JOIN操作中我们可以进行嵌套操作,有三个表:表1、表2、表3,现在将三个表联接起来:
FROM (表1 INNER JOIN 表2 ON 表1.序号=表2.序号)
INNER JOIN 表3
ON 表1.序号=表3.序号

  这样这三个表就联接起来了。

定义新的字段名

  
  在有的时候,将要建立的查询中的字段名意义有了新的变化,不能再使用,或者有的新字段是由表达式构成的,这样的字段都需要在查询中为它们设定新的名字。在SQL中可以用“AS”操作来实现定义新的字段名。

  例如在新建的查询中将“表1”中的“字段1”的内容对应到新字段“新字段1”中: SELECT 表1.字段1 AS 新字段1 FROM 表1; 现在再看看这个查询的数据表,可以看到在表中的字段名已经换成了“新字段1”了。

 

插图

  • 上一篇:ACCESS入门教程(十八)外部数据的使用
  • 下一篇:ACCESS入门教程(十六)模块与“VBA”语言