暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA SQL 子查询

Excel VBA练习 2021-07-15
1206

写着写着复习到SQL中的子查询了...


首先,我们需要知道什么是子查询

子查询也称为嵌套查询,小编在初次接触SQL的时候,总是有大佬说,你用嵌套查询呀...说的就是用子查询

子查询就是位于另一个查询的Where子句里的查询,它返回的通常是作为主查询的一个条件,从而进一步限制数据库返回的数据,在某些情况下,子查询能够间接地基于一个或者多个条件把多个数据库中的数据关联起来,当然在SQL IN EXCEL中,工作表不能说是一个数据库,可以理解为数据源,表什么的,知道是那么一回事就好...

当查询里使用子查询的时候,子查询首先会被执行,然后主查询会根据子查询返回的结果执行

子查询常常会用于主查询中的Where子句或者是Having子句


在使用子查询之前,先了解下子查询的一些规则

  • 子查询必须位于圆括号里面

  • 除非子查询里有多个字段用于子查询比较,否则,子查询的Select子句里只有一个字段

  • 子查询里不能使用Order By子句

  • 返回多条记录的子查询只能用于多值操作符(如IN)配合使用

  • 子查询不能直接被包围在函数里面

  • 操作符BetWeen不能用于子查询,在子查询里可以使用它


如下图所示


单值子查询

例如,也是常见的求出大于平均销售值的姓名

使用函数AVERAGE(C2:C29)返回结果为45.7...

也就是说销售数量大于45.7的既是满足条件的结果

    strSQL = "Select 姓名,销售数量 From " & strSource & " Where 销售数量>(Select Avg(销售数量) From " & strSource & ")"

    圆括号中作为一个子查询计算出销售的平均值,外面的Select为主查询,Where条件销售数量大于销售平均值的记录

    返回结果为:

    单值子查询,顾名思义可以理解为返回一个值,可以用使用运算符对其进行判断,最终返回成立的结果


    还是以上图为例,找出姓名为"洪飞"所在的地区,该地区所有的销售明细

    这里可以拆分下

    首先找出陈飞所在的地区

      strSQL = "Select 销售地区 From " & strSource & " Where 姓名='洪飞'"

      返回的结果为"东莞"

        strSQL = "Select * From " & strSource & " Where 销售地区='东莞'"

        查询东莞的明细

        组合在一起

          strSQL = "Select * From " & strSource & " Where 销售地区= (Select 销售地区 From " & strSource & " Where 姓名='洪飞')"

          这里也可以使用IN来代替销售地区=

            strSQL = "Select * From " & strSource & " Where 销售地区 in (Select 销售地区 From " & strSource & " Where 姓名='洪飞')"

            当然,也可以使用之前所写的Where连接查询

              strSQL = "Select a.* From " & strSource & "a," & strSource & "b Where a.销售地区=b.销售地区 And b.姓名='洪飞'"


              小编从学习SQL开始,就发现很多时候,在写复杂的语句时,首先需要逐步的拆解,跟着在组合起来,先查询出结果,在慢慢的优化语句


              如果是查询排除洪飞所在部门的所有明细,只需要更改为 NOT IN 或者<>不等于

                strSQL = "Select * From " & strSource & " Where 销售地区 Not In (Select 销售地区 From " & strSource & " Where 姓名='洪飞')"


                多行子查询

                还是以上图为例

                这次需要找出姓名为"洪明"以及"方大凡"所在销售地区的所有明细

                直接观察洪明在在的销售地区为深圳,而方大凡所在的销售地区为广州

                  strSQL = "Select 销售地区 From " & strSource & " Where 姓名 in('洪明','方大凡')"

                  查询明细结果

                    strSQL = "Select * From " & strSource & " Where 销售地区 in('深圳','广州')"

                    组合起来

                      strSQL = "Select * From " & strSource & " Where 销售地区 in(Select 销售地区 From " & strSource & " Where 姓名 in('洪明','方大凡'))"

                      如果这时候还是使用单值的方法添加运算符=等号

                        strSQL = "Select * From " & strSource & " Where 销售地区 =(Select 销售地区 From " & strSource & " Where 姓名 in('洪明','方大凡'))"

                        会返回以下错误


                        在子查询中,子查询的结果往往是一个集合,所以IN谓词是子查询最常见使用的

                        一些内层子查询会产生一个值,也有的会产生一列值,当子查询产生一列值的时候,也就是我们常常说的多行子查询,这个时候就非常适合使用IN的查询语句

                        .

                        多行子查询中有着自己的运算符,如常用的IN,NOT IN ,EXISTS,NOT EXISTS等,其中IN以及NOT IN是最为常见的运算符


                        ...

                        ...

                        今天字数貌似有点偏多,就写到这把

                        示例文件下载

                        链接:https://pan.baidu.com/s/11sp8zCX_DP8nXU1dM3rr5Q

                        提取码:abcd


                        收工!

                        如果小伙伴有好的思路,可以在小编的公众号留言发给小编研究下

                        文章觉得有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力

                        关注公众号 ↓


                        文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论