首页 > 化工知识 > SQL入门教程第04课:SQL查询中"表"技巧的总结

SQL入门教程第04课:SQL查询中"表"技巧的总结

时间:2021-12-21 来源: 浏览:

SQL入门教程第04课:SQL查询中"表"技巧的总结

原创 EH看见星光 Excel星球
Excel星球

收录于话题
每天一篇Excel技术图文
微信公众号:Excel星球
NO.568-表里表气

作者:看见星光
 微博:EXCELers / 知识星球:Excel

SELECT 字段名 FROM 表名

当场我就……小声说了,关键字F ROM指明了要获取字段信息的表名。倘若数据源是Excel表格,则需要在表名后增加美元符号$,并用中括号包起来,例如[Sheet1$]……

事实上,上述例子是SQL In Excel 对工作表引用最简单的一种情况,也就是 整表引用 ;此外还有单元格区域引用、跨工作簿引用等。

所以咱们今天就再来集中聊一下SQL语句中的Excel表。

  1.区域成表

Excel工作表和数据库的数据表有很多不同之处,最显著的地方在于,数据库的数据表可以理解为由行列构成,而Excel工作表则是由一个又一个单元格构成,且这些单元格拥有独特的地址表述方法,也就是A1或R1C1,它们还可以构成数据相连的单元格区域,例如A2:H8。

那么问题来了,如果我们只需要计算某张Excel工作表的部分区域的话,SQL该怎么表述呢?

这种问题是很常见的。

比如,很多人的Excel标题行并不是处于表格的第一行,而是第2行……

如下图所示▼

          
此时,我们希望计算A2:F列的单元格区域,这样我们更容易使用字段名处理数据,而不是整张Excel工作表……

再比如,一张表里存在两个或更多个“表”……这句话什么意思呢? 见下图▼

          
图中所示的表格中,既存在一份“教师表”,又存在一份“学生表”;如果我们只希望SQL引用计算A2:D8的教师表数据……

          
呃,年轻人火大容易肾虚呐……

……Excel中的SQL其实是支持将工作表的单元格区域作为“表”使用的。

上图所示的问题,SQL可以写成:

          
而第1种情况,我们知道数据开始于A2单元格,但不知道结束于F列的哪个单元格,SQL可以写成:

就酱紫。

本节小贴士:
 [学生表$A2:F],我们说该语句可以引用从A2至F列最后存在数据的单元格区域,但这是有一个限制前提条件的,即非自连接状态。所谓自连接是指SQL应用于链接自身的工作簿。自链接状态下,A2:F的表达方式最多是A2:F65536行;倘若此时需要的引用行超过65536行,请使用整表模式。

  2.跨工作簿的表

一个众所周知的问题是,Excel函数在处理跨工作薄数据时很是疲态,除了个别几个查找引用类函数(例如VLOOKUP等),绝大部分函数都需要打开相关工作簿后才可以计算使用。

是的,VLOOKUP函数并不需要打开相关工作簿也可以跨工作薄使用,而且在VLOOKUP公式书写完成后,即便你把它所引用的工作簿给删了,也不妨碍它计算,这是因为它已经把相关数据缓存到了公式所在的工作簿中,不过VLOOKUP这种模式并不支持函数复杂嵌套……打个响指,关于这一点,如果你感兴趣,我们改天单独聊一下。

          
……咳,说回SQL~~

……我们之前分享的SQL语句都是处理当前工作簿的表格,如果我们所需要处理的数据位于其它工作簿时,SQL该怎么表述呢?

例如,获取位于计算机D盘的“EH小学”文件夹下的“学生表.xlsx”工作簿中的“成绩表”的所有数据——一口气读完这话的,不得不让在下心生佩服。

如果是OLE DB法(该方法参考本系列教程第1章),SQL语句如下▼

如果是通过VBA+ADO使用SQL语句……

敲书柜前方预警:VBA基础差的童鞋请自行跳过以下内容……
相比于OLE DB法,VBA+ADO的方法要灵活的多,它可以使用ADO直接创建并打开与指定工作簿的链接,因此SQL语句就无需再指定工作簿完整名称等。

代码参考如下▼

Sub ADO_SQL() ’适用于除2003版以外的高版本Excel Dim cnn As Object, rst As Object Dim strPath As String, strCnn As String, strSQL As String Dim i As Long Set cnn = CreateObject( "adodb.connection" ) strPath = "D:EH小学学生表.xlsx" ’指定工作簿 strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & strPath cnn.Open strCnn ’ 创建并打开到指定工作簿的链接 strSQL = "SELECT * FROM [成绩表$]" ’strSQL语句,查询成绩表的所有数据 Set rst = cnn.Execute(strSQL) ’ 执行strSQL Cells.ClearContents For i = 0 To rst.Fields.Count - 1 Cells( 1 , i + 1 ) = rst.Fields(i).Name Next Range ( "a2" ).CopyFromRecordset rst cnn.Close Set cnn = Nothing End Su

以上代码第7行直接指定了需要连接的工作簿完整名称,SQL语句内也就不再需要特别处理。 但更多的情况是,ADO创建的链接是一个工作簿,需要获取的数据在另一个或多个工作簿,例如两个工作簿之间的数据查询统计。此时通常使用的代码如下▼

代码中第7行创建了当前工作簿的链接,SQL语句中又指定了另外一个工作簿的链接。SQL语句如下▼

需要系统学习Excel,却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?加入我的付费社群,和微软最有价值专家(MVP)全面精进Excel,学习+答疑都不再是问题……

加入我的Excel会员, 全面学习Excel
透视表 函数 图表 VBA PQ想学啥学啥

本文由公众号“Excel星球”首发。

点击 阅读原文 ,加入Excel会员社群!

版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。
相关推荐