ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-10-28 10:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:SQL应用
顶一下,收藏,VBA结合SQL进行数值处理分析又是一个新层次,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-28 19:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 335081548 于 2013-10-28 20:56 编辑

多条件查询:
如何查询二个日期间的数据
Where .... AND...
查找大于等于2013年10月1日,小于等于2013年10月7日的数据,的SQL表达式为:
  1. SELECT * From [Sheet1$A:C] where 日期>=#10/1/2013# And 日期<=#10/7/2013#
复制代码

查询两个日期内的数据,并以单元为动态引用
  1. strSQL = "SELECT * From [Sheet1$A:C] where 日期>=#" & Range("J1") & "# And 日期<=#" & Range("K1") & "#"
复制代码
结果如图所示:
双条件查询.png




VBA_SQL双条件查询.rar

13.67 KB, 下载次数: 1032

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-29 21:58 | 显示全部楼层
如何用SQL语句完成多表列不相等的数据合并
多表连接列不等.png
完成下图的效果
多表连接列不等 结果图.png

实现的SQL语句如下:
  1. SELECT 产品名称,Null as 子产品名称,Null as 子产品名称2,数量 FROM [Sheet1$A1:B3]  Union All SELECT 产品名称,子产品名称,Null as 子产品名称2,数量 FROM [Sheet1$E1:G5] UnION All SELECT 产品名称,Null as 子产品名称, 子产品名称2,数量 FROM [Sheet1$I1:K18] ORDER BY 产品名称,子产品名称,子产品名称2
复制代码
SQL注意的列字段要一 一对应 才能用Union All进行连接合并,像本例中原数据不可能一 一对应,所以只有用一个小技巧 Null as 字段名,添加上空的列字段,使字段能一 一对应。Null可以理解为缺少或未知的数据。



三个表列数不相等的合并.rar

19.12 KB, 下载次数: 939

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-30 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 335081548 于 2013-10-31 19:59 编辑

Like 操作符用于在 WHERE 子句中搜索列中的模糊匹配
Select 列字段名 From [工作表名$] Where 列字段 Like '关键字'
可以加上通配符% (相当于函数公式中的通配符*)
本例采用的SQL语句:
  1. Select * from [Sheet1$] Where 姓名 like 'A%'
复制代码

正向匹配结果如图:
Like.png

如果数据表中有很多数据,也可反向匹配,也就是排除法
  1. Select * from [Sheet1$] Where Not 姓名 like 'A%'
复制代码

反向匹配.png
多条件匹配用中括号"[] ",只要数据符合中括号中的任意一个就OK
本例匹配以A开头或B开头的数据
  1. strSQL = "Select * from [Sheet1$] Where 姓名 like '[AB]%'"
复制代码

Like 通配符.png
本例是匹配不以xx开头的数据。
  1. strSQL = "Select * from [Sheet1$] Where 姓名 like '[!AB]%'"
复制代码
匹配姓名列 数据不以A开头或B形头的数据

Like 通配符2.png

通配符
描述
%
替代一个或多个字符
Like 通配符 全集.png

SQL Like.rar

13.94 KB, 下载次数: 983

TA的精华主题

TA的得分主题

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

简单的子查询
简单子查询.jpg
如图如果要查询语文成绩大于平均分的数据,必须要先求出平均分,
经过学习,我们知道用如下语句
  1. Select Avg(语文)  From [Sheet1$]
复制代码
就可以求出语文成绩的平均分。
那么大于平均分的成绩就可以用where语句来表达具体组成语法如下:
  1. Select 姓名,语文 From[Sheet1$] where 语文>(平均分)
复制代码
用VBA语句表达可以拆分开来理解
  1. 子查询语句 = "Select Avg(语文)  From [Sheet1$]" '语文的平均成绩
  2. strSQL = "Select 姓名,语文 From [Sheet1$] Where 语文 >(" & 子查询语句 & ")" '查询大于语文平均成绩同学
复制代码
也许这种写法更好理解
  1. 平均分= "Select Avg(语文)  From [Sheet1$]" '语文的平均成绩
  2. strSQL = "Select 姓名,语文 From [Sheet1$] Where 语文 >(" & 平均分 & ")" '查询大于语文平均成绩同学
复制代码
也可以写成一句
  1. Select 姓名,语文 From [Sheet1$] Where 语文 >(Select Avg(语文)  From [Sheet1$])
复制代码
大家都可以动手去操作,这样更容易理解些,印象更深刻。

简单子查询.rar

18.15 KB, 下载次数: 1094

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-3 20:12 | 显示全部楼层
本帖最后由 335081548 于 2013-11-3 20:18 编辑

IN运算符在SQL中的应用
In运算符允许 在 WHERE 子句中规定多个值
语法如下:
  1. Select 字段 From [表名$] Where 字段 In(条件1, 条件2,条件3, ....)
复制代码
注:
如果在In的条件中不是数值类型,一定要加上引号。
如本在本例中提取广东、广西 二省的数据
SQL语句如下:
  1. Select *  FROM [Sheet1$A:D] where 省份 in('广东','广西')
复制代码
结果如图所示:

SQL IN.png
假如不使用In语句,将语句将比较长:

  1. Select *  FROM [Sheet1$A:D] where 省份 ='广东'or 省份 ='广西'
复制代码
相当于小学中的数学中的简便计算方法
15*25+15*10
=15*(25+10)
比如不大恰当,只是为了方便记忆 。仅纯属娱乐。
从上面可以看出in()是Or的关系。
同样可以配合其他表式使用
例如提取 省份广东、广西 班级三(1)班、三(2)班 成绩大于60分的,
假如要使用VBA语句,将要使用很if进行判断
SQL语句如下:
  1. Select *  FROM [Sheet1$A:D] where 省份 In('广东','广西') And 班级 In('三(1)班','三(2)班') And 成绩>60
复制代码
没有使用IN语句的SQL语句如下:
  1. Select *  FROM [Sheet1$A:D] where (省份 ='广东'or 省份 ='广西') And (班级='三(1)班'or 班级='三(2)班') And 成绩>60
复制代码

SQL IN2.png
完整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 *  FROM [Sheet1$A:D] where 省份 in('广东','广西') "
  17.     'strSQL = "Select *  FROM [Sheet1$A:D] where 省份 ='广东'or 省份 ='广西'"
  18.     'strSQL = "Select *  FROM [Sheet1$A:D] where 省份 In('广东','广西') And 班级 In('三(1)班','三(2)班') And 成绩>60 "
  19.     strSQL = "Select *  FROM [Sheet1$A:D] where (省份 ='广东'or 省份 ='广西') And (班级='三(1)班'or 班级='三(2)班') And 成绩>60 "
  20.     Set Rst = Conn.Execute(strSQL)    '执行查询,并将结果输出到记录集对象
  21.     With Sheet1.Range("F:I")
  22.         .Cells.Clear
  23.         For i = 0 To Rst.Fields.Count - 1    '填写标题
  24.             .Cells(1, i + 1) = Rst.Fields(i).Name
  25.         Next i
  26.         .Range("A2").CopyFromRecordset Rst
  27.         .Cells.EntireColumn.AutoFit  '自动调整列宽
  28.     End With
  29.     Rst.Close    '关闭数据库连接
  30.     Conn.Close
  31.     Set Conn = Nothing
  32.     Set Rst = Nothing
  33. End Sub
复制代码

SQL IN语句.rar

14.12 KB, 下载次数: 972

TA的精华主题

TA的得分主题

发表于 2013-11-4 17:28 | 显示全部楼层
非常有价值的讲解,不顶不行了。老师再多讲一些吧,太解渴了{:soso_e179:}

TA的精华主题

TA的得分主题

发表于 2013-11-4 17:33 | 显示全部楼层
比较好的扫盲贴,不错了,顶一下

TA的精华主题

TA的得分主题

发表于 2013-11-4 18:00 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-5 11:11 | 显示全部楼层
对不规范的表格去重复值和有空白单元格的数据
SQL语句 如下:
  1. Select Distinct 姓名,数字,手机 From [sheet1$A:F] Where 姓名 Is Not Null
复制代码
效果见图:
SQL删除重复项和空值.png

SQL删除重复项和空值.rar

13.73 KB, 下载次数: 966

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-27 22:49 , Processed in 0.050547 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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