资源描述
SQL语言
在透视表中的应用
目 录
一、Select入门: 1
实例应用(单表查询) 8
1. 查询财经、计算机专业的学生情况 8
2. 查询成绩在80-95之间的学生情况 9
3. 查询前六位学生成绩排名 9
4. 计算增加学生的年龄字段 9
5. 统计财经系的男女人数 10
6. 按照性别,学部查询学生人数 11
7. 查找选修2门以上课的学生 11
8. 查询选修课两门以上,并且成绩在85分以上的学生 12
9. 字段名称查询约定 12
☆不规则表查询: 13
二、Select进阶: 18
(一)联合查询(合并查询) 18
例:依据学号查询语文和物理成绩 18
☆多表列不相等的数据合并查询 18
(二)嵌套查询 20
(1) 查询“张三”选修的课程和成绩 21
(2)查询“张三”选修的语文课和成绩 21
※嵌套查询中的子查询详解: 22
(1)单行子查询(简单嵌套查询) 22
(2)多行子查询(带〔in〕的嵌套查询) 22
(3)多重嵌套子查询 23
(4)带有any(some) 或 all 谓词的子查询 23
(5)带〔(not) exists〕的嵌套查询 25
(6)自连接 27
(三)多表查询(关联查询) 31
1、 依据学号条件查询学生的各门成绩 32
2、依据学号条件查询学生的各门成绩大于85分 32
☆☆☆综合示例 32
(1)查询员工的基本工资 32
☆表名和别名使用规则: 33
(2)联合查询每个部门每个员工对应的基本工资 34
(3)查询每个部门每个员工的销售总额 34
(4)查询每个产品的销售情况 35
3、各班级干部的第一名的记录 36
4、进出库的综合查询 36
(四)对于同一表格的分散数据如 38
(五)同一表格多重数据 39
(六)transform 交叉查询 40
☆语法: 40
☆语法详解: 42
null在transform中的应用 51
(七)格式转换 51
三、where子句查询条件 52
1、运算符 53
2、Or 与 And 54
3、Between……And 54
4、IN ,NOT IN 54
5、 Like 55
四、SQL语言的select命令基本格式 57
☆查询语句各个部分的执行顺序: 59
☆select命令的几个说明 59
☆SQL查询特性 64
☆SQL语句多表联接的几种形式 65
☆常见问题及解答 66
五、其他功能查询 68
1、Select Into和Insert Into 68
2、Update 语句 69
3、DELETE 语句 69
4、INSERT INTO 语句 70
5、生成表查询 72
六、基于Mcrosoft Query(MQ)查询 72
1、MQ参数查询: 75
2、使用MQ可以自动更新 77
七、VBA书写SQL语句方法 79
附:各Excel版本使用SQL的步骤与注意事项 83
(一)方法步骤 83
(二)注意事项 87
参考网址:
ttp://
http://club.E
http://www.E http://club.E
一、Select入门:
“数据源”表:
日期
分钟
小时
番号
出货数
检查数
不良数
40634
120
2
40065
142
142
0
40634
540
9
40066
616
626
10
40635
30
0.5
40061
31
35
4
40635
120
2
40066
128
149
21
40635
75
1.25
40062
61
63
2
40639
60
1
93657
197
201
4
40639
360
6
93657
1140
1171
31
40640
120
2
93657
263
268
5
40640
360
6
43010
1176
1222
46
40641
300
5
43010
819
830
11
40642
240
4
43010
804
825
21
40645
270
4.5
40061
299
311
12
40645
60
1
40062
61
61
0
40646
330
5.5
40062
389
396
7
40646
150
2.5
40065
196
198
2
40647
240
4
40065
256
263
7
40647
240
4
40066
186
186
0
40647
60
1
43010
130
132
2
40647
60
1
93657
97
98
1
40666
120
2
99999
123
123
0
40909
180
3
12345
234
432
198
1、如提取字段名为”日期”,”出货数”,”检查数”的列的记录(从名为”数据源”表),请使用类似这样的select语句:
select 日期,出货数,检查数 from [数据源$]
如提取所有列的记录,这样一个列名一个列名写有点麻烦,那怎么办呢,其实可以用*,这个相当于所有列的记录:
select * from [数据源$]
2、如果只想提取番号是”40056”的所有记录怎么办,这时就需用where。where语法:
where 筛选条件
select * from [数据源$] where 番号=40065
3、如果仅想提取两个番号的记录呢,这时就得用”in(番号1,番号2)”;IN是运算符,判断表达式的项是否在指定的集合中。
select * from [数据源$] where 番号in (40065,40066)
4、如果想要得到番号40065和出货数196的所有记录,这时就得用and,把筛选条件连起来;
select * from [数据源$] where 番号 = 40065 and 出货数 = 196
5、如想筛选出数量在某个区间的所有项目,这时就得用 “between 起始数量 and 结束数量”,用以指定范围;
如:筛选出出货数在200到500之间的记录
select * from [数据源$] where 出货数 between 200 and 500
6、假如不想筛选出数量在某个区间的所有项目,这时就得用”not between 起始数量 and 结束数量”;
如:筛选出货数不在200到500的数量
select * from [数据源$] where 出货数 not between 200 and 500
7、有的时候番号很多,但其中有很多是重复的,那怎么去重复项目,只保留不重复呢,这时就得使用”distinct 番号”,distinct就是去重复的。
select distinct 番号 from [数据源$]
输入语句后就得到所有不重复的番号,效果如下:
8、如果要对数据进行排序,必须用order by,语法:
order by 字段 desc
order by 字段 asc(或省略)
asc(升序),默认情况下sql都是升序的,可以省略不写;desc(降序)。如果想要把不重复的番号进行降序排序就可以使用下面的语句
select distinct 番号 from [数据源$] order by 番号 desc
9、插入计算字段:
在普通的透视表中可以用插入计算字段对透视表进行运算,用sql同样可以做到。
如:汇总每个番号的不良数(即检查数-出货数)
select 番号,检查数-良品数 as 不良数 from [数据源$]
10、聚合函数。excel最有魅力的地方是函数,那么在sql中可以使用函数吗?怎么使用?下面通过简单的例子来了解sql中的函数。如,求总出货数(对某个字段进行求和):
select sum(出货数) from [数据源$]
求平均出货数:
select avg(出货数) from [数据源$]
求出货批数:
select count(出货数) from [数据源$]
看到这里,问题来了,怎么求和,平均数,计数上面都有Expr1000?,又该怎么换成自己需要的字段名呢?
Expr1000其实是sql默认的字段名,完全可以自定义成任意想展现的字段,这时就得使用”as”,具体如下:
select count(出货数) as 批数 from [数据源$]
效果如下:
如果想知道每种番号的最大出货数,这时就得用”group by” 来进行分组了。
select 番号,max(出货数) as 最大出货数 from [数据源$] group by 番号
相反,如果想求每种番号的最小出货数,就可以这样写:
select 番号,min(出货数) as 最小出货数 from [数据源$] group by 番号
再来一个难度大一点点的,求良品率(就是总良品数/总检查数)。这样就需要先对数据进行求和(sum),因为使用聚合函数,就需要对字段进行分组(group by)
select 番号,sum(良品数)/sum(检查数) as 良品率 from [Sheet1$] group by 番号
注:这种实际用插入计算字段更简单,只是为了说明sql语句而已
如果想得到每个番号的最大值且最大值大于300的所有项目怎么办,也许有人会说用:
select 番号,max(出货数) as 最大出货数 from [数据源$] group by 番号 where max(出货数) >300
前面说到,where可以进行筛选出想要的结果,不过在这里就不合适了,会提示出错。既然这样,那有什么办法解决呢?使用了聚合函数,就得用having。其实两者都用于按条件筛选,只是一个用于分组前,一个用于分组后。
分组后按一定条件对这些组筛选,则可以在group by 子句后,加上having 短句来指定筛选条件。注意:having短句通常和group by 子句结合使用。
select 番号,max(出货数) as 最大出货数 from [数据源$] group by 番号 having max(出货数) >300
假如想得到番号以”400”开头的总出货数,在excel函数中表示多个字符用*,一个字符用?,那在sql中是不是一样呢?
其实sql中有自己的一套表示方法,“%”代表多个字符,“_”代表单个字符,所以400开头的可以这样表示like '400%',具体如下
select 番号,sum(出货数) as 总出货数 from [数据源$] group by 番号 having 番号 like '400%'
聚合函数对一组值执行计算并返回单一的值。聚合函数忽略空值。聚合函数经常与 select 语句的 group by 子句一同使用。
(1)SQL聚合函数语法:
SELECT 函数名(列名) FROM [表名$]
(2)聚合函数中,sum、count、avg均忽略空值,当使用group by分组查询时,所有的聚合函数均忽略空值。
(3)COUNT(*)是统计表的行记录,COUNT(字段)是统计表指定字段的记录。
(4)聚合函数中的参数可以是字段名、函数和常量,但不能是其他聚合函数。
(5)聚合函数除列举的求和、计数、平均值、首次、末次,还包括标准偏差和标准方差。即:sum、Count、Avg、First、Last、Min、Max、StDev、StDevP、Var、VarP
SQL聚合函数
函数名
功能
COUNT
返回指定组中项目的数量。
AVG
返回指定组中的平均值,空值被忽略。
SUM
返回指定数据的和,只能用于数字列,空值被忽略。
MIN
返回指定数据的最小值。
MAX
返回指定数据的最大值。
First
返回第一条记录中的指定值
Last
返回最后一条记录中的指定值
StDev
返回给定表达式中所有值的统计标准偏差。
StDevP
返回给定表达式中的所有值的填充统计标准偏差。
Var
返回给定表达式中所有值的统计方差。
VarP
返回给定表达式中所有值的填充的统计方差。
……
……
(6)分组查询通常与SQL聚合函数一起使用,先按指定的数据项分组,再对各组计算。如果不分组,则聚合函数将作用整个查询结果。
实例应用(单表查询)
表名:学生
序号
姓名
年龄
性别
平均成绩
学部
1
张三
22
女
85.6
财经
2
李四
21
男
72.5
网络技术应用
3
王五
18
男
90
计算机
4
马六
19
女
100
财经
5
周七
23
男
92.5
多媒体技术
6
丽萍
17
女
75.5
网络技术应用
7
海华
18
男
65
网络技术应用
8
方海
20
女
92
财经
9
凯丽
17
女
77
多媒体技术
10
李阳峰
20
男
85
财经
11
蒋海坡
19
男
90
网络技术应用
12
蔡明波
22
男
95
多媒体技术
13
姜大雨
19
男
87
计算机
14
马 华
21
女
99
多媒体技术
15
呈浩歌
19
男
100
计算机
1. 查询财经、计算机专业的学生情况
select 姓名,性别,平均成绩,学部 from [学生$] where 学部 in (“财经”,”计算机”)
2. 查询成绩在80-95之间的学生情况
select * from [学生$] where 平均成绩 between 80 and 95 order by 姓名,平均成绩 desc
3. 查询前六位学生成绩排名
select top 6 * from [学生$] order by 平均成绩 desc
4. 计算增加学生的年龄字段
表名:出生
序号
姓名
出生
性别
平均成绩
学部
1
张三
1980年2月12日
女
85.6
财经
2
李四
1980年3月1日
男
72.5
网络技术应用
3
王五
1982年2月12日
男
90
计算机
4
马六
1978年1月23日
女
100
财经
5
周七
1979年1月24日
男
92.5
多媒体技术
6
丽萍
1980年1月25日
女
75.5
网络技术应用
7
海华
1982年1月26日
男
65
网络技术应用
8
方海
1981年1月27日
女
92
财经
9
凯丽
1978年1月28日
女
77
多媒体技术
10
李阳峰
1983年1月29日
男
85
财经
11
蒋海坡
1978年1月30日
男
90
网络技术应用
12
蔡明波
1984年1月31日
男
95
多媒体技术
13
姜大雨
1981年2月1日
男
87
计算机
14
马 华
1982年2月2日
女
99
多媒体技术
15
呈浩歌
1987年2月3日
男
100
计算机
select 姓名,性别,(year(date())-year(出生)) as 年龄 from [出生$]
5. 统计财经系的男女人数
select 性别,count(*) as 人数 from [出生$] where 学部=”财经” group by 性别
6. 按照性别,学部查询学生人数
select 性别,学部,count(*) as 人数 from [出生$] group by 性别,学部
求和项:人数
学部
性别
汇总
财经
男
1
女
3
多媒体技术
男
2
女
2
计算机
男
3
网络技术应用
男
3
女
1
总计
15
7. 查找选修2门以上课的学生
表名:选修
姓名
性别
平均成绩
学部
张三
女
85.6
财经
张三
女
72.5
网络技术应用
程七
男
90
计算机
马六
女
100
财经
周七
男
92.5
多媒体技术
丽萍
女
75.5
网络技术应用
丽萍
女
65
网络技术应用
方海
女
92
财经
凯丽
女
77
多媒体技术
李阳峰
男
85
财政
李阳峰
男
90
网络技术应用
蔡明波
男
95
多媒体技术
蔡明波
男
87
计算机
蔡明波
男
99
多媒体技术
呈浩歌
男
100
计算机
select 姓名,性别 from [选修$] group by 姓名,性别 having count(*) >=2
计数项:姓名
姓名
性别
汇总
张三
女
1
蔡明波
男
1
李阳峰
男
1
丽萍
女
1
总计
4
8. 查询选修课两门以上,并且成绩在85分以上的学生
select 姓名 from [选修$] where 平均成绩>=85 group by 姓名 having count(*)>=2
计数项:姓名
姓名
汇总
蔡明波
1
李阳峰
1
总计
2
9. 字段名称查询约定
①假如字段名称被强制换行,那么,生成的字段名称会有一个“_”,“_”为强制换行的位置;
②假如字段名称含有空格或特殊字符,会被自动替换成相应的字符;且必须用“[]”或“``”括住字段名称。
在写SQL语句时,字段名称使用的是更正后的字段名称,而不是数据源表的列标题。
③当字段名称是空或字段名称以数字开头,SQL会自动的将该字段的名称更正为Fx。其中,x为该字段在表中的位置。
④文本用双引号或单引号表示,如:测试1,可以表示为: "测试1",也可以表示为 '测试1';
路径和表用中括号或重音符区别。如路径D:\连接测试\测试1,可以表示为: [D:\连接测试\测试1.xls].[表名$],也可以表示为`D:\连接测试\测试1.xls `.`表名$`。重音符与波浪符处于同一个键,位于波浪符之下 (“1”左边那个键)。
☆不规则表查询:
例1:
表名:数据源
区域
门店.
业务员
1月
2月
数量
金额
数量
金额
白云
白云第3分店
李泽坚
105
2835
300
5100
白云
白云第4分店
张德培
235
11045
420
7560
黄埔
黄埔第2分店
黄泽处
15
600
黄埔
黄埔第5分店
李明爱
195
2340
470
18330
黄埔
黄埔第7分店
黄泽处
340
13600
105
2205
荔湾
荔湾第3分店
张楚
345
3450
荔湾
荔湾第3分店
陈想妹
20
240
280
13160
荔湾
荔湾第4分店
张楚
天河
天河第2分店
张建中
300
1200
125
2500
天河
天河第3分店
陈红
45
810
250
7000
天河
天河第6分店
陈红妹
125
6250
205
4715
越秀
越秀第5分店
李毅建
130
1430
460
17940
越秀
越秀第7分店
陈东建
35
1365
450
18900
要求(返回表):
1、找出2月金额比1月金额小的记录(说明:结果表返回所有字段)。
select [_区域] as 区域,[_门店#] as 门店,[_业务员] as 业务员,[1月] as 1月,F5 as 1月金额,[2月] as 2月,F7 as 2月金额 from [数据源$A1:G15] where IIf(isnull(f7),0,f7)<IIf(isnull(f5),0,f5)
区域
门店
业务员
1月
1月金额
2月
2月金额
白云
白云第4分店
张德培
235
11045
420
7560
黄埔
黄埔第7分店
黄泽处
340
13600
105
2205
荔湾
荔湾第3分店
张楚
345
3450
天河
天河第6分店
陈红妹
125
6250
205
4715
2、两个月都没有销售过的业务员记录(结果表返回所有字段)。
select [_区域] as 区域,[_门店#] as 门店,[_业务员] as 业务员,[1月] as 1月数量,F5 as 1月金额,[2月] as 2月数量,F7 as 2月金额 from [数据源$a1:g15] where F5&F7 IS NULL and [_区域] is not null
区域
门店
业务员
1月数量
1月金额
2月数量
2月金额
荔湾
荔湾第4分店
张楚
3、返回各区域的汇总金额(结果表只返回区域,总数量,总金额)。
select 区域,sum(数量) as 总数量,sum(金额) as 总金额 from (select [_区域] as 区域,[1月] as 数量,F5 as 金额 from [数据源$a1:g15] union all select [_区域],[2月],F7 from [数据源$a1:g15]) where 区域 is not null group by 区域
区域
总数量
总金额
天河
1050
22475
白云
1060
26540
荔湾
645
16850
越秀
1075
39635
黄埔
1125
37075
例2:
销售数量
二手货
新货
电脑
电视
冰箱
电脑
电视
冰箱
空调
华南
广州
142
41
135
25
29
173
123
华南
深圳
130
87
11
188
64
49
43
华北
北京
87
15
137
13
63
159
45
华北
天津
28
170
180
21
194
89
30
华东
上海
139
151
49
172
142
75
186
华东
南京
187
71
177
180
99
120
23
华东
苏州
24
191
121
14
128
55
84
华东
杭州
140
23
77
195
146
93
134
方法一:
select * from (select 销售数量 as 地区,F2 as 城市,二手货 as 电脑,F4 as 电视,F5 as 冰箱,0 as 空调,'二手货' as 成色 from [原始数据$] union all select 销售数量 as 地区,F2 as 城市,新货 as 电脑,F7,F8,F9,'新货' from [原始数据$]) where 地区 is not null
效果如下:
方法二:
select F1 as 地区,F2 as 城市,电脑,电视,冰箱,0 as 空调,'二手货' as 成色 from [原始数据$a2:i] union all select F1,F2,电脑1,电视1,冰箱1,空调,'新货' from [原始数据$a2:i]
效果如下:
方法三:
select F1 as 地区,F2 as 城市,F3 as 电脑,F4 as 电视,F5 as 冰箱,0 as 空调,'二手货' as 成色 from [原始数据$a3:i] union all select F1,F2,F6,F7,F8,F9,'新货' from [原始数据$a3:i]
注:此法需在向导中取消勾选【首行作为字段标题】或在【连接属性】-【连接字符串】中将【HDR=YES】改为【HDR=NO】。效果如下:
例3:
XXXX公司1-2销售表
小组.
员 工
商品
名称
1月
2月
数量
金额
数量
金额
豺狼队
王泽村
相机
35
10000
55
2000
豺狼队
张良
相机
40
6000
25
2000
豺狼队
曹达明
相机
55
4000
40
7000
疯子队
刘富城
空调
15
4000
55
11000
疯子队
郭美美
空调
15
3000
35
11000
疯子队
张猛
空调
20
7000
35
2000
精英队
张德华
电脑
50
9000
50
9000
精英队
李明
电脑
45
9000
40
8000
精英队
孔钱孙
电脑
20
10000
10
5000
无敌队
王学友
电脑
55
7000
15
9000
无敌队
张德明
电脑
55
5000
10
4000
无敌队
关羽长
电脑
25
6000
40
10000
英雄队
钟丽眉
空调
25
10000
25
7000
英雄队
李自强
空调
40
8000
30
3000
英雄队
曹孟德
空调
45
5000
25
3000
智慧队
郭黎明
相机
15
9000
20
8000
智慧队
陈泽强
相机
55
6000
15
3000
智慧队
诸葛武侯
相机
10
6000
50
5000
方法一:
select [小组#] as 小组,[员 工] as 员工,[商品_名称] as 商品名称,[1月] as 数量,F5 as金额,'1月' as 月份 from [数据源$a2:g] union all select [小组#],[员 工],[商品_名称],[2月],F7,'2月' from [数据源$a2:g]
注:此法将分别产生空行。
方法二:
select F1 as 小组,F2 as 员工,F3 as 商品名称,F4 as 数量,F5 as 金额,'1月' as 月份 from [数据源$a4:g] union all select F1,F2,F3,F6,F7,'2月' from [数据源$a4:g]
注:此法需在向导中取消勾选【首行作为字段标题】或在【连接属性】-【连接字符串】中将【HDR=YES】改为【HDR=NO】。
二、Select进阶:
(一)联合查询(合并查询)
联合查询就是将两个或更多独立查询或表的结果通过并运算(union)合并为一个查询结果。①SQL进行合并查询时,union操作中的所有查询必须具有相同数目的字段(即要求的列字段要一一对应,才能用Union进行连接合并);但是,这些字段的大小或数据类型不必相同。②仅在第一个select语句中使用别名,因为别名在任何其他语句中将被忽略。
例:依据学号查询语文和物理成绩
select 学号,成绩, 课程 from [课程$] where 课程= "语文" union select 学号, 成绩,课程 from [课程$] where 课程= "物理"
求和项:成绩
学号
课程
汇总
101
物理
95
语文
85
103
物理
75
104
物理
60
语文
50
☆多表列不相等的数据合并查询
如需合并的查询结果表列字段数不能一一对应,可以想办法虚构:用Null as 字段名或0 as 字段名,添加上空的列字段,使字段能一一对应。Null可以理解为缺少或未知的数据。
①用表直接汇总:
select 部门名称,科目,SUM(一季度) AS 一季度,SUM(二季度) AS 二季度,SUM(三季度) as 三季度 from (select 部门名称,科目,一季度,二季度,0 as 三季度 from [A$] union all select 部门名称,科目,0 ,0 ,三季度 from [B$] union all select * from [C$]) GROUP BY 部门名称,科目
②用透视表汇总:
select 部门名称,科目,一季度,二季度,0 as 三季度 from[A$] union all select 部门名称,科目,0 ,0 ,三季度 from[B$] union all select * from[C$]
③添加页字段:
select "A",部门名称,科目,一季度,二季度, 0 as 三季度 from [A$] union all select "B",部门名称,科目,0 as 一季度, 0 as 二季度, 三季度 from [B$] union all select "C",部门名称,科目,一季度,二季度, 三季度 from [C$]
可以用UNION代替UNION ALL去重复。语句为:
SELECT 部门名称,科目,SUM(一季度) AS 一季度,SUM(二季度) AS 二季度,SUM(三季度) AS 三季度 FROM (SELECT 部门名称,科目,一季度,二季度,三季度 FROM [c$] UNION SELECT 部门名称,科目,NULL,NULL,三季度 FROM [b$] UNION SELECT 部门名称,科目,一季度,二季度,NULL FROM [a$])GROUP BY 部门名称,科目
(二)嵌套查询
在SQL语言中,一个 select……from ……where 语句构成一个查询块。将一个查询块嵌套在另外一个查询块的where 子句(或having短语中)的条件的查询称为嵌套查询。子查询(内层查询)形成的结果又成为父查询(外层查询)的依据,因此,子查询的结果必须有确定的值。 利用嵌套查询可以将几个简单查询组成一个复杂查询,从而增强SQL的查询能力。子查询可以嵌套多层,子查询操作的数据表可以是父查询不操作的数据表。
还有将子查询返回的结果作为字段出现等,也属于嵌套查询。
表名:学生
学号
姓名
性别
101
张三
男
102
李四
女
103
王五
男
104
赵六
男
表名:课程
编号
学号
课程
成绩
1
101
语文
85
2
101
物理
95
3
103
物理
75
4
103
化学
92
5
103
历史
89
6
102
外语
90
7
102
地理
100
8
104
数学
0
9
104
语文
50
10
104
物理
60
(1) 查询“张三”选修的课程和成绩
内层查询或子查询
select 学号,课程,成绩 from [课程$] where 学号=(select 学号 from [学生$] where 姓名 ="张三")
求和项:成绩
学号
课程
汇总
101
物理
95
语文
85
注意:该写法也可以用下面这种写法来代替:
select [课程$].学号, [课程$].课程, [课程$]成绩 from [课程$]a,[学生$]b where a.学号 =b.学号 and b.姓名 ="张三")
(2)查询“张三”选修的语文课和成绩
select 学号,课程,成绩 from [课程$] where 学号= (select 学号 from [学生$] where 姓名="张三") and 课程="语文"
求和项:成绩
学号
课程
汇总
101
语文
85
※嵌套查询中的子查询详解:
①子查询必须放在括号内;
②子查询也必须放在比较操作符号的右边;
③子查询最多可以嵌套到255级;
④子查询中不能使用ORDER BY子句,即ORDER BY必须位于查询的最外层。
(1)单行子查询(简单嵌套查询)
单行子查询并不是最后输出的结果只能返回一行,而是指子查询只能返回一行。
有一条规则我们必须记住:
当我们用“等于”比较操作符把子查询和父查询嵌套在一起时,父查询期望从子查询那里只得到一行返回值。
例:查询得到单价表里满足产品名在产品表里产品ID为“102-5000”的产品的相关信息
select 单价表.客户,单价表.产品名,单价表.单价 from [单价表$] where 单价表.产品名 = (select 产品表.产品名 from [产品表$] where [产品表$].产品ID ="102-5000")
其它一些表明是单行子查询的比较操作符有“>,>=,<,<=,<>”。
(2)多行子查询(带〔in〕的嵌套查询)
多行子查询,意味着子查询返回的结果子集可以是多行。因此,我们通常用集合比较操作符(如:IN, NOT IN)把父查询和子查询连接起来。
例 :查询得到雇员表里满足薪水符合姓名为张三的薪水的所有雇员的相关信息
select 雇员表.雇员编号, 雇员表.姓名, 雇员表.职位, 雇员表.薪水 from 雇员表 where 薪水 in (select 薪水 from 雇员表 where 姓名='张三')
注:此语句完成的查询薪水和张三相等的职员,也可以使用〔not in〕来进行相反的查询。
(3)多重嵌套子查询
上面两例中,主查询的WHERE子句中都只有一列。然而,有时需要主查询处理多重关系。
例:查询每个部门工资最高的职工信息
select * from [职工表$] where 部门编号 & '-' & 工资 in ( select 部门编号 & '-' & 工资 from (select 部门编号,max(工资) as 工资 from [职工表$] group by 部门编号))
(4)带有any(some) 或 all 谓词的子查询
使用any 或all 谓词时必须同时使用比较运算符。
谓词
说明1
等价于
备注:
>ANY(SOME)
大于子查询里的某一个值
>min()
1、当要比较的值只有一个时,可以直接用<、>、=、<>
2、使用聚合函数实现子查询通常比ANY/ALL等谓词高效,因为使用聚合函数可以减少比对次数。
=ANY(SOME)
等于子查询内的某一个值
in
>=ANY(SOME)
大于等于子查询内的某一个值
>=min()
<ANY(SOME)
小于子查询内的某一个值
<max()
<=ANY(SOME)
小于等于子查
展开阅读全文