ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 141794|回复: 370

[分享] 在EXCEL中使用SQL语句查询集锦-持续更新中,敬请关注

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-4-24 00:02 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:ADO技术
本帖最后由 opiona 于 2012-6-22 23:40 编辑

SQL语句在数据库使用中十分重要。
在EXCEL中可以不打开工作簿,就获取数据,对多工作簿操作很用,也很快。
对大量数据处理,比循环快很多,但是比词典方法还有点距离(可惜我还没有学会词典)。
对数据库编程,任何编程语言都要,都支持SQL语言。

借助VBA, 我们也可在EXCEL中使用它,也就是将EXCEL作为数据库
(EXCEL中对SQL功能稍有限制,如:删除数据等,但不影响我对它的推崇)
在斑竹的帮助下,对SQL在EXCEL有了一点点体会,拿出来和大家分享。
斑竹的SQL帮助文件:http://club.excelhome.net/thread-65664-1-1.html
标准的EXCEL中SQL使用见附件的各个模块,ALT+F11就能看到了{:soso_e120:}
2012-04-24  最新更新  :标准语句、实例语句和解释互动, 结果直接显示,可自己修改语句。
EXCEL2003版本: EXCEL中的SQL学习总结-for 2003-20120424.rar (30.28 KB, 下载次数: 5550)

评分

参与人数 29财富 +70 鲜花 +52 技术 +2 收起 理由
damnedvi + 2 值得肯定
logochen + 1 优秀作品
chyj0588 + 2 太强大了
kane027 + 3 优秀作品
km122712 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-24 00:03 | 显示全部楼层
本帖最后由 opiona 于 2013-2-4 18:08 编辑

下面是收集的一些链接:
SQL语句中常用的一些函数,见5楼:

SQL将几个条件组合一句中,居然用到3个别名:
http://club.excelhome.net/forum.php?mod=viewthread&tid=859194&page=5#pid6056804

Imex参数,SQL查询数字和文本混排的数据:
http://club.excelhome.net/forum.php?mod=viewthread&tid=859194&page=5#pid6191850

获取全部字段名:
http://club.excelhome.net/forum.php?mod=viewthread&tid=859194&page=6#pid6243359

EXCEL中调用SQL语句的自定义函数,见71楼:
http://club.excelhome.net/thread-859194-8-1.html





补充内容 (2013-6-12 13:50):
将SQL的查询结果按照指定顺序排序的方法:
http://club.excelhome.net/forum. ... ;page=13#pid6997426

补充内容 (2014-1-17 13:50):
EXCEL中调用SQL语句的自定义函数  不在71楼,而是70楼
http://club.excelhome.net/thread-859194-7-1.html

评分

参与人数 1鲜花 +2 收起 理由
elepeipei + 2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-24 00:04 | 显示全部楼层
本帖最后由 opiona 于 2013-2-4 17:51 编辑

----------------------------------------------------------------------------------------------------------------------
1:  如果sheet1 和 Sheet2 分别在2个工作簿,SQL应该怎么写?
答案是:


  1. Cn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1';data source=" & ThisWorkbook.FullName
  2. Dataname = ThisWorkbook.Path & "\数据表.xls"
  3. 'Strsql = "SELECT a.姓名, b.工资 from [Excel 8.0;Database=" & Dataname & "].[Sheet1$a:b]  as b, [Sheet1$a:b] as a where a.姓名=b.姓名 order by a.姓名"
  4. Strsql = "SELECT  姓名, 工资 from [Excel 8.0;Database=" & Dataname & "].[Sheet1$a:b] where  姓名 in (select 姓名 from [Sheet1$a:b] )"
  5. '答案找到了:[Excel 8.0;Database=" & Dataname & "].[Sheet1$a:b]
复制代码

2:有没有办法SQL直接给出 按照sheet1中A列顺序 排序的结果
答案是:

  1.     cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.Path & "\数据表.xlsx"
  2.     SQL = "select b.工资, b.补贴 from [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[Sheet1$] a left join [Sheet1$] b on a.姓名=b.姓名"
  3. '   ThisWorkbook.Path & "\数据表.xls--------b表是数据表,
  4. '   ThisWorkbook.FullName--------a表是条件表,
  5. '   按照a表顺序,在b表查找,结果按照a表顺序粘贴(原顺序不表,结果对应粘贴)
  6. '   注意:b表的数据不能重复的。
复制代码

请关注版主的回复:http://club.excelhome.net/thread-789520-1-1.html
======================================================================================

在表A 中找表B 中没有的数据
去掉:WHERE NOT EXISTS   中的NOT,也许就是2个表都有的数据
判断字段可以不仅仅是一个,可以是多个:WHERE A." & ZD字段名称A & "=B." & ZD字段名称B & " and  A." & ZD字段名称2A & "=B." & ZD字段名称2B & " )"
[code=vb]
Sub 大小表() '大表 as A 中找小表 as B 中没有的数据
'On Error Resume Next
Application.ScreenUpdating = False '关闭屏幕刷新
Application.DisplayAlerts = False '关闭提示
'----------设置参数-,假设2个表在一个工作簿中,在2个工作簿,请参照楼上------------------------------------------------------------------------------
Set sh = Sheets("多的数据")  'A表
Set sh1 = Sheets("少的数据")  'B表
ZD字段名称A="姓名"   'A表中判断不同的字段名称,多数情况2个表字段是一样的。
ZD字段名称B="人名"   'B表中判断不同的字段名称
Set sh3 = Sheets("结果")
sh3.Cells.ClearContents
'----------数据库连接-------------------------------------------------------------------------------
Dim StrSQL$, Cn As Object
Set y = CreateObject("adodb.recordset")
Set Cn = CreateObject("Adodb.Connection")
Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;imex=1';Data Source=" & ThisWorkbook.FullName
  StrSQL = ""  
  StrSQL = StrSQL + " SELECT * FROM [" & sh.Name & "$] as A "
  StrSQL = StrSQL + " WHERE NOT EXISTS ("
  StrSQL = StrSQL + " SELECT * FROM [" & sh1.Name & "$] as B "
  StrSQL = StrSQL + " WHERE A." & ZD字段名称A & "=B." & ZD字段名称B & ")"
  Set y = Cn.Execute(StrSQL)
  sh3.Range("a2").CopyFromRecordset y
'----------获取表头-------------------------------------------------------------------------------
    For L = 0 To y.Fields.Count - 1
        sh3.Cells(1, L + 1) = y.Fields(L).Name
    Next L
'----------后续处理-------------------------------------------------------------------------------
Cn.Close
sh3.Select
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
[/code]

比较长的SQL语句,建议分段书写,这样读写和理解都方便。
  StrSQL = ""  
  StrSQL = StrSQL + " SELECT * FROM [" & sh.Name & "$] as A "
  StrSQL = StrSQL + " WHERE NOT EXISTS ("
  StrSQL = StrSQL + " SELECT * FROM [" & sh1.Name & "$] as B "
  StrSQL = StrSQL + " WHERE A." & ZD字段名称A & "=B." & ZD字段名称B & ")"


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-24 00:05 | 显示全部楼层
本帖最后由 opiona 于 2012-5-27 11:07 编辑

没有列标题,或列标题重复、合并等情况,要用到HDR=NO
用变量组织一个很长的SQL查询语句例子见下帖 9楼 代码:
http://club.excelhome.net/forum.php?mod=viewthread&tid=872937&page=1#pid5972465

SQL语句中注意:的文本变量(和文本常量)要用单引号,数字类型的不能加单引号:
Str = Str & " '" & Str经销商 & "'" & " as 经销商,"
where 名称<>'合计' and abs(数量)>0"

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-24 00:06 | 显示全部楼层
本帖最后由 opiona 于 2013-2-4 18:11 编辑

详见附件: SQL中常用的函数.rar (14.76 KB, 下载次数: 1459)

TA的精华主题

TA的得分主题

发表于 2012-4-24 00:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-4-24 16:11 | 显示全部楼层
本帖最后由 lhsh36183 于 2012-4-24 16:12 编辑

占位,学习.请楼主做个2003版本。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-24 16:33 | 显示全部楼层
本帖最后由 opiona 于 2012-4-24 16:39 编辑
lhsh36183 发表于 2012-4-24 16:11
占位,学习.请楼主做个2003版本。


'Excel2003版本:cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" &
       'Excel2007版本:cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" &

就是讲代码中的上两句互换一下即可!

见1楼

TA的精华主题

TA的得分主题

发表于 2012-4-25 20:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-4-26 08:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,每天学会一个新技能

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

GMT+8, 2019-10-19 03:07 , Processed in 0.075620 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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