SQL在Excel中的应用方法.doc_第1页
SQL在Excel中的应用方法.doc_第2页
SQL在Excel中的应用方法.doc_第3页
SQL在Excel中的应用方法.doc_第4页
SQL在Excel中的应用方法.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SQL在Excel中的应用方法iamlaosng文Excel中使用SQL的主要目的是连接数据库(或Excel工作表)导入数据或者对这些数据进行统计汇总,要达到这个目的,需要好好学习SQL语句的使用。本文主要说明在Excel中如何使用SQL,至于SQL语句本身就不多作介绍了。一、简单的查询1、建立查询数据选项卡现有连接浏览更多 或者 按快捷键Alt+D+D+D选择要查询的Excel文件和文件中的的工作表,就可以将相应工作表的数据取过来。表现形式可以是表,也可以是数据透视表等。2、SQL查询语句如果是挑选部分列数据,就需要用SQL语句(取所有数据也可以用SQL语句)。 建立查询时,选择工作表后不要点击“确定”按钮,而是先点击“属性”按钮,弹出窗口中选择“定义”选项卡,在命令文本框中输入SQL查询语句(原来的工作表名称,表示所有数据,可以认为是取所有数据的SQL的一种特殊写法):Select 字段列表 from 工作表名$-其中字段列表就是需要选择的字段,数据源用工作表名称加“$“再用中括号括起来,例如:select prov_name, city_name, xs_mc, xs_code from Sheet1$select * from Sheet1$- 取所有数据 偶然发现,字段名不能用no,估计是保留字,如需要,用中括号括起来,例如:select no,prov_name,city_name, xs_mc, xs_code from Sheet1$字段名中含有特殊字符的也要用中括号括起来,如/ ?空格 等Excel查询没有伪表概念,对于表达式的计算直接用select既可,例如Select 23+45 - 返回68Select date() - 返回当前日期3、修改查询语句 方法:点击右键弹出菜单表格编辑查询通过修改SQL语句可以变更所取的数据,也可以将建立查询时的简单SQL语句改成复杂的SQL语句。 字段名更换:如果想换个字段名,用“as 新字段名”既可,例如:select prov_name as 省, city_name as 城市, xs_mc as 县市, xs_code as 编码 from Sheet1$ 非正常表格:数据区域(含字段名)不在第一行需要在工作表名称后面指定数据范围,例如:select prov_name, city_name, xs_mc, xs_code from Sheet1$B2:G2000或者,将数据块定义为一个名称,假设定义为mydata,SQL语句如下:select prov_name, city_name, xs_mc, xs_code from mydata注意:使用名称时没有$符号,也没有方括号了。 数据更新:数据源发生变化,需要更新数据,方法:点击右键弹出菜单刷新 意外:如果打开Excel文件后弹出不是选择工作表的窗口而是一个“数据连接属性”窗口,可以关闭这个窗口,然后将Excel应用极小化再极大化方式消除,或者在弹出选择文件的窗口时,退回上一级文件夹,删除那个Queries文件夹,就行了。4、外部数据属性修改SQL语句后,如显示格式不是预想的那样,需要去掉“外部数据属性”中“保留列属性”前面的勾选。方法:点击右键弹出菜单表格外部数据属性,弹出窗口如下:二、复杂的查询1、多表联合 相同结构的多个表合并到一起,用union连接SQL语句,例如:Select * from 财务部$ union all Select * from 市场部$Union是去重复的,即相同的记录保留一个(类似distinct),Union all则是直接相加两个结果,不去重复。 增加一个部门字段可以将查询结果中的区分开来,以便知道数据来自哪个表。Union的三个一致,即:字段的数量、类型和顺序。例如:Select “财务部” as 部门,* from 财务部$ union all Select “市场部” as 部门,* from 市场部$ 多表联合查询Select * from 部门$ bm,员工$ yg where bm.部门编码=yg.部门编码 跨工作簿查询如果数据不仅来自不同的工作表,还来自不同的文件,一样可以用union联合,例如:Select “分公司1” as 公司, “财务部” as 部门, * from F:SQL之Excel应用分公司1.xlsx.财务部$ union allSelect “分公司1” as 公司, “市场部” as 部门, * from F:SQL之Excel应用分公司1.xlsx.市场部$ union allSelect “分公司2” as 公司, “财务部” as 部门, * from F:SQL之Excel应用分公司2.xlsx.财务部$ union allSelect “分公司2” as 公司, “市场部” as 部门, * from F:SQL之Excel应用分公司2.xlsx.市场部$因为SQL中已经指定了文件名和表名,所以建立连接时连接谁并不重要,这种情况下,建立连接的时候就连接自己,然后再改写SQL语句。2、子查询和多表连接所谓子查询就是将一个查询结果作为数据源放在主查询语句中,多表连接则是将两个有关联的表通过关键字段连接在一起查询,这都是SQL知识,不再赘述,需要注意的是,不同的数据库系统SQL都有些微小的差别,Excel中的SQL也有其自己的一些特点,关于多表查询的写法,见本文附录。3、常用运算符 有条件的查询条件是where引导的,用and、or等连接,例如:select prov_name, city_name, xs_mc, xs_codefrom Sheet1$ where prov_name=安徽 or prov_name=江苏-虽然字符串可以用双引号,但建议用单引号,因为oracle 、SQL server都是用单引号。 常用运算符:in、not in、between and 、is null、is not null、&(连字符)、like、not like,注意:null和任何字段运算的结果都是null。 通配符:%(所有字符或无字符)、_(单个字符)、(区间,如1-9、!a-f、1,3,5),例如:select * fromSheet1$ where Email like h-m% -h-m开头的电子邮件select * fromSheet1$ where xs_code like %!1,3,5 和not like %1,3,5效果相同select * fromSheet1$ where 户籍&-&工作地 like %合肥% -中间加个“-”防止误差 筛选查询结果:Distinct 去重复、top n 取前n条记录 聚合函数:count、sum、min、max、avg 排序:order by、分组:group by、分组后筛选:having SQL中关键字的执行顺序:from=1 where=2 group by=3 having=4 order by=5select=6,因为select在最后,所以其它关键字后面不能用字段别名,不过,表的别名是可以用的,因为from排在第一。4、常用函数除了聚合函数,还有很多其他函数,这些函数有的是所有数据库系统都有的,有的是数据库系统特有的。Excel中工作表中使用的函数基本都能在SQL中使用,例如: 数学:abs、int、fix、round、mod、rnd、 文本:left、right、mid、len、instr、string、replace、format、 条件:iif、switch、choose、 日期:date/now、year/month/day、weekday、dateserial、有些函数用法和工作表中略有不同,如date可以取当前日期,但是不能合成日期,合成日期用dateserial(这个函数只能在SQL中使用)5、交叉查询交叉查询产生一个透视表,相当于一个矩形二维表,这是Excel特有的查询,格式如下:Transform 聚合函数 select 行标签 from 数据表$ groupby 行标签 pivot 列标签,例如:Transform sum(工资) select 部门名称 from 员工$ group by 部门名称 pivot 职务这个语句产生的结果与数据透视表差不多,相当于一个语句产生一个数据透视表,当然这个透视表是固定的,和语句对应的。其中的select语句,相当于数据透视表的行字段,其中的聚合函数的参数相当于拖到数据透视表数据区域的值字段,使用的聚合函数即值字段的汇总方式。其中的 pivot字段相当于数据透视表的列字段,后面的IN (value1, value2, .),相当列字段中的项的排序和筛选,摆弄过数据透视表,将transform/pivot语句与数据透视表对照,可以轻松掌握这个MS JET新增SQL语句。看一下效果:列标签筛选Transform sum(工资) select 部门名称 from 员工$ group by 部门名称 pivot 职务 in (主管, 经理)多个行标签Transform sum(工资) select职务,性别from 员工$ group by职务,性别pivot 部门名称如需要添加总计,则需要先构造一个子查询结果,这个结果由正常的查询和统计查询联合在一起,再以这个结果作为数据源,构成上面的二维表。例如:Transform sum(工资) select 部门名称 from (Select 部门名称,职务,工资 from 员工$ union allSelect 部门名称,总计,sum(工资) from 员工$ group by部门名称) group by 部门名称 pivot 职务 in (主管, 经理,职员,总计 )6、文本型数字SQL查询时字段类型是由前8行数据决定的(这个数字是Excel定的),如果前8行都是数值型,后面有文本型数字,则查询结果中这些数字变成为空;前8行是文本型,后面是数值型则不影响,似乎查询结果偏向文本。如果前8行中类型不一致,有数值型,也有文本型数字,可以通过在连接字符串中加入IMEX=1则后面有文本型字符也没关系,但是,如果前8行都是数值型,加了这个也不管用,因为前8行已经决定是数值型了。加IMEX位置如下:Provider=Microsoft.ACE.OLEDB.12.0;UserID=Admin;Data Source=C:Documents and SettingsAdministrator桌面tb_city_zd.xls;Mode=ShareDeny Write;Extended Properties=HDR=YES;IMEX=1;Jet OLEDB:System database=;JetOLEDB:Registry Path=;Jet OLEDB:Engine Type=35;Jet OLEDB:DatabaseLocking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global BulkTransactions=1;Jet OLEDB:New Database Password=;Jet OLEDB:CreateSystem Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Dont CopyLocale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;JetOLEDB:SFP=False;Jet OLEDB:Support Complex Data=False7、删除无用的数据源随着我们建立的查询越来越多,打开现有连接时会出现很多我们原来建立的连接,这些连接是Windows自动保存以便于我们再次使用的,如要删除,可进入“我的文档”下面的“我的数据源”文件夹,删除这些无用的数据源或者直接删除“我的数据源”文件夹。删除这些连接不会影响原来建立的那些查询。8、Microsoft Query工具可以利用MQ工具建立查询,对于不熟悉SQL语言的可以用这个调试SQL语句。MQ向导会提供可视化工具,一步一步引导我们得到所需的数据。查询生成后,可以点击“SQL”按钮进一步修改SQL语句。 打开方法:数据选项卡自其它来源来自MicrosoftQuery工具Excel files,选择文件后确定,进入工具。如果不能选择xlsx文件,是因为数据源版本驱动太低,进入控制面板-管理工具数据源(ODBC),点击配置,数据库版本选择Excel 12.0版本(office2007以上);如果找不到12.012.0以上版本,就删除原来的数据源Excel files,重新添加一个,注意要选择带有xlsx的驱动程序。office版本和版本号:office97 : 8.0、office2000 : 9.0、officeXP(2002) : 10.0、office2003 : 11.0、office2007: 12.0、office2010 : 14.0、office2013: 15.0选择文件并确定后,如果提示“数据源中没有包含可见的表格”,点击确定,在随后弹出的向导窗口中点击“选项”按钮,勾选“系统表”,确定后就可以看到表了,如下图: MQ工具通过可视化工具生成所需的SQL查询语句,如添加条件、分组等等。点击“SQL”按钮查看生成的语句,可以看到文件名和表名都是用单引号括起来,和中括号效果一样。 MQ工具不仅可以编写SQL查询语句,也可以写insert、delete、update等SQL语句,例如:Insert into 员工$ (姓名,性别,工资) values (宋定才,男,5000)三、VBA中使用SQL语句1、连接数据库的工具ADO ADO是个类,有三个工具:connection(连接)、command(命令)和recordset(记录集) 使用前先引用,进入VBE,点击菜单“工具”下面的“引用”,勾选最高版本的ADO,然后就可以用new在VBA过程中创建对象了。引用窗口如下图:2、连接Access数据库 连接字符串:连接数据库的关键是连接串的写法,可以参考建立查询时系统自动生成的连接串,方法是:数据选项卡自Access,在弹出窗口选择数据文件和表后,点击属性,弹出窗口中点击定义选项卡,其中的连接字符串就是连接access的字符串,内容如下:Provider=Microsoft.ACE.OLEDB.12.0;Password=;UserID=Admin;Data Source=D:Lclink.mdb;Mode=Share Deny Write;ExtendedProperties=;Jet OLEDB:System database=;JetOLEDB:Registry Path=;Jet OLEDB:Database Password=;JetOLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global PartialBulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New DatabasePassword=;Jet OLEDB:Create System Database=False;Jet OLEDB:EncryptDatabase=False;Jet OLEDB:Dont Copy Locale on Compact=False;Jet OLEDB:CompactWithout Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support ComplexData=False 根据上面的连接串可以写出下面的VBA代码。连接串中大部分是默认值,VBA代码中可以不写,例如,下面的代码是连接access数据库:vbview plaincopy1. 更新工作表数据,无返回数据2. Subado_test1()3. DimcnnAsADODB.Connection4. 5. 新建一个连接对象6. Setcnn=NewADODB.Connection7. 建立连接8. Withcnn9. .Provider=Microsoft.ACE.OLEDB.12.010. 当前文件的路径可以用ThisWorkbook.Path11. .OpenThisWorkbook.Path&员工.accdb12. EndWith13. 使用SQL语句操作数据库14. DimsqlAsString15. sql=update职工set年龄=20where姓名=张丽16. cnn.Executesql执行SQL命令,无需返回值17. cnn.Close关闭连接18. Setcnn=Nothing释放对象19. 20. MsgBox操作成功!21. EndSub 查询表,有返回记录,注意下面例子中定义和连接的不同写法:vbview plaincopy1. 查询数据库表数据2. Subado_test2()3. DimcnnAsNewADODB.Connection4. 5. 建立连接,当前文件的路径可以用ThisWorkbook.Path6. cnn.OpenProvider=Microsoft.ACE.OLEDB.12.0;DataSource=&ThisWorkbook.Path&员工.accdb7. 使用SQL语句操作数据库8. DimsqlsAsString9. DimrstAsNewADODB.Recordset10. sqls=select*from职工11. Setrst=cnn.Execute(sqls)执行SQL命令12. 13. 用循环获取字段名14. DimiAsInteger15. Fori=0Torst.fields.Count-116. Cells(1,i+1)=rst.Fields(i).name17. Nexti18. 保存查询记录19. Range(a2).CopyFromRecordsetrst20. 21. rst.Close关闭记录集22. Setrst=Nothing释放对象23. cnn.Close关闭连接24. Setcnn=Nothing释放对象25. 26. MsgBox操作成功!27. EndSub 将工作表中的数据保存到数据库表中方法是更新记录集,再调用记录集update方法,例如:vbview plaincopy1. 将工作表数据保存到数据库2. Subado_test3()3. DimcnnAsADODB.Connection4. DimrstAsADODB.Recordset5. Dimsqls,mytableAsString6. Dimi,j,nAsInteger7. 8. 建立连接,当前文件的路径可以用ThisWorkbook.Path9. Setcnn=NewADODB.Connection10. cnn.OpenProvider=Microsoft.ACE.OLEDB.12.0;DataSource=&ThisWorkbook.Path&员工.accdb11. mytable=职工12. n=Range(a1).End(xlDown).Row当前工作表有效行数13. 使用SQL语句操作数据库14. Fori=2Ton15. sqls=select*from&mytable&where编号=&Cells(i,1).Value&16. Setrst=NewADODB.Recordset17. 用记录集对象执行SQL语句18. rst.Open,cnn,adOpenKeyset,adLockOptimistic19. Ifrst.RecordCount=0Thenrst.AddNew找不到,增加一条空记录20. Forj=1Torst.Fields.Count21. rst.Fields(j-1)=Cells(i,j).Value22. Nextj23. rst.Update24. Nexti25. 26. rst.Close关闭记录集27. Setrst=Nothing释放对象28. cnn.Close关闭连接29. Setcnn=Nothing释放对象30. 31. MsgBox操作成功!32. EndSub3、连接Excel工作表 连接Excel,注意连接串(增加一个ExtendedProperties=excel 12.0)和SQL语句的写法:vbview plaincopy1. 连接Excel工作表2. Subado_test4()3. DimcnnAsADODB.Connection4. DimrstAsADODB.Recordset5. DimsqlsAsString6. 7. 建立连接,注意连接串和SQL语句的写法8. Setcnn=NewADODB.Connection9. Withcnn10. .Provider=Microsoft.ACE.OLEDB.12.0;ExtendedProperties=excel12.011. .OpenThisWorkbook.Path&tb_city_zd.xls12. EndWith13. 使用SQL语句操作数据库14. sqls=select*fromsheet1$15. Setrst=cnn.Execute(sqls)16. Sheets(sheet6).Range(A1).CopyFromRecordsetrst17. 18. rst.Close关闭记录集19. Setrst=Nothing释放对象20. cnn.Close关闭连接21. Setcnn=Nothing释放对象22. 23. MsgBox操作成功!24. EndSub 同时连接Excel和Access数据库,主要看连接串和SQL语句的写法:vbview plaincopy1. 连接Excel工作表和Access数据库2. Subado_test5()3. DimcnnAsADODB.Connection4. DimrstAsADODB.Recordset5. DimsqlsAsString6. 7. 建立连接,注意连接串和SQL语句的写法8. Setcnn=NewADODB.Connection9. Withcnn10. .Provider=Microsoft.ACE.OLEDB.12.0;ExtendedProperties=excel12.011. .OpenThisWorkbook.FullName12. EndWith13. 使用SQL语句操作数据库14. sqls=selecta.部门,count(*)from部门$A:Aaleftjoindatabase=&_15. ThisWorkbook.Path&员工.accdb.职工bona.部门=b.部门groupbya.部门16. Setrst=cnn.Execute(sqls)17. Sheets(部门).Range(b2).CopyFromRecordsetrst18. 19. rst.Close关闭记录集20. Setrst=Nothing释放对象21. cnn.Close关闭连接22. Setcnn=Nothing释放对象23. 24. MsgBox操作成功!25. EndSub4、注意事项 关于ADO控件,有两种创建方式,一种是如前述的那样,先加引用,然后在代码中就可以定义这种类型的对象,再通过New的方式建立对象。另一种方式直接创建,代码如下:Dim cnnAs Object, rst As ObjectSet cnn =CreateObject(ADODB.Connection)Set rst =CreateObject(ADODB.Recordset)其实这种方法更实用,因为加引用必须是熟悉系统的人才能操作,如果将写好的程序给一般人使用,难道每次你还指导他去加引用? 执行SQL语句有三种方式,一种是用connection,即上面的cnn.Execute,这种方式比较适合无返回记录的语句,即DML语句。如果执行有返回记录的SQL语句,也可以取到记录,只是RecordCount总是反馈-1。这种情况下可以根据rst.eof判断有无查询结果,如果rst.eof= true就表示查询结果为空。另一种方式是用RecordSet,即上面的rst.Open,这个适合有返回记录的语句,即select语句,因为这种方式能够返回记录数RecordCount。当然还有第三种方式,就是用command,这个比较适合执行存储过程,因为这种方式可以传递参数。三种方式command方式功能最强,用起来也最麻烦,connection最弱,用起来也最简单。 取值除了前面说的CopyFromRecordset,还可以用循环的方式逐个取值,例如:vbview plaincopy1. Fori=1torst.RecordCount2. Forj=1Torst.fields.Count3. Cells(i+1,j)=rst.Fields(j-1).Value4. Nextj5. rst.MoveNext6. Nexti ADO也可也连接其他数据库,只是连接串不同,其它操作一样,例如Oracle,连接语句如下: cnn.Open Provider=msdaora;DataSource=dl580;User Id=username;Password=userpasswd;其中dl580是Oracle客户端配置的连接名称,后面是Oracle用户名和密码。附录:SQL多表查询语句的写法1、嵌套查询嵌套查询是将一个SELECT语句包含在另一个SELECT语句的WHERE子句中,也称为子查询。子查询(内层查询)的结果用作建立其父查询(外层查询)的条件,因此,子查询的结果必须有确定的值。利用嵌套查询可以将几个简单查询组成一个复杂查询,从而增强SQL的查询能力。1、查询“张三”选修的课程和成绩select 学号,课程,成绩 from 课程$ where 学号 = (select 学号 from 学生$ where 姓名 =张三)2、查询“张三”选修的语文课和成绩select 学号,课程,成绩 from 课程$ where 学号 = (select 学号 from 学生$ where 姓名 =张三 and 课程=语文)3、查询所有考试学生的成绩select * FROM 课程$ where 成绩 not in (select distinct 学号 from 学生$)2、合并查询合并查询想必大家都知道了,数据透视表多表查询,一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论