CategoryResourceRepost/极客时间专栏/SQL必知必会/第三章:认识DBMS/38丨如何在Excel中使用SQL语言?.md
louzefeng d3828a7aee mod
2024-07-11 05:50:32 +00:00

13 KiB
Raw Blame History

在进阶篇中我们对设计范式、索引、页结构、事务以及查询优化器的原理进行了学习了解这些可以让我们更好地使用SQL来操作RDBMS。实际上SQL的影响力远不止于此在数据的世界里SQL更像是一门通用的语言虽然每种工具都会有一些自己的“方言”但是掌握SQL可以让我们接触其它以数据为核心的工具时更加游刃有余。

比如Excel。

你一定使用过Excel事实上Excel的某些部分同样支持我们使用SQL语言那么具体该如何操作呢

今天的课程主要包括以下几方面的内容:

  1. 如何在Excel中获取外部数据源
  2. 数据透视表和数据透视图是Excel的两个重要功能如何通过SQL查询在Excel中完成数据透视表和透视图
  3. 如何让Excel与MySQL进行数据交互

如何在Excel中获取外部数据源

使用SQL查询数据首先需要数据源。如果我们用Excel来呈现这些数据的话就需要先从外部导入数据源。这里介绍两种直接导入的方式

  1. 通过OLE DB接口获取外部数据源
  2. 通过Microsoft Query导入外部数据源。

下面我们通过导入数据源heros.xlsx体验一下这两种方式你可以从这里下载数据源。

通过OLE DB接口获取外部数据源

OLE的英文是Object Link and Embedding中文意思是对象连接与嵌入它是一种面向对象的技术。DB代表的就是数据库。OLE DB的作用就是通向不同的数据源的程序接口方便获取外部数据这里不仅包括ODBC也包括其他非SQL数据类型的通路你可以把OLE DB的作用理解成通过统一的接口来访问不同的数据源。

如果你想要在Excel中通过OLE DB接口导入数据需要执行下面的步骤

第一步,选择指定的文件。方法是通过“数据” → “现有连接”按钮选择连接。这里选择“浏览更多”然后选择指定的xls文件。


第二步,选择指定的表格,勾选数据首行包含列标题,目的是将第一行的列名也加载进来。


第三步,通过“属性” → “定义”中的命令文本来使用SQL查询选择我们想要的数据也可以将整张表直接导入到指定的位置。


如果我们显示方式为“表”,导入全部的数据到指定的$A$1代表A1单元格那么在Excel中就可以导入整个数据表如下图所示

通过Microsoft Query获取外部数据源

第二种方式是利用Microsoft Query功能导入外部数据源具体步骤如下

第一步,选择指定的文件。方法是通过“数据” → “获取外部数据”按钮选择数据库这里我选择了“Excel Files”然后选择我们想要导入的xls文件。


第二步。选择可用的表和列,在左侧面板中勾选我们想要导入的数据表及相应的列,点击 > 按钮导入到右侧的面板中,然后点击下一步。


最后我们可以选择“将数据返回Microsoft Excel”还是“在Microsoft Query中查看数据或编辑查询”。这里我们选择第一个选项。


当我们选择“将数据返回到Microsoft Excel”后接下来的操作和使用OLE DB接口方式导入数据一样可以对显示方式以及属性进行调整


这里,我们同样选择显示方式为“表”,导入全部的数据到指定的$A$1(代表A1单元格同样会看到如下的结果

使用数据透视表和数据透视图做分析

通过上面的操作你也能看出来从外部导入数据并不难关键在于通过SQL控制想要的结果集这里我们需要使用到Excel的数据透视表以及数据透视图的功能。

我简单介绍下数据透视表和数据透视图:

数据透视表可以快速汇总大量数据,帮助我们统计和分析数据,比如求和,计数,查看数据中的对比情况和趋势等。数据透视图则可以对数据透视表中的汇总数据进行可视化,方便我们直观地查看数据的对比与趋势等。

假设我想对主要角色role_main的英雄数据进行统计分析他们平均的最大生命值hp_max平均的最大法力值(mp_max),平均的最大攻击值(attack_max)那么对应的SQL查询为

SELECT role_main, avg(hp_max) AS `平均最大生命`, avg(mp_max) AS `平均最大法力`, avg(attack_max) AS `平均最大攻击力`, count(*) AS num FROM heros GROUP BY role_main

使用SQL+数据透视表

现在我们使用SQL查询通过OLE DB的方式来完成数据透视表。我们在第三步的时候选择“属性”并且在命令文本中输入相应的SQL语句注意这里的数据表是[heros$],对应的命令文本为:

SELECT role_main, avg(hp_max) AS `平均最大生命`, avg(mp_max) AS `平均最大法力`, avg(attack_max) AS `平均最大攻击力`, count(*) AS num FROM [heros$] GROUP BY role_main


然后我们在右侧面板中选择“数据透视表字段”以便对数据透视表中的字段进行管理比如我们勾选numrole_main平均最大生命平均最大法力平均最大攻击力。


最后会在Excel中呈现如下的数据透视表


操作视频如下:

使用SQL+数据透视图

数据透视图可以呈现可视化的形式方便我们直观地了解数据的特征。这里我们使用SQL查询通过Microsoft Query的方式来完成数据透视图。我们在第三步的时候选择在Microsoft Query中查看数据或编辑查询来看下Microsoft Query的界面


然后我们点击“SQL”按钮可以对SQL语句进行编辑筛选我们想要的结果集可以得到


然后选择“将数据返回Microsoft Excel”在返回时选择“数据透视图”然后在右侧选择数据透视图的字段就可以得到下面这张图


你可以看到使用起来还是很方便。

具体操作视频如下:

让Excel与MySQL进行数据交互

刚才我们讲解的是如何从Excel中导入外部的xls文件数据并在Excel实现数据透视表和数据透视图的呈现。实际上Excel也可以与MySQL进行数据交互这里我们需要使用到MySQL for Excel插件

下载mysql-for-excel并安装地址https://dev.mysql.com/downloads/windows/excel/

下载mysql-connector-odbc并安装地址https://dev.mysql.com/downloads/connector/odbc/

这次我们的任务是给数据表增加一个last_name字段并且使用Excel的自动填充功能来填充好英雄的姓氏。

第一步连接MySQL。打开一个新的Excel文件的时候会在“数据”面板中看到MySQL for Excel的插件点击后可以打开MySQL的连接界面如下


第二步导入heros数据表。输入密码后我们在右侧选择想要的数据表heros然后选择Import MySQL Data导入数据表的导入结果如下


第三步创建last_name字段使用Excel的自动填充功能来进行姓氏的填写Excel自带的“自动填充”可以帮我们智能填充一些数据完成之后如下图所示


第四步将修改好的Excel表导入到MySQL中创建一个新表heros_xls。选中整个数据表包括数据行及列名然后在右侧选择“Export Excel Data to New Table”。这时在MySQL中你就能看到相应的数据表heros_xls了我们在MySQL中使用SQL进行查询

mysql > SELECT * FROM heros_xls

运行结果69条记录


需要说明的是有时候自动填充功能并不完全准确我们还需要对某些数据行的last_name进行修改比如“夏侯惇”的姓氏应该改成“夏侯”“百里守约”改成“百里”等。

总结

我们今天讲解了如何在Excel中使用SQL进行查询在这个过程中你应该对”SQL定义了查询的标准“更有体会。SQL使得各种工具可以遵守SQL语言的标准当然也有各自的方言

如果你已经是个SQL高手你会发现原来SQL和Excel还可以如此“亲密”。Excel作为使用人数非常多的办公软件提供了SQL查询会让我们操作起来非常方便。如果你还没有使用过Excel的这些功能那么就赶快来用一下吧。


SQL作为一门结构化查询语言具有很好的通用性你还在其他工具中使用过SQL语言吗如果有的话可以分享一下你的体会。

最后留一道动手题吧。你可以创建一个新的xls文件导入heros.xlsx数据表用数据透视图的方式对英雄主要定位为刺客、法师、射手的英雄数值进行可视化数据查询方式请使用SQL查询统计的英雄数值为平均生命成长hp_growth平均法力成长mp_growth平均攻击力成长attack_growth。

欢迎你在评论区写下你的体会与思考,也欢迎把这篇文章分享给你的朋友或者同事,一起来交流。