Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 综合其它

ACCESS数据库的SQL语句教学(三)

时 间:2012-07-16 10:21:18
作 者:宏鹏(转载)   ID:21115  城市:上海
摘 要:ACCESS数据库的SQL语句教学
正 文:

21Exists谓词查询:其实In就是谓词查询,还有谓词ExistsExists,这两个谓词实现的功能是相同的,只是写法不同。In多用于嵌套子查询语句中,而Exists多用于判断Select语句是否返回查询结果。常用量词有AnyAllSome是同义词。在进行比较运算时,只要子查询中有一行能使结果为真,结果就为真。而All则要求子查询中所有行都使结果为真时,结果才为真。下面以显示那些仓库中还没有职工的仓库信息为例,讲解一下In谓词与Exists谓词在代码上的不同。
Exists谓词实现:
Select * from 仓库 where not Exists(Select * from职工 where 仓库号=仓库.仓库号)
In谓词实现:
Select * from 仓库 where 仓库号 not in(Select 仓库号 from 职工)
 
22Any量词查询:Any量词查询,在进行比较运算时,只要子查询中有一行能使结果为真,则结果即为真。下面就以显示工资大于等于wh2仓库中任一名职工工资的职工信息为例,讲解一下Any量词的应用。
Any量词实现:
Select * from 职工 where 工资>=any(Select 工资 from 职工 where 仓库号='wh2')
使用统计函数实现:
Select * from 职工 where 工资>=(Select min(工资) from 职工 where 仓库号='wh2')
 
23All量词查询:All量词查询,要求子查询中所有行都使结果为真时,结果才为真。下面就以显示工资大于等于wh1仓库中所有职工工资的职工信息为例,讲解一下All量词的应用。
Any量词实现:
Select * from 职工 where 工资>=All(Select 工资 from 职工 where 仓库号='wh1')
使用统计函数实现:
Select * from 职工 where 工资>=(Select MAX(工资)from 职工 where 仓库号='wh1')
 前面讲解的量词查询都可以用统计函数代替,但有些查询是不能用统计函数代替的。下面以显示工资大于所有不同仓库的平均工资的职工信息为例为讲解一下。
Select * from 职工 where 工资>all(Select avg(工资)from 职工 group by 仓库号)
该题用统计函数就无法解决。
 
24、显示部分记录的Top查询:在编程中,有时只需显示满足条件的前几条记录,这时就可以使用Top关键字。可以直接使用Top数字,显示指定条数记录;也可以使用Top数字Percent,显示所有满足条件记录的前百分之几条记录。
下面以显示工资最高的前三条职工信息为例来讲解一下。
Select top3 * from 职工 order by 工资 desc
 
25、保存查询:利用Into语句可以把查询的结果保存成一张新表。下面就以备份“职工”表为例讲解一下保存查询。
Use 企业销售管理系统
Select * into 职工备份 from 职工
这样就生成一张新表,表名为“职工备份”。
 
26、集合的并运算:SQL支持集合的并运算(Union),即可以将两个Selec语句的查询结果通过并运算合并成一个查询结果。为了进行并运算,要求这样的两个查询结果具有相同的字段个数,并且对应的字段的值要出自同一个值域,即具有相同的数据类型和取值范围。
Select * from 仓库 where 城市='北京'
Union
Select * from 仓库 where 城市='上海'
 
27、集合的交运算:SQL支持集合的交运算(Intersect),即可以将两个Selec语句的查询结果通过交运算合并成一个查询结果。为了进行交运算,要求这样的两个查询结果具有相同的字段个数,并且对应的字段的值要出自同一个值域,即具有相同的数据类型和取值范围。
Select 仓库号 from 仓库
Intersect
Select 仓库号 from 职工
注意它们对集合的差运算不支持。
 
28、多表连接查询:多表连接查询就是将多个表中的数据结合到一起的查询,即连接操作可以在一个Select语句中完成从我个表中查找和处理数据。使用连接的列必须是可连接的,即它们具有相同的数据类型、相同的意义。使用连接的列,列名可以相同,也可以不同。
 
29、笛卡儿积:有的时候,如果连接条件没有设置好,或者没有设置连接条件,则结果将包含太多的行,这就是由笛卡儿积造成的。从原理上来讲,连接首先将形成表的笛卡儿积,即形成用于连接的表中所有的行的组合。下面以仓库表与职工表连接为例为讲解一下。
Select * from 职工, 仓库
这是从两张表中显示所有字段,所以字段有重复,并且产生了90条记录,原因是仓库表中有5条记录,职工表有18条记录,所以连接的结果是18×5=90条记录。用于连接的表越多,则笛卡儿积的结果将越大。

30、多表连接:在进行多表连接时,一定要注意连接条件,下面以仓库表与职工表连接为例来讲解一下多表连接。
Select * from 职工,仓库 where 职工.仓库号=仓库.仓库号
这时显示的记录就没有那么多了,只显示18条记录,并且发现两张表的仓库号是相对应的。
假设显示工资大于1500,面积大于600的城市与姓名信息。
Select 城市,姓名 * from 职工,仓库 where 职工.仓库号=仓库.仓库号 and 工资>1500 and 面积>600
 
31、超连接查询:超连接查询也是连接查询,所以必须有两张或两张以上的表。超连接查询共有4种:内连接查询、左连接查询、右连接查询、全连接查询。使用超连接查询不仅可以把满足条件的记录显示出来,还可以把一部分不满足条件的记录以NULL显示出来。
1)内连接查询:只有满足连接条件的记录才出现在查询结果集中。下面以显示面积大于600的仓库号、职工号、城市、面积、工资信息为例为讲解一下内连接:
超连接:
Select 仓库.仓库号,职工号,城市,面积,工资 from 仓库 inner join 职工 on 职工.仓库号=仓库.仓库号 and 面积>600
普通连接:
Select 仓库.仓库号,职工号,城市,面积,工资 from 职工,仓库 where 职工.仓库号=仓库.仓库号 and 面积>600
2)左连接查询:除满足连接条件的记录显示外,第一张表中不满足条件的记录也出现在查询结果集中。下面以显示面积大于600的仓库号、职工号、城市、面积、工资信息为例为讲解一下左连接。
Select 仓库.仓库号,职工号,城市,面积,工资 from 仓库 left join 职工 on 职工.仓库号=仓库.仓库号 and 面积>600
    3)右连接查询:除满足连接条件的记录显示外,第二张表中不满足条件的记录也出现
在查询结果集中。下面以显示面积大于600的仓库号、职工号、城市、面积、工资信息为例为讲解一下右连接。
Select 仓库.仓库号,职工号,城市,面积,工资 from 仓库 right join 职工 on 职工.仓库号=仓库.仓库号 and 面积>600
4)全连接查询:除满足连接条件的记录显示外,两张表中不满足条件的记录也出现
在查询结果集中。下面以显示面积大于600的仓库号、职工号、城市、面积、工资信息为例为讲解一下全连接。
Select 仓库.仓库号,职工号,城市,面积,工资 from 仓库 full join 职工 on 职工.仓库号=仓库.仓库号 and 面积>600
5)多表超连接查询:前面讲解了两个表的超连接,那么如果是3张表或更多张表该如何实现超链接呢?下面以显示面积大于600的仓库号、职工号、城市、面积、工资、金额信息为例为讲解一下多表超连接。要显示的字段信息来源于3张表,仓库表、职工表、订购单表,这里实现仓库表与职工表的左连接,职工表与订购单表的右连接。
Select 仓库.仓库号,职工号,城市,面积,工资,金额 from 仓库 left join 职工 on 职工.仓库号=仓库.仓库号 right join 订购单 on 职工.职工号=订购单.职工号 and 面积>600
 
32、Insert插入语句:向数据库表中插入数据是最常用的功能:
1)指定所有列:
Insert into 仓库(仓库号,城市,面积,创建时间) values ('wh6','郑州','800','2005-12-01')
按下键盘上的F5键,会显示(1行受影响),这表示已成功地插入一条记录。再在数据库引擎查询文档中输入“Select * from 仓库”,然后按下键盘上的F5键,就可以执行该SQL语句,这样就可以在查询结果上看到你插入的记录。在这里要注意,仓库ID是自动编号,所以不能插入。其实上面的代码还可以省略表后面的字段,这样也可以成功地插入记录。
Insert into 仓库 values ('wh6','郑州','800','2005-12-01')
2)指定部分列:
下面以向仓库表中添加一条记录为例来讲解一下指定部分列。
Insert into 仓库(仓库号,面积) values ('wh7',800)
上述代码也可以这样来写:
Insert into 仓库 values ('wh7',null,800,null)
Insert into 仓库(仓库号,城市,面积,创建时间) values ('wh7',null,800,nul)
 
3)带有子查询的插入语句:使用带有子查询的插入语句,首先要注意两个表的结构相同。下面还是用一个实例来讲解一下。
首先创建一张与仓库表结构相同的空表,然后在数据库引擎查询文档中输入如下代码:
Select * into 仓库 blank from 仓库 where 面积<0
按下键盘上的F5键,会显示(0行受影响),这表示已成功地插入一条记录。再在数据库引擎查询文档中输入“Select * from 仓库 blank”,然后按下键盘上的F5键,就可以执行该SQL语句,这样就产生了一张与仓库表结构相同的空表。
下面就可以利用带有子查询的插入语句向仓库blank中插入记录了。
Insert into 仓库 blank(仓库号,城市,面积,创建时间) select 仓库号,城市,面积,创建时间 from 仓库 where 面积>600
按下键盘上的F5键,会显示(6行受影响),这表示已成功地插入6行记录。再在数据库引擎查询文档中输入“Select * from 仓库 blank”,然后按下键盘上的F5键,就可以执行该SQL语句,这样就可以利用Insert语句一次向表中插入多条记录。
 
33、Update更新语句:向数据库表中添加记录后,可能需要对数据库进行修改。
1)修改所有记录:
下面以为所有仓库的面积都增加100为例为讲解一个修改所有记录。
Update 仓库 set 面积=面积+100
2)指定条件的更新语句:
下面以把城市在上海或北京的仓库的面积增加100为例,来讲解一下指定条件的更新语句。
Use 企业销售管理系统
Update 仓库 set 面积=面积+100 where 城市='上海' or 城市='北京'
 
34、Delete删除语句:与添加记录一样,删除记录也是数据库中一个重要的功能。
Delete语句仅仅删除数据库表中的记录,不会删除表。
Delete语句不能删除单个列的值,而是删除整个记录。
关键字Where可以有,也可以没有。如果不加条件,则删除整张表的所有记录;如果有条件,则删除表中满足条件的记录。
1)指定条件的删除语句:
下面以删除仓库blank表中仓库面积大于900的记录为例,来讲解一下指定条件的删除语句。
Delete from 仓库 blank 面积>900
2)删除表中所有记录:
下面以删除仓库blank表中所有记录为例,来讲解一下删除表中所有记录。
Delete from 仓库 blank
truncate from 仓库 blank
truncate语句与Delete语句之间是有区别的,Delete语句实际上是对表中每一个记录执行删除操作,而数据库执行随之可能产生的所有任务,如触发器;truncate语句仅仅把所有记录一次删除,将会忽略定义的触发器,因此执行速度比Delete语句要快。由于truncate语句不处理删除引起的其他事件,因此使用它可能产生数据库完整性问题,所以对于有依赖关系的表,最好使用Delete语句删除。
相关索引: 上一节


Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助