ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 335081548

[原创] 从零开始学习SQL(图文教程)

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-25 22:43 | 显示全部楼层
本帖已被收录到知识树中,索引项:SQL应用
UNION ALL
SQL语句的限制
1.SQL查询连接的表上限50个(最多50个表)
2.查询语句字符限制38596个字符(不超过38596个)
超过了会出现如下二个错误提示类型之一:
1.“查询过于复杂"
2."获取表格数据时发生错误"。
二表连接
本例SQL语句如下:
  1. SELECT 日期,姓名,产品数 From [Sheet1$] UNION ALL SELECT 日期,姓名,产品数 From [Sheet2$]
复制代码
结果如图:
VBA SQL二表连接.png

UNION ALL是查询所有记录(直接连接,可以重复),UNION只查询不重复(指整条记录不重复,取唯一)的记录,下面两段代码,如果有重复记录,则查询结果就不一样。
在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
UNION在运行时先取出几个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。
热爱学习的同学可试试用这个语句:

  1. SELECT 日期,姓名,产品数 From [Sheet1$] UNION SELECT 日期,姓名,产品数 From [Sheet2$]
复制代码
用本附件测试效果是否一样?
再把表1的数据复制一部分到表2然后再执行这二个语句的区别,就能加深印象理解。




VBA_SQL二表连接.rar

14 KB, 下载次数: 1329

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-25 22:47 | 显示全部楼层
本帖最后由 335081548 于 2013-10-26 00:08 编辑

SQL代替Vlookup 精确查找(左连接 "Left Outer JOIN" 用法)
语法如下:
  1. Select 表名 .字段1,表名 .字段2,表名 .字段3,表名 .字段4 FROM 查询表 AS 别名1  Left Outer JOIN 被查询表 AS 别名2 ON  别名1.字段名=别名2.字段名
复制代码
查找表2在表1中的数据
本例中SQL中的语句如下:
  1. SELECT A.姓名,B.性别,B.部门 FROM [Sheet2$] AS A Left Outer JOIN [Sheet1$] AS B ON A.姓名=B.姓名
复制代码
也可以简写一下:
  1. SELECT A.姓名,性别,部门 FROM [Sheet2$]A Left JOIN [Sheet1$]B ON A.姓名=B.姓名
复制代码
结果如图所示:
SQL代替Vlookup.jpg
VBA完整代码如下:
  1. Sub Test4()
  2.     Dim Conn As Object, Rst As Object
  3.     Dim strConn As String, strSQL As String
  4.     Dim i As Integer, PathStr As String
  5.     Set Conn = CreateObject("ADODB.Connection")
  6.     Set Rst = CreateObject("ADODB.Recordset")
  7.     PathStr = ThisWorkbook.FullName   '设置工作簿的完整路径和名称
  8.     Select Case Application.Version * 1    '设置连接字符串,根据版本创建连接
  9.     Case Is <= 11
  10.         strConn = "Provider=Microsoft.Jet.Oledb.4.0;Extended Properties=excel 8.0;Data source=" & PathStr
  11.     Case Is >= 12
  12.         strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & PathStr & ";Extended Properties=""Excel 12.0;HDR=YES"";"""
  13.     End Select
  14.     Conn.Open strConn    '打开数据库链接
  15.     '设置SQL查询语句
  16.     strSQL = "SELECT A.姓名,性别,部门 FROM [Sheet2$]A Left JOIN [Sheet1$]B ON A.姓名=B.姓名"
  17.     Set Rst = Conn.Execute(strSQL)    '执行查询,并将结果输出到记录集对象
  18.     With Sheet3
  19.         .Cells.Clear
  20.         For i = 0 To Rst.Fields.Count - 1    '填写标题
  21.             .Cells(1, i + 1) = Rst.Fields(i).Name
  22.         Next i
  23.         .Range("A2").CopyFromRecordset Rst
  24.         .Cells.EntireColumn.AutoFit  '自动调整列宽
  25.         .Cells.EntireColumn.AutoFit  '自动调整列宽
  26.     End With
  27.     Rst.Close    '关闭数据库连接
  28.     Conn.Close
  29.     Set Conn = Nothing
  30.     Set Rst = Nothing
  31. End Sub
复制代码
注:
Left Outer JOIN 在SQL  FROM语句中OUTER是可选的。通常习惯性写为: LEFT JOIN。

VBA SQL左连接代替Vlookup.rar

13.78 KB, 下载次数: 1408

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-10-26 15:22 | 显示全部楼层
335081548 发表于 2013-10-25 22:47
SQL代替Vlookup 精确查找(左连接 "Left Outer JOIN" 用法)
语法如下:
查找表2在表1中的数据

这么好的东西不顶简直就是犯罪,
另外,楼主能否讲讲union不同路径下的工作簿情况么。

TA的精华主题

TA的得分主题

发表于 2013-10-26 15:56 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-27 21:32 | 显示全部楼层
本帖最后由 335081548 于 2013-10-27 21:34 编辑

SQL代替Vlookup 精确查找(左连接 "Right Outer JOIN" 用法)
语法如下:
  1. Select 表名 .字段1,表名 .字段2,表名 .字段3,表名 .字段4 FROM 被查询表 AS 别名1  Right Outer JOIN 查询表 AS 别名2 ON  别名1.字段名=别名2.字段名
复制代码


查找表2在表1中的数据
本例中SQL中的语句如下:
  1. SELECT A.姓名,B.性别,B.部门 FROM [Sheet1$] AS A Right Outer JOIN [Sheet2$] AS B ON A.姓名=B.姓名
复制代码


也可以简写一下:
  1. SELECT A.姓名,性别,部门 FROM [Sheet1$]A Right JOIN [Sheet2$]B ON A.姓名=B.姓名
复制代码



结果如图所示:

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-27 21:47 | 显示全部楼层
菜鸟壹号 发表于 2013-10-26 15:22
这么好的东西不顶简直就是犯罪,
另外,楼主能否讲讲union不同路径下的工作簿情况么。
  1. Select * From [盘符:\路径\工作簿名1.后辍名].[工作表名$] Union All Select * From [盘符:\路径\工作簿名2.后辍名].[工作表名$] Union All Select * From [盘符:\路径\工作簿名3.后辍名].[工作表名$]
复制代码

TA的精华主题

TA的得分主题

发表于 2013-10-27 21:49 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-27 22:37 | 显示全部楼层
本帖最后由 335081548 于 2013-10-27 22:49 编辑

三表连接Ineer Join的应用
三个工作表都有一个相同的字段,根据SQL语言的特点,通过相同的列字段,可以把各个表连接起来。对于Ineer Join,只要二个表的公共字段有匹配值,就能将这二个表组合起来。
  1. Select 字段1, 字段2, 字段3,字段4, 字段5 From ([表名1$] A Inner Join [表名2$] B ON A.相同的列字段=B.相同的列字段) Inner Join [表名3$] C ON B.相同的列字段=C.相同的列字段
复制代码

本例SQL语句如下:
  1. Select 姓名,部门,性别,年龄,学历,负责人 From ([部门$] A Inner Join [人员资料$] B ON A.编号=B.编号) Inner Join [部门负责人$] C ON B.编号=C.编号
复制代码
结果如图所示:
三表连接.png

也可以用Where表达式来实现:
  1. Select 姓名,部门,性别,年龄,学历,负责人 From [部门$] A,[人员资料$] B,[部门负责人$] C Where A.编号=B.编号 And B.编号=C.编号
复制代码

三表连接.rar

14.94 KB, 下载次数: 1235

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-10-27 23:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
多谢楼主分享代码!

TA的精华主题

TA的得分主题

发表于 2013-10-28 10:15 | 显示全部楼层
335081548 发表于 2013-10-27 22:37
三表连接Ineer Join的应用
三个工作表都有一个相同的字段,根据SQL语言的特点,通过相同的列字段,可以把各 ...

谢谢分享!好好学习!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 04:32 , Processed in 0.051289 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表