1.3 SQL语句入门
本节通过在案例中介绍SELECT语句、FROM子句、WHERE子句以及ORDER BY子句的使用,同时也介绍INSERT INTO、UPDATE等比较少见的语句用法,以帮助读者进一步了解SQL语句的语法构成,以便在Excel中更好地使用SQL语句。
疑难8 如何查询工作表中单列数据
自从国内某著名网站推出农场游戏以来,许多都市白领男女天天忙着种菜、偷菜,起早贪黑、熬更守夜,忙得不亦乐乎,这种游戏就成为一种非常有效的休闲和减压方式。农场中每一种作物的收获季节、价格等特性各有差异,图1-35是农作物的详细资料。如何使用SQL语句查询该农场中所有的作物?
■ 图1-35 农作物数据源
解决方案
通过Excel提供的“OLE DB查询”功能,结合SQL查询语句,返回农作物中的作物列数据。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT 作物 FROM [农作物$]
单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表“$A$1”单元格,然后单击“确定”按钮,即可查询出该农场中所有的作物,结果如图1-36所示。
■ 图1-36 返回QQ农场中所有的作物
原理分析
※ 使用SQL获取单列数据 ※
本例实现的是对单个数据表的单列数据进行查询,所使用的SQL语句语法结构比较简单,具体的语法结构如下:
SELECT 列字段名 FROM [工作表名称$]
该语句执行过程可以这样理解:选择指定工作表中某一列的所有数据。因在SQL IN Excel中的工作表的表示形式为:[工作表名称$],需要记住该写法才能更快、更好地编写出相关的SQL语句。
知识扩展
※ 什么是SELECT子句 ※
在SQL语句中,SELECT语句与FROM子句联合使用,以一种有组织的、可读的方式从源工作表中提取数据。查询语句的SELECT部分用于指定需要表中哪些字段的数据,如本例选择“农作物”工作表中名为“作物”字段中的数据。关键字SELECT后面是字段列表,它们是查询输出的组成部分。
疑难9 如何查询工作表中多列数据
某网站农场游戏中的农作物详细资料包含了多个列字段,如作物、预计收入总、预计收入/h、收获经验/季、收获经验总、收获经验/h等字段,如图1-37所示。如何使用SQL语句查询出该农场中的作物、预计收入总、收获经验/季、收获经验/h等相关资料?
■ 图1-37 农作物多个列字段数据源
解决方案
要在查询结果中显示多个列字段名,只需要在SELECT子句后面列出多个列字段名即可。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT 作物,预计收入总,[收获经验/季] , [收获经验/h] FROM [农作物$]
或者输入:
SELECT 作物,预计收入总,`收获经验/季` , `收获经验/h` FROM [农作物$]
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可查询出该农场中所有的作物,如图1-38所示。
■ 图1-38 返回农作物中多列字段
注意
各列字段中间的逗号及[]号均是在英文状态下输入的,而重音符(``)则是键盘左上角的波形符在英文状态下的输入符号。
原理分析
※ 使用SQL语句获取多列数据 ※
本例实现的是对单个数据表的多列数据进行查询,只需在SELECT子句后列出要查询的多个列字段,在各列字段中间用逗号隔开,最后一个列字段除外。查询结果将以指定的字段顺序显示。所使用的SQL语句具体的语法结构如下:
SELECT 列字段名1,列字段名2,列字段名3 FROM [工作表名称$]
在本例中,一般认为直接在SELECT子句后列出查询的字段即可查询出结果,如输入以下的SQL语句:
SELECT 作物,预计收入总,收获经验/季 , 收获经验/h FROM [农作物$]
当在“命令文本”输入该语句的时候,却出现了错误的提醒。对于“收获经验/季”、“收获经验/h”等含有特殊字符的列字段名,若要查询其结果,需用方括号[]或者重音符``将含有“/”、“\”、空格等特殊字符的字段括起来,否则得不到正确的结果。
一般而言,大部分数据表中的列字段名的命名还是比较规范的。这种情况下,只需要在SELECT子句中列出要查询的列字段,并且用逗号隔开即可。
知识扩展
※ SQL列字段命名的限制 ※
当使用SQL语句的时候,必须避免列字段中使用下面的特殊字符:空格、双引号(")、撇号(')、重音符(`)、数字标记(#)、百分号(%)、大于号(>)、小于号(<)、叹号(!)、句号(.)、方括号([ 或者 ] )、星号(*)、美元符号($)、分号(;)、脱字号(^)、圆括号((或者))、加号(+)、反斜杠(\或者/)等。
如果在源数据表的列字段使用了这些特殊字符,那么在使用SQL语句列出各字段的数据时,就会发生错误。为了培养编写SQL语句的良好习惯,在对源数据中的列字段命名时,尽量避免使用特殊字符。
疑难10 如何查询工作表中的所有列数据
第19届世界杯足球赛决赛于2010年6月11日—7月11日在南非九个城市的十座球场举行,本届是首次在非洲地区举行的世界杯足球赛。共有来自世界各地的32支球队参加赛事,共进行64场比赛决定冠军队伍,最终来自欧洲赛区的斗牛士西班牙经过加时1比0击败荷兰,成为第8支世界杯冠军球队,也是首支在欧洲以外夺冠的欧洲球队。根据全部比赛结果,得到最终32支球队的本次世界排名,如图1-39所示。如何提取南非世界杯最终排名表中所有列的数据?
■ 图1-39 南非世界杯最终排名表
解决方案
使用代表所有列和所有行的字段名或者通配符,获取整个南非世界杯最终排名表的所有数据。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM [南非世界杯最终排名表$]
或者输入:
SELECT 名次,球队名,胜,负,积分,进球,失球 FROM [南非世界杯最终排名表$]
或者输入:
SELECT [南非世界杯最终排名表$].* FROM [南非世界杯最终排名表$]
或者输入:
SELECT A.* FROM [南非世界杯最终排名表$] A
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到所有列的数据。
原理分析
※ 如何理解SQL语句中的通配符 ※
通配符*在SQL语句里代表所有行及所有列,可以起到简化SQL语句的作用。有时候,源数据表中某些列或行被隐藏起来,导致显示的列名和实际表中使用的列名有所不同,使用通配符*提取所有行及列则不需要担心这个问题。
因为本例中源数据表的列字段不多,将所有的列字段列举出来并不麻烦,即从源数据表中提取每一个列字段名,可获取所有行及所有列的数据,如第二个语句表示形式。
对于第三个语句表达方式,主要是通配符*的前面指定了获取的数据来源于指定的工作表,工作表名称与通配符*之间需要用句号(.)进行连接。
第四个语句表达方式中,[南非世界杯最终排名表$] A表示将南非世界杯最终排名表命名为A,工作表名称的长度过长,会导致编写的SQL语句的可读性不强,而别名可以简化工作表的缩写,善用别名可以培养好的使用习惯。
知识扩展
※ 什么叫别名 ※
别名主要是为了简单标注一个表。在多表查询的情况下,如果工作表的名称比较长,并且多个表中存在相同的字段,为了简单标注不同的表的相同栏位,可以添加别名。
疑难11 如何使用列别名
广州某电器商场一般在设计销售表表头时,要求把表头字段设置为英文,如图1-40所示。这在查询相关销售商品记录时会给学历不高的员工带来不便,尤其对年纪较大且没有正式接触过外语的员工而言,则是一大难题。为了方便英文水平不高的老员工进行阅读,现要求把表头改成中文,如何才能实现这样的效果?
■ 图1-40 销售表
解决方案
借助SQL语言中列别名的使用规则,可以将英文列字段重新命名为中文列字段名。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT Month AS 月份,Product AS 商品,Quantity AS 数量,Price AS 价格,Sale AS销售额 FROM [销售表$]
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可把所有英文列字段改成中文列字段,如图1-41所示。
■ 图1-41 结果表
原理分析
※ 如何使用列别名 ※
使用列字段名只需要在SELECT子句的列名称之后列出列别名,同时列别名之前加上可选关键字“AS”,以便区分列名称和列别名,具体的语法结构为
SELECT 列字段名1 AS 列别名,列字段名2 AS 列别名,列字段名3 AS 列别名 FROM [工作表名称$]
下面介绍可以使用列别名的几种常见情况。
1.字段为英文列字段。为了方便读者阅读,可使用中文列别名代替英文列字段,如本例所示。
2.在多表查询时出现相同的列名。如果对多个工作表进行查询,查询结果中可能会出现相同的列名,这样容易引起读者误解,此时可以通过给相同的列名设置不同的列名,来更好地区分其列名来源。
3.在查询的结果中添加列,即在工作表中出现计算产生新的列时。比如每件商品的提成占其Sale的10%,需要计算销售额的提成,可以将新列的列别名叫“提成”,SQL语句如下:
SELECT Month AS 月份,Product AS 商品,Quantity AS 数量,Price AS 价格,Sale AS销售额,Sale*10% AS 提成 FROM [销售表$]
4.统计结果中出现的列。使用聚合函数语句对工作表数据进行查询时,需要对产生的统计字段使用列别名。如利用SUM函数查询销售表中的Sale总额,为了方便查看统计结果,可以将查询结果列命名为销售额总额,SQL语句如下:
SELECT SUM(Sale) AS 销售额总额 FROM [销售表$]
值得注意的是,在使用列别名时,必须记住以下准则:① 必须使用AS关键字,若缺少,则出现错误;② 如果列别名包含空格或其他特殊符号,则列别名必须放在单引号、双引号或方括号[]中,如Month的列别名命名为“月份”,SQL语句如下:
SELECT Month AS ‘月份’ FROM [销售表$]
或者
SELECT Month AS “月份” FROM [销售表$]
或者
SELECT Month AS [月份] FROM [销售表$]
疑难12 如何使用DISTINCT查询工作表中不重复的记录
如图1-42所示,某公司业务表中记录着该公司各机构的业务员的相关信息,如机构、业务员代码、姓名、入司时间,因登记该业务表的员工在工作中出现的小失误,把各机构的业务员信息的记录重复粘贴一次或多次。例如,机构为“邓州”、业务员代码为“8605733”、姓名为“乾安阁”、入司时间为“20081227”这条记录,在业务表中出现了两次,但递交上去存档的记录只能为唯一的不重复的记录。那么如何查询业务表中不重复的记录?
■ 图1-42 业务表
解决方案
通过DISTINCT过滤多余的重复记录只保留一条,从而达到查询业务表中提取不重复的记录效果。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT DISTINCT * FROM [业务表$]
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可提取业务表中不重复的业务记录,如图1-43所示。
■ 图1-43 不重复记录的业务表结果
原理分析
※ SQL语句中关键词DISTINCT的使用 ※
DISTINCT可以用来过滤掉重复记录只保留一条,但工作中往往用它来返回不重复的记录,而不是用其来返回不重复记录的所有值。而本例中,因数据量相对较少,故用其来返回不重复记录的所有值。在此不推荐使用其来返回不重复记录的所有值的最主要原因是DISTINCT需要用二重循环查询来解决,对于一个数据量非常大的数据表而言,该操作会直接影响到查询效率。若只希望单独提取某列中不重复的数据,直接使用DISTINCT可快速解决该问题,具体的语法结构为
SELECT DISTINCT 列字段名 FROM [工作表名称$]
例如,提取业务表中不重复的机构,可以使用以下SQL语句:
SELECT DISTINCT 机构 FROM [业务表$]
即可得到如图1-44所示的结果。
■ 图1-44 不重复机构
疑难13 如何查询百度豪华车排行榜中某日搜索量大于800的记录
随着生活水平的不断提升,豪华车开始逐渐成为不少高收入者的座驾。常见的品牌有宝马、奥迪、奔驰、雷克萨斯等,而迈巴赫、劳斯莱斯、兰博基尼则是相对少见的豪华车。一般网友比较喜欢通过百度来搜索相关豪华车的资料,如图1-45所示为2010年11月29日百度豪华车搜索排行榜,搜索量最多的车型是奔驰s级,其次是宝马7系。若只想查询排行榜中今日搜索量大于800的记录,应该如何查询?
■ 图1-45 百度豪华车排行榜
解决方案
使用WHERE子句添加今日搜索量大于800的条件进行查询。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM [百度豪华车排行榜$] WHERE 今日搜索> 800
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可提取今日搜索量大于800的豪华车记录,如图1-46所示。
■ 图1-46 查询结果表
原理分析
※ SQL语句中WHERE子句的使用 ※
查询中的条件指定了需要返回满足什么标准的信息。条件的值是TRUE或者FALSE,从而限制了查询中获取的数据。WHERE子句一般用于给查询添加条件,从而去除用户不需要的数据。
WHERE子句中可以有多个条件,条件之间可以用操作符AND或者OR进行连接,详细介绍见第2章,另外,还会介绍其他一些条件运算符。
WHERE子句的语法结构如下:
SELECT 列字段名 FROM [表名称$] WHERE 列字段名 运算符 值
运算符包含大于、小于、等于、不等于、大于或等于、小于或等于、IN、BETWEEN AND等。
疑难14 如何在SQL中使用定义名称
某公司的综合部每个月都会对各部门领取的办公用品进行登记归档,以便年底统计在办公用品方面支出的费用。如图1-47所示,其中已经将1月领取表及2月领取表分别定义名称为一月、二月:
■ 图1-47 办公用品领取表
一月=办公用品领取表!$A$2:$D$22 二月=办公用品领取表!$F$2:$I$10
那么,如何将不连续区域的数据汇总在同一个工作表中?
解决方案
通过UNION ALL对定义名称的不连续数据区域进行连接,可把所有的数据汇总在同一工作表中。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM 一月 UNION ALL SELECT * FROM 二月
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可将1月领取表和2月领取表的记录汇总在一起,如图1-48所示。
■ 图1-48 汇总表
原理分析
※ 定义名称在SQL语句中的应用 ※
定义名称实际上就是定义了一个数据表。如图1-49所示,出现定义名称为“一月”、“二月”的TABLE类型,且与“办公用品领取表”并列在一起,由此可知:对于SQL而言,定义一个名称就是定义了一个操作的源数据表。对于同一工作表中不同区域的源数据,如果需要便捷地应用SQL语句,可以采用定义名称来简化SQL语言的编写。
■ 图1-49 选择表格
知识扩展
※ 什么叫名称 ※
名称是一个有意义的简略表示法,便于用户了解单元格引用、常量 、公式或表的用途。在SQL中,使用定义名称同样也可以让SQL语句更加容易理解和维护。一般可为单元格区域、函数、常量或表格定义名称。一旦采用了在工作簿中使用名称的做法,便可轻松地更新、审核和管理这些名称。
疑难15 如何对学生的成绩进行降序排列
某小学2010年五年级第二学期五(1)班各同学的语文成绩如图1-50所示,该班的语文老师要把各学生的成绩按照降序进行排列,以便区分最高分和最低分的情况。如何使用SQL语句完成该操作?
■ 图1-50 语文成绩
解决方案
使用ORDER BY子句对语文成绩进行DESC排序。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM [语文成绩$] ORDER BY 语文成绩 DESC
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,结果如图1-51所示。
■ 图1-51 排序结果
原理分析
※ ORDER BY子句的使用 ※
在本例中,使用了ORDER BY子句来实现语文成绩的降序排列。一般而言,ORDER BY子句列出的第一个列是主要的排序次序。只有当两个行的第一列有相同的值时,才使用第一列之后列出的各列,这项规则适用于所有的列。比如,只有ORDER BY子句前两个列中的数据相同时,才使用第三列进行排序。
对于ORDER BY子句而言,默认值是按升序排列的,通常不指定它,但升序的关键词为ASC。要降序排列各列,则必须指定DESC关键字。具体的语法结构如下:
SELECT 列字段名 FROM [工作表名称$] ORDER BY 指定列字段名 升序(降序)
在本书第5章将更加详细地讲述ORDER BY子句及其相关应用,在此仅简单提及一下。
疑难16 如何不借助源数据表使用SQL语句
使用SQL语句时,常借助源数据表来进行查询,查询语句中也需要用到FROM子句。其实,使用SQL语句可以不使用FROM [表$]这种形式,但在什么情况下可以不使用FROM子句。如图1-52所示为一个空白的工作表。
■ 图1-52 空白工作表
解决方案
提取系统日期时可以不使用FROM子句。
操作方法
步骤1 通过OLE DB方法找到当前操作的工作簿作为数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT DATE() AS 今天日期
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,结果如图1-53所示。
■ 图1-53 不使用FROM子句操作演示及结果
原理分析
※ 什么情况下的SQL语句可以不使用FROM子句 ※
对于系统时间或日期的提取,可以不使用FROM子句,因为它仅作用于当前会话环境,并且随着系统时间进行相应的变化,当前会话环境关闭后自动失效。
SQL语句可以利用这个特性,来提取以下几种常见类型的日期:昨天、明天、上周、本周、下周、上月、本月、下月等。
关于日期用法的具体介绍请见第4章。
疑难17 如何把一条新记录添加到数据源中
如图1-54所示为某公司的商品销售清单,需要加入一条新的记录:地区为“东莞”、销售部门为“二部”、代码为“A00008”、商品为“笔盒”、数量为78,如何在数据源末尾添加一条新记录?
■ 图1-54 销售表
解决方案
使用INSERT INTO语句可添加新记录。
操作方法
步骤1 选择“数据”选项卡,单击“获取外部数据”组中的“自其他来源”按钮,在下拉菜单中选择“来自Microsoft Query ”选项,弹出“选择数据源”对话框,取消“使用‘查询向导’创建/编辑查询”复选框的选择,在“数据库”列表框中选择“Excel Files *”选项,如图1-55所示,单击“确定”按钮。
■ 图1-55 选择数据源
步骤2 弹出“选择工作簿”对话框,在“驱动器”下拉列表中选择D盘,在“数据库名”列表中选择“疑难17.xlsx”,如图1-56所示,单击“确定”按钮。
■ 图1-56 选择工作簿
步骤3 在弹出的“添加表”对话框中,选中“销售表$”表,如图1-57所示,单击“添加”→“关闭”按钮,关闭“添加表”对话框。
■ 图1-57 添加表
步骤4 在“Microsoft Query”视图操作界面中,单击按钮,即可弹出“SQL”文本框,在SQL语句文本框中输入以下语句:
INSERT INTO [销售表$](地区,销售部门,代码,商品,数量) VALUES('东莞','二部','A00008','笔盒',78)
简写该语句如下:
INSERT INTO [销售表$] VALUES('东莞','二部','A00008','笔盒',78)
即在SQL语句框中的语句如图1-58所示。
■ 图1-58 输入SQL语句
步骤5 单击“确定”按钮,在弹出的警告对话框中再次单击“确定”按钮。
步骤6 弹出如图1-59所示的对话框,单击“确定”按钮。
■ 图1-59 成功执行语句提示对话框
步骤7 关闭“Microsoft Query”视图操作界面,在弹出如图1-60所示的对话框中,单击“是”按钮即可。
■ 图1-60 退出查询提示对话框
此时打开“销售表”工作表,可以看到SQL语句执行的结果,调整格式后如图1-61所示。
■ 图1-61 添加新记录后的数据
原理分析
※ INSERT INTO语句的使用 ※
本例主要涉及INSERT INTO语句的使用,其将一个或多个记录添加到表中,INSERT INTO语句称为追加查询,其语法如表1-3所示。
■ 表1-3 INSERT INTO语句组成部分
INSERT INTO TABLE [(field1[,field2[,...]])] VALUES (value1[,value2[,...]]
通过如上所述的追加查询语法,可以使用INSERT INTO语句向表中追加单个记录。在这种情形下,代码要指定每个记录字段的名称和值。必须指定每一个将被赋值的记录字段,并且要给出该字段的值。如果没有指定每个字段的值,则在缺少值的列中插入默认值或Null值,记录将追加到表的末尾。
注意
INSERT INTO语句的使用必须通过Microsoft Query视图中的SQL语句编写来完成,而不能通过OLE DB外部接口,因为OLE DB是导入外部源数据,并且需要指定数据的放置位置。
疑难18 如何在Excel中更新数据
如图1-62所示为某车间生产的零件,但其零件登记时用的单位出现错误,现在需要把所有为“只”的单位更新为“个”。
■ 图1-62 生产表
解决方案
使用UPDATE语句对工作表的数据进行更新。
操作方法
步骤1 参考疑难17中前面的几个步骤,添加相应的工作簿后,关闭“添加表”对话框,在“Microsoft Query”视图操作界面中,单击按钮,即可弹出“SQL”文本框,在SQL语句文本框中输入以下语句,如图1-63所示。
■ 图1-63 UPDATE语句编写
UPDATE [生产表$] SET 单位='个' WHERE 单位='只'
步骤2 单击“确定”按钮,在弹出的警告对话框中再次单击“确定”按钮。
步骤3 弹出如图1-64所示的对话框,单击“确定”按钮。
■ 图1-64 成功执行UPDATE语句提示对话框
步骤4 关闭“Microsoft Query”视图操作界面,在弹出的如图1-65所示的对话框中单击“是”按钮即可。
■ 图1-65 退出查询提示对话框
此时打开“生产表”工作表,可以看到SQL语句执行的结果,调整格式后如图1-66所示。
■ 图1-66 更新生产表单位的结果
原理分析
※ UPDATE语句的使用 ※
本例主要涉及UPDATE语句的使用。UPDATE语句用于创建更新查询,此查询基于指定的条件更改指定表中字段的值,以下为其主要的语法结构,相关说明如表1-4所示。
■ 表1-4 UPDATE语句组成部分
UPDATE table SET newvalue WHERE criteria;
若要更改多个记录或者要更改的记录在多个表中,此时UPDATE语句就特别有用,它还可以同时更新若干字段。
注意
UPDATE不会生成结果集,而且在使用更新查询更新记录时,无法撤销操作。因此,请随时做好数据的备份工作,如果更新了错误的记录,可以从备份副本中将其检索回来。
在本例中,通过WHERE子句条件限制了“单位”为“只”条件的记录,然后通过UPDATE语句将确定条件的记录进行更新。
疑难19 如何提取带有合并单元格的数据
如图1-67所示为某电脑公司的产品保修表,该公司人员在做表格时很喜欢用合并单元格,如何在使用SQL语句时尽量保持原状导入数据?
■ 图1-67 保修表
解决方案
使用辅助行把具有合并单元格的字段构建为新的字段名。
操作方法
步骤1 通过辅助行将合并单元格内容用&合并在一起,作为新的字段名,在导入时所用的区域以新的字段名作为起始行。在本例中,在第3行插入一行,分别添加公式:A3单元格=A1,B3单元格=B1,C3单元格为=C1&C2,D3单元格为=C1&D2,E3单元格为=E1,此时形成一行新的字段名,如图1-68所示。
■ 图1-68 形成新的字段名
步骤2 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤3 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM [保修表$A3:E12]
单击“确定”按钮返回“导入数据”对话框,指定返回的数据查询位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可查询出保修表的所有记录,结果如图1-69所示。
■ 图1-69 保修表查询结果
原理分析
※ 如何对包含合并单元格字段的工作表使用SQL语句 ※
一些用户在使用表格时,很喜欢使用合并单元格字段,通过辅助行生成新的一行字段名,然后将辅助行至数据行之间的记录作为数据源区域,即可在合并单元格字段中使用SQL语句。
注意
对于数据区域中出现的合并单元格,用此方法则无效,一般建议在数据区域中录入数据时必须规范化,便于后期的数据处理。
疑难20 如何解决查询结果中有空白记录的问题
如图1-70所示为某公司出库表查询记录情况,左边是该公司的出库表,右边是通过SQL语句返回出库表的所有记录,发现查询结果中出现了空白记录,到底哪里出现了问题?
■ 图1-70 查询结果出现空白记录
解决方案
清除源数据表中其他与数据无关的内容,再次刷新结果表。
操作方法
步骤1 选中源数据表中所有的空白单元格,并对其内容进行全部清除(本例选中出库表中的第19行,然后按<Ctrl+Shift+↓>组合键,即可选中所有空白行的记录,选择“开始”选项卡,单击“编辑”组中的“清除”按钮,在其下拉菜单中选择“全部清除”选项,即可清除所有的空白行记录;对于列空白记录,选中G列,按<Ctrl+Shift+→>组合键,选择“开始”选项卡,单击“编辑”组中的“清除”按钮,在其下拉列表中选中“全部清除”选项,即可清除所有的空白列记录)。
步骤2 返回到查询结果表,选择查询数据区域中的任一单元格(本例选择A1单元格),选择“数据”选项卡,单击“连接”组中的“全部刷新”按钮,在下拉菜单中选择“刷新”选项,即可把查询结果中出现的空白记录全部去掉。
原理分析
※ 如何去除查询结果中出现的空白记录 ※
Excel会记录“使用过的单元格”,可能使用过的单元格是没有内容的,但是如果对其执行了诸如设置字体大小、设置单元格边框等操作,都会被当做是数据源中的一部分。所以使用以下SQL语句:
SELECT * FROM [出库表$]
进行查询时,因为*通配符会把这些单元格所组成的封闭区域都包含在里面。选中所有空白的单元格,并使用“全部清除”命令,这些单元格就不会被记录使用过。