Excel 2010 SQL完全应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 逻辑运算符

在SQL查询中,逻辑运算符常被用来进行特殊条件的判断。当要执行空值判断、集合判断、范围判断以及模式匹配判断时,比较运算符就无法满足查询需求,而必须借助逻辑运算符。本节通过多个实例介绍逻辑运算符中的IS、IN、BETWEEN、LIKE运算符的使用方法以及实际运用中的注意事项。

疑难26 如何查询缺考同学的数据

在一些表格中常常包含空的数据值。在进行SQL查询时,如果遇到空的数据,常常需要对其进行特殊的处理。如图2-11所示,该表为某地区计算机等级考试成绩清单。在该成绩清单中,凡未参加考试(即缺考)的同学的成绩以空单元格表示。那么如何利用SQL查询将这些缺考同学的数据罗列出来呢?

■ 图2-11 计算机等级考试成绩清单

解决方案

在Excel表格中,空单元格的数据在SQL查询中被认为是缺失数据,缺失数据在SQL查询中以NULL值表示。在SQL条件表达式中,可以利用IS运算符判断数据是否为NULL,从而实现对空值数据的查询。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [计算机等级考试成绩$A2:G53] WHERE 成绩 IS NULL

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到缺考同学的数据,结果如图2-12所示。

■ 图2-12 查询缺考同学的数据

原理分析

※ NULL值的判断 ※

在SQL查询中,NULL值用来表示数据库表中缺失的数据,这些数据包括:值未知的数据、没有意义的数据、未输入的空数据。

本例中,缺考同学的成绩为空单元格,因而,在进行SQL查询时,该成绩值即为NULL值。对于NULL值,不能使用等号运算符进行判断,而必须使用IS运算符进行判断,其条件表达式格式如下:

expr IS NULL

其中,expr为指定字段或表达式。当Excel SQL查询遇到包含NULL值数据时,即判断该条件表达式成立,并会在结果表中显示。

当进行Excel SQL查询时,SQL查询机制会对字段类型进行判断。例如,本例中的成绩列均为数字,当遇到与数字类型不符的数据时,SQL会将其认为是没有意义的数据而把其当成NULL值。例如,在数字类型的字段中输入空文本(“”)、文本、文本数字、仅包含空格的单元格、仅包含文本前缀(')的单元格,这些数据在数字类型的字段中都不具有任何意义,因而为NULL值。

如果用户在Excel表格中进行了一些公式的运算,当运算结果为错误值的时候,该值在Excel SQL查询时也会由于其不具有任何意义而作为NULL值处理。

相反,若要查询NULL值以外的数据,可以采用以下表达式:

expr IS NOT NULL

知识扩展

在发明NULL值之前,在不同的计算机系统中使用不同的值表示数据的缺失。当要进行SQL查询时,由于缺乏统一性,一个简单的SQL程序需要用不同的值来表示不同的计算机系统中的缺失数据。另外,对于同一个计算机系统,如果采用某个特定值,则会与数据中的值发生混淆。比如用空格表示缺失的数据,而空格本身就是文本数据的特殊值,当要查询对空格数据的时候,就无法顺利执行。因而NULL值应运而生,NULL值没有任何类型属性,也不代表任何有用的数据值,从而使SQL查询变得更加通用和实用。

疑难27 如何查询同时参加两项比赛的人员名单

用SQL查询可以方便地找出两组数据中相同的和不相同的项目。如图2-13所示为某次运动会三个比赛项目的参赛人员名单。如何利用SQL查询找出同时参加跳远和跳高项目的人员名单?

■ 图2-13 运动会参赛名单

解决方案

利用SQL的IN运算可以方便地找出两列中的相同值。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT 跳远 AS 跳远和跳高 FROM [运动会参赛名单$]
WHERE 跳远 IN (SELECT 跳高 FROM [运动会参赛名单$])

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得同时参加两项比赛的人员名单,结果如图2-14所示。

■ 图2-14 同时参加两项比赛的人员名单

原理分析

※ IN运算的妙用 ※

IN运算用于条件表达式进行SQL查询时,可以显示字段值包含在某个集合中的所有数据。使用IN运算符作为条件语句的语法如下:

字段名 IN 集合

该集合可以用一个子查询得到。本例中,运用了一个子查询提取所有参加跳高的人员名单, (关于SQL子查询的内容,请参阅本书第7章)子查询语句如下:

SELECT 跳高 FROM [运动会参赛名单$]

该子查询得到一个所有参加跳高的人员的集合,然后利用IN运算找出参加跳远的人员名单在该集合中的人,得到的结果就是同时参加跳远和跳高的人,其语句如下:

跳远 IN (SELECT 跳高 FROM [运动会参赛名单$])

该语句表示“跳远”字段的值若出现在子查询的集合中,则条件成立。

在IN运算中,集合也可以表示为括号中的常数值,各常数之间用逗号隔开(,),常数可以为文本、数字、日期。如本例,如果要找出“朱小林”、“刘华平”中谁参加了跳远项目,可以采用以下语句:

SELECT 跳远 AS 跳远和跳高 FROM [运动会参赛名单$]
WHERE 跳远 IN (“朱小林” , ”刘华平”)

上述查询结果如图2-15所示。

■ 图2-15 参加跳远比赛项目的人员

若要查询集合以外的数据,可以采用以下表达式:

字段名 NOT IN 集合

知识扩展

※ NOT IN运算出现NULL值时的注意事项 ※

在NOT IN的运算中若出现NULL值,将会导致运算结果与预期不一致。如本例,当跳高一列中有空单元格时,若查询参加跳远而不参加跳高的人员名单,而采用以下语句时:

SELECT 跳远 AS 跳远和跳高 FROM [运动会参赛名单$]
WHERE 跳远 NOT IN (SELECT 跳高 FROM [运动会参赛名单$])

则查询结果将会为空。原因在于,当跳高一列有空单元格时,NOT IN之后的集合将会出现NULL值,其查询语句等价于以下语句:

SELECT 跳远 AS 跳远和跳高 FROM [运动会参赛名单$]
WHERE 跳远 WHERE 跳远<>”姓名1” AND 跳远<>”姓名1”
AND 跳远<>NULL AND 跳远<>”姓名N”

其中,“跳远<>NULL“的比较运算结果为NULL值,该运算结果将会导致整个条件子句运算结果为NULL,从而使查询结果为空。

在这种情形下,应该采用以下语句以避免NULL值的出现影响查询结果:

SELECT 跳远 AS 跳远和跳高 FROM [运动会参赛名单$]
WHERE 跳远 NOT IN (SELECT 跳高 FROM [运动会参赛名单$] WHERE NOT 跳高 IS NULL)

疑难28 如何查询2010年进入公司的员工名单

在许多时候,用户需要找出某一范围内的数据,而不是单纯地找出大于某个值或小于某个值的数据。如图2-16所示为某公司的员工名单,该表格中包括了员工姓名、年龄、入职日期等信息。在制作年末报表时,需要统计2010年加入公司的员工信息,那么如何用SQL找出这些员工?

■ 图2-16 员工名单

解决方案

利用SQL的BETWEEN运算可以方便地查询字段值在某一范围内的数据。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [员工名单$] WHERE 入职日期 BETWEEN #2010-1-1# AND #2010-12-31#

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得2010年加入公司的员工名单,结果如图2-17所示。

■ 图2-17 查询2010年入职名单

原理分析

※ 利用BETWEEN求某范围内的数据 ※

当要找出字段在某一范围内的数据时,可以利用BETWEEN运算符,其语法如下:

expr BETWEEN value1 AND value2

参数expr表示用于标识包含要计算的数据字段。

该表达式用于查询所有的字段值在value 1和value 2之间的记录(包括value 1和value 2)。value 1、value 2可以为数字或日期。采用该表达式即表示查询满足字段值大于或等于value 1且小于或等于value 2的数据。

本例中,要找出2010年加入公司的员工,即入职日期大于或等于2010年1月1日且小于2010年12月31日,可以采用BETWEEN运算符,由于是日期,必须在日期两端加上井字符号(#)。

入职日期 BETWEEN #2010-1-1# AND #2010-12-31#

一般地,value 1总是小于或等于value 2。当value 1大于value 2时,SQL查询机制将自动判断值的大小并返回介于value1和value2之间的值,其查询结果等同于BETWEEN value2 AND value1。

当Value 1等于Value 2时,即表示范围内只有一个值,在这种情况下与使用等号运算符效果相同,即相当于

expr = value 1

或者

expr = value 2

若要查询指定范围以外的数据,可以采用以下表达式:

expr NOT BETWEEN value1  AND value2

疑难29 如何查询姓“刘”的所有人员

SQL查询应用中,经常需要用到模糊查询的方式。如图2-18所示为某公司的员工名单,该表格中包括了员工姓名、部门、入职日期等信息。现在需要查询该名单中所有姓“刘”的员工,如何用SQL查询?

■ 图2-18 员工名单

解决方案

利用SQL的LIKE运算符可以进行模糊匹配查询。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [名单$] WHERE 姓名 LIKE "刘%"

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得所有刘姓人员的员工名单,结果如图2-19所示。

■ 图2-19 查询刘姓人员

原理分析

※ 运用LIKE进行模糊匹配 ※

等号运算符用于精确匹配的情形。而本例中要找出所有“刘”姓的员工,由于无法得知“刘”姓员工的名字,而且“刘”姓员工的名字都不一致,因而无法通过等号运算进行查询,此时需要用到模糊查询。在SQL查询中,LIKE运算符可以用于模糊查询,具体的语法如下:

expr LIKE pattern

参数expr表示用于标识包含要计算的数据的字段,即用于匹配的字段名。

参数pattern表示匹配模式。匹配模式是包括含有通配符的字符。

※ 模糊匹配中不确定长度的字符表示 ※

在Excel SQL的LIKE运算中,百分号(%)用来表示任意长度的任意字符。

如本例中的“刘%”表示字符串第一个字符为“刘”,在后面可以为任意字符或者是没有字符。因而它可以代表“刘”、“刘1”、“刘辉腾”、“刘家港”等各种字符,只要以“刘”字为开头就满足条件。

在匹配模式中,可以使用多个百分号,但连续的百分号与一个百分号是等效的。如“刘%%”与“刘%”是等效的,都表示以“刘”开头的任意文本。

百分号的位置可以是任意的,但其含义是各不相同的。如“%刘”和“刘%”以及“%刘%”代表不同的含义,分别代表以“刘”结尾的文本、以“刘”开头的文本,含有“刘”的文本。

匹配模式中可以使用多个指定的文本。如“刘%星%”,表示以“刘”开头且剩余字符中含有“星”字的文本。

疑难30 如何查询订单号第三、四位为指定文本的出库记录

SQL查询应用中,有时需要模糊匹配字符为指定数量的个数。如图2-20所示为某公司某系列产品全年的出库数据,其中订单号记录了商品代号、出库月份等信息。在订单号的前两位为商品代号,第三、第四位为出库月份,后面的字符为出库的顺序编号。如何通过SQL查询得到5月份所有的出库记录?

■ 图2-20 出库数据

解决方案

利用SQL的LIKE运算符可以进行指定数量字符的模糊匹配查询。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [出库数据$] WHERE 订单号 LIKE "__05%"

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到5月份所有的出库数据,结果如图2-21所示。

■ 图2-21 查询订单号第三、四位为“05”的数据

原理分析

※ 模糊匹配中长度为1的字符表示 ※

在LIKE运算符的匹配模式中,可以用下画线(_)表示任意字符。与百分号(%)不同的是,下画线表示长度为1的任意字符,而百分号表示任意长度的任意字符。

本例中,订单号的第三、第四位表示月份,要查找5月份的数据,就应该以“05”表示。而在月份之前的商品代号是不相同的两位字符。因而可以用下画线表示一个任意的字符,从而忽略对商品代号的匹配。而第五位开始表示顺序号,此处的匹配不考虑其长度,因而可以用百分号匹配。本例中的匹配模式可以表示为

"__05%"

这里每个下画线都代表一个长度为1的任意字符,两个下画线就表示长度为2的任意字符,这与使用两个百分号是不同的。

利用下画线和百分号组合,可以实现丰富的模式匹配字符。比如“%A_A%”可以表示文本中含有两个A且两个A之间相隔一个字符。用户可以根据自己的需求组合成任意的匹配模式。

疑难31 如何查询成绩为C以上的同学

许多学校采用5分制的成绩,这样的成绩计分通常采用A、B、C、D、E从高到低表示成绩。如图2-22所示为某学校某科目的考试成绩,如何查询此次考试中成绩为C以上(包含C)的同学,而不显示成绩为D和E的同学呢?

■ 图2-22 查询考试成绩在C(包含C)以上的同学

解决方案

利用SQL的LIKE运算符可以进行指定字符范围的模糊匹配查询。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [考试成绩$] WHERE 成绩 LIKE "[A-C]"

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可查询成绩在C(包含C)以上的所有同学。

原理分析

※ 模糊匹配中字符区间的表示 ※

在LIKE运算符的匹配模式中,可以用方括号表示某一范围的字符,其具体格式为:

[value1-value2]

其中,value1和value2分别代表指定范围的最小值和最大值。value1必须小于或等于Value2,才能得到正确的结果,当value1等于value2时,就相当于运用了等号运算符查询字段值等于value1的数据。该特性类似于BETWEEN运算符。在英文匹配模式中,value1和Value2只能是A~Z的一个字符。如:[C−Q]的表示方法是正确的,而[AC−AD]的表示方式是错误的。

在Excel SQL中,英文字符大小是按照ASCII码进行排列的:A最小,Z最大。但是英文字符的比较是不区分大小写的。因而,本例的实现也可以通过比较运算符实现,语句如下:

SELECT * FROM [考试成绩$] WHERE 成绩<= “C"

但是相对于比较运算符,LIKE的模糊匹配更灵活且适应性更广。比如,在某个英文单词列表中要查询第二个字母为“A”~“C”的所有英文单词,可以用“_[A−C]%”实现。这种查询是比较运算符不能实现的。

范围匹配还可以用于匹配指定范围以外的数据,其格式如下:

[!value1-value2]

如本例中,如果要查询成绩为C(包含C)以上的所有同学,还可以用以下SQL语句实现:

SELECT * FROM [考试成绩$] WHERE 成绩 LIKE "[!D-E]"

该语句表示成绩为D~E范围之外的数据。

注意

一个方括号范围匹配模式只能表示一个英文字符,如果要采用多个英文字符的范围匹配模式,必须使用相应个数的方括号范围匹配。

疑难32 如何查询商品代号中带有数字的商品数据

如图2-23所示,该表为某公司库存商品表,其中包含了商品代号、型号和数量等信息。在商品代号中,带有数字的代号表示特殊规格的商品,其他的表示一般规格的商品。现公司需要对所有的特殊规格商品进行统计,如何用SQL语句查询这些特殊规格的商品(即商品代号中带有数字的数据)?

■ 图2-23 库存表

解决方案

利用SQL的LIKE运算符可以进行指定数字范围的模糊匹配查询。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [库存表$] WHERE 商品代号 LIKE "%[0-9]%"

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到商品代号中带有数字的所有商品,如图2-24所示。

■ 图2-24 商品代号中带有数字的商品

原理分析

※ 模糊匹配中数字区间的表示 ※

在LIKE运算符的匹配模式中,方括号除了可以表示某一范围的英文字符,还可以表示0~9之间的数字。如[0−9]表示任意大于或等于0且小于或等于9的数字,也就代表了所有的长度为1的正整数。

本例中,要求查询所有带有数字的商品。只要带有数字,其最小长度即为1,而且其范围就是0~9,因而用[0−9]表示就可以满足要求。再结合百分号通配符组合成匹配模式,就可以表示带有数字的文本。

与英文字符范围匹配一样,在数字范围匹配时,单个方括号匹配字符只能表示长度为1的字符,若要表示多个数字范围匹配模式,就必须使用多个方括号匹配字符。如以下表达式表示30~49之间的整数:

[3-4][0-9]

在进行数字范围匹配时,除了可以匹配整数外,还可以用来匹配小数。当要匹配小数的时候,就必须指定小数点文本。如以下表达式表示0.5~0.9之间的一位小数:

0.[5-6]

利用方括号的范围匹配模式,可以组合出丰富的匹配模式。用户可以将英文范围和数字范围进行组合,以满足各种不同的需求。

范围匹配模式也有局限性,比如当要设定范围的最小值和最大值位数不统一的时候,比如0~10之间的数字时,此匹配方式就无法实现。

疑难33 如何查询姓名两端没有方括号的所有员工

如图2-25所示,该表为某公司员工名单,其中当员工姓名两端有方括号时,表示该员工已经离职。现公司要更新该员工名单,仅保留在职员工(即姓名两端没有方括号的所有员工),该如何用SQL查询实现?

■ 图2-25 员工名单

解决方案

利用SQL的LIKE运算符可以进行指定数字范围的模糊匹配查询。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT * FROM [员工名单$] WHERE 姓名 NOT LIKE "[[]%[]]"

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得姓名两端没有方括号的员工,如图2-26所示。

■ 图2-26 姓名两端没有方括号的所有员工

原理分析

※ 模糊匹配中特殊字符的表示 ※

在LIKE运算符的匹配模式中,一些特殊的字符在LIKE运算中有特殊的含义,如:方括号([])、百分号(%)、下画线(_)等。当字段值中包含这些字符时,就必须使用方括号将这些字符括起来,以表示这些字符。如本例中,要表示含有方括号,就必须在方括号两端再加上方括号,才能正确地表示字段值中的方括号,比如左方括号([])就必须在其两端再加上方括号,即“[[]”。

本例中,姓名两端带有方括号的匹配模式语句表示如下:

"[[]%[]]"

该匹配模式就表示左方括号为开头,右方括号为终止,且其中有不限字符长度的任意字符。

而本例中要求查询姓名两端没有方括号的员工。在LIKE运算符之前加上NOT即可表示不满足匹配模式的记录。因而,在本例中用以下条件表达式表示姓名两端没有方括号的员工。

姓名 NOT LIKE "[[]%[]]"

同样,当需要表示百分号、下画线等在LIKE运算符中原本就有特殊意义的字符,必须加上方括号以表示该字符为其原本的含义。