2.3 连接运算符
在SQL查询中,当要执行相反条件的判断或者多个条件判断时,就必须借助连接运算符来实现多个条件表达式的连接。本节通过多个实例介绍连接运算符中的&、NOT、AND、OR运算符的使用方法以及实际运用中的注意事项。
疑难34 如何对多个字段进行模糊查询
某个公司与多地公司有贸易往来,如图2-27所示,该表记录了与各地贸易往来的记录,除了对外发货外,还有其他地区向该公司的发货记录。现在需要查询所有与“河北”的交易记录,如何用SQL查询实现?
■ 图2-27 交易记录
解决方案
本例要求在所有记录中“始发地”字段和“目的地”字段两字段中任一字段值为“河北”的记录。可以利用SQL语句中的连接符号(&)将该两个字段进行连接,在连接之后,只要该值中包含有“河北”,即可断定原来的“始发地”字段和“目的地”字段中必定有一个字段值为“河北”。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM [交易记录$] WHERE 始发地&目的地 LIKE "%河北%"
单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到查询结果,如图2-28所示。
■ 图2-28 查询与河北的交易记录
原理分析
※ 连接符(&)的妙用 ※
在SQL运算符号中,连接符号(&)可以将字段进行文本的连接,比如本例中将“始发地”字段和“目的地”字段连接后,即可得到如图2-29所示的结果。
■ 图2-29 字段连接示意图
在连接后的文本中,只要“始发地”和“目的地”任意字段的值为“河北”,在连接的结果中就会包含“河北”。然后对该连接后的结果进行LIKE运算,即可找出“始发地”和“目的地”中字段值为“河北”的记录。
本例所示的方法常用于多字段的模糊查询。当要查找多个字段中含有某个值的记录时,即可采用本方法。本例的方法还可以延伸,比如要查找“始发地”为“上海”且“目的地”为“河北”的记录,则可以将两个字段连接后判断是否等于“上海河北”,如以下表达式:
SELECT * FROM [交易记录$] WHERE 始发地&目的地= "河北上海"
但本例的方法仅适用于文本字段的模糊和精确查询,而不适用于数字的比较条件查询。当要寻找“始发地”为“上海”且“数量”大于20000的记录时就不适用。
知识扩展
当要进行两个字段的连接而使用连接符号(&)时,更多情况下需要在两个字段间增加一个与字段无关的文本(如:“-”),以避免两个字段连接后产生混淆。本例中,若记录存在“始发地”为“漠河”、“目的地”为“北京”时,采用简单连接后,该记录结果就会成为“漠河北京”,其中存在“河北”文本。当采用本例的SQL语句进行查询时,就会将该记录错误地作为符合条件的记录而出现在结果中。为避免该错误的发生,一般情况下,可以在连接文本之间增加一个与字段无关的文本。如采用以下语句:
SELECT * FROM [交易记录$] WHERE 始发地&”-“&目的地= "河北-上海"
疑难35 如何查询同时满足申请租赁型经济适用房条件的人员
某市申请租赁经济适用房(简称经适房)必须满足以下四个条件:家庭人均月收入低于1000元;家庭人数为两人或两人以上;家庭人均住房面积低于7平方米;家庭具备本市常住户口且年限大于1年。如图2-30所示,如何根据上述条件查询申请记录中同时满足条件的申请人?
■ 图2-30 申请记录
解决方案
在SQL条件表达式中,可以利用逻辑连接符AND将多个条件连接实现同时满足多个条件的查询。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT 申请编号 FROM [申请记录$] WHERE 家庭年收入/家庭人数/12<1000 AND 家庭人数>=2 AND 居住面积/家庭人数<7 AND 户口年限>=1
单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到同时满足租赁型经适房条件的人员,结果如图2-31所示。
■ 图2-31 满足经适房条件的记录
原理分析
※ 同时满足多个条件的查询 ※
实质上,SQL条件表达式返回的值都是逻辑判断的结果,即逻辑值TURE和逻辑值FALSE。当条件表达式成立时,返回TURE,反之则返回FALSE。利用逻辑连接符AND可以将逻辑值进行连接运算,AND运算规律如下:
TRUE AND TRUE = TRUE FALSE AND FALSE = FALSE TRUE AND FALSE = FALSE FALSE AND TRUE = FALSE
在AND运算中,只要有一个表达式逻辑结果为FALSE,则最终结果将返回FALSE。只有当所有的表达式逻辑结果都为TRUE时,最终结果才返回TRUE。
AND运算是自左向右的运算顺序。当有多个逻辑表达式进行AND运算时,先判断最左侧的AND运算,其结果再与之后的逻辑表达式进行第二个AND运算,依次进行。当中间有一个结果为FALSE时,最终结果将返回FALSE。只有当所有的表达式都为TRUE时,最终结果才为TRUE,表示满足所有的条件。
本例中,若要同时满足四个租赁型经适房条件,就要利用三个AND运算对四个逻辑运算表达式进行运算。当四个条件都满足时,则最终结果为TRUE,表示同时满足所有的条件;当有一个表达式结果为FALSE,即有一项条件不满足时,最终将返回FALSE。
利用AND运算符可以进行同时满足多个条件记录的查询。
注意
当AND运算中某个条件为NULL值时,将会导致AND运算结果为NULL,从而导致最终查询结果与预期不一致。
疑难36 如何查询付款超过最后付款期限及尚未付款的客户
如图2-32所示,该表为某公司应收账款付款记录,最后付款期限应该为开票日期+账期。在E列的付款日期中,记录了客户的付款日期,尚未付款的客户未填写。如何利用SQL查询付款超过最后付款期限及尚未付款的客户?
■ 图2-32 应收账款付款记录
解决方案
在本例中,一共要查找两类客户,付款日期超过最后期限的和尚未付款的。只要满足这两个条件中的一个,就是要查找的记录。可以利用逻辑连接符OR将多个条件连接实现满足多个条件其中之一的查询。
操作方法
步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。
步骤2 在“命令文本”框中输入以下SQL连接语句:
SELECT * FROM [应收账款付款记录$] WHERE 付款日期>(开票日期+账期(天)) OR 付款日期 IS NULL
单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$A$1”,然后单击“确定”按钮,即可得到付款超期及尚未付款的客户,如图2-33所示。
■ 图2-33 付款超期及尚未付款的客户
原理分析
※ 满足多个条件之一的查询 ※
本例中要查找的记录包含两种情况,付款日期超过最后期限的和尚未付款的,其条件表达式分别如下:
付款日期>(开票日期+账期(天)) 付款日期 IS NULL
这两个条件中,只要满足其中之一即为要查找的记录。OR运算符可以实现条件表达式的连接。当条件表达式中有一个结果为TRUE,则最终结果为TRUE。
OR运算在许多情况下可以由其他运算符替代,如疑难34中多条件模糊查询可以用&运算符和LIKE进行查询。但在本例中,由于要进行比较运算和IS运算,因而只能采用OR运算。