收藏 分销(赏)

SQL语言在数据透视表中的应用.doc

上传人:xrp****65 文档编号:7216056 上传时间:2024-12-28 格式:DOC 页数:90 大小:5.41MB 下载积分:10 金币
下载 相关 举报
SQL语言在数据透视表中的应用.doc_第1页
第1页 / 共90页
SQL语言在数据透视表中的应用.doc_第2页
第2页 / 共90页


点击查看更多>>
资源描述
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) 小于等于子查
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服