ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-10-31 21:25 | 显示全部楼层
本帖已被收录到知识树中,索引项:SQL应用
本帖最后由 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-5 11:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
对不规范的表格去重复值和有空白单元格的数据
SQL语句 如下:
  1. Select Distinct 姓名,数字,手机 From [sheet1$A:F] Where 姓名 Is Not Null
复制代码
效果见图:
SQL删除重复项和空值.png

SQL删除重复项和空值.rar

13.73 KB, 下载次数: 966

TA的精华主题

TA的得分主题

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

使用SQL查询二个日期范围之内的数据
方法一:
  1. select * from [Sheet1$A:D] where 出生年月 between #" & Sheet1.Range("G3") & "# and #" & Sheet1.Range("H3") & "#"
复制代码
方法二:
  1. select * From [sheet1$A:D] where 出生年月 Between (select * From [sheet1$G2:G3]) and (select * From [sheet1$H2:H3])
复制代码
方法三:
  1. select * From [sheet1$A:D] where 出生年月>=(select * From [sheet1$G2:G3]) and 出生年月<=(select * From [sheet1$H2:H3])
复制代码
以上语句第一种法只适合在VBA中使用。
第二种和第三种方法可以在Microsoft Query中和OLE DB使用手动刷新能根据条件改变数据改变。
第二种及第三种是使用子查询语句。
子查询语句一
  1. select * From [sheet1$G2:G3])
复制代码
出来的结果是:1981/1/1
子查询语句二
  1. select * From [sheet1$H2:H3
复制代码
出来的结果是:1985/1/1
用子查询来引用单格来作为条件查询是一种不错的用法。
BETWEEN在SQL中的作用
BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。
BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
BETWEEN在Excel中的SQL语法如下:
  1. Select 字段 from [表名$] where 字段 BETWEEN 条件A AND 条件B
复制代码
SQL子查询法二日期间数据.png

SQL查询二个日期范围之内的数据.rar

23.08 KB, 下载次数: 994

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-5 12:06 | 显示全部楼层
本帖最后由 335081548 于 2013-11-5 15:23 编辑

WHERE、GROUP BY 和 HAVING 子句的正确顺序对编写高效的查询代码会有所帮助:
       WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
  &#61623; GROUP BY 子句用来分组 WHERE 子句的输出。
  &#61623; HAVING 子句用来从分组的结果中筛选行。
HAVING子句必须跟在GROUP BY(分组)子句之后,但ORDER BY(排序)子句之前。
HAVING子句与Where子句有如下相似之处:
1.两者都是从结果表中筛选数据
2.两者都使用条件筛选。
3.两者,数据中的Null不满足任何条件。Is Null例外。
HAVING子句与Where子句有如下不同之处:
1.Where子句只能在进行任何处理之前从原始数据表中删除、筛选。
2.HAVING子句可以在进行绝大部分处理后删除、筛选已分组和已汇总的数据。
3.Where子句不能在它设置的条件中使用聚合函数。
4.HAVING子句可以在经的条件中使用聚合函数。

SQL语句在包含HAVING的语法如下:
  1. Select 列字段1,列字段2,列字段3,..... From[工作表名$] Where 条件 GROUP BY 列字段1,列字段2 HAVING 条件 ORDER BY  列字段1,列字段2
复制代码
实例进行演示:
  1. SELECT 姓名, SUM(产品数) as 产品总数 From [Sheet1$] GROUP BY 姓名 HAVING SUM(产品数)>100
复制代码
统计产品数小于100的不显示(提取大于100的数据)。按姓名分类汇总产器数 数据大于100的。
简单理解:
HAVING的作用是GROUP BY。(设置分组的条件)。针对于分组。
WHERE的作用是SELECT的列字段的条件。(字段条件)。针对于原数据行。
HAVING.png

VBA_SQL HAVING .rar

13.01 KB, 下载次数: 959

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-10 19:59 | 显示全部楼层
SQL 统计出现重复的名称:
提取重复出现的名称.png
SQL语句如下:
  1. Select 名称,Count(1) As 重复次数 From [Sheet1$A:A] Group By 名称 Having Count(1)>1
复制代码
只显示名称如下:
  1. Select 名称 From [Sheet1$A:A] Group By 名称 Having Count(1)>1
复制代码


用SQL提取重复的名称.rar

15.21 KB, 下载次数: 1099

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-3 09:12 | 显示全部楼层
以上内容打包在里,下二个压缩包再解压文件。希望对想入门的朋友有帮助。

从零开始学习SQL(图文教程).part2.rar

1.07 MB, 下载次数: 3267

从零开始学习SQL(图文教程).part1.rar

1.9 MB, 下载次数: 11333

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-3 09:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
TRANSFORM
TRANSFORM可以实现像透视表一样的显示结果
语法结构
  1. TRANSFORM 汇总方式  SELECT 行标签 from 表名 group by 行字段 PIVOT 列标签
复制代码

TransForm.png
本例中的SQL语句如下:
  1. TRANSFORM Sum(数量) Select 产品名称 from [Sheet1$] group by 产品名称 PIVOT 款号
复制代码




TRANSFORM.rar

11.6 KB, 下载次数: 1025

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-3 10:52 | 显示全部楼层
TRANSFORM+行总计 TRANSFORM 行总计.png
代码:
  1. Transform Sum(数量) Select 款号 From (Select * From [Sheet1$A:C] Union All Select "产品小计",款号,Sum(数量) From [Sheet1$A:C] Group By 款号) Group By 款号 Pivot 产品名称
复制代码
分析:
Select "产品小计",款号,Sum(数量) From [Sheet1$A:C] Group By 款号
可以求出各款型号的小计,而且是三个字段,可以跟原表匹配。
结果如图:
TRANSFORM+行总计 2.png

然后组成新表
1.原表数据获取
Select * From [Sheet1$A:C]
2.小计的表
Select "产品小计",款号,Sum(数量) From [Sheet1$A:C] Group By 款号
3.组成新表,用Union All
Select * From [Sheet1$A:C] Union All Select "产品小计",款号,Sum(数量) From [Sheet1$A:C] Group By 款号
结果如图:
TRANSFORM+行总计 3.png
生成这样的数据,就可以进行分类汇总了。



TRANSFORM 行总计.rar

11.83 KB, 下载次数: 945

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-7 08:42 | 显示全部楼层
zhangjie2832 发表于 2013-12-6 10:43
数据源中没有包含可见的表格。。。

请看介绍 Microsoft Query的方法 第四步
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-25 03:09 , Processed in 0.050818 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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