2.2.4 组合过滤条件
如果只能使用单个过滤条件,SQL语句就无法满足复杂的查询需求,例如查找月薪超过10 000元的女性员工。为此,SQL借助于逻辑代数中的运算提供了三个逻辑运算符,可以基于多个运算符构建复杂的过滤条件。
1.逻辑与(AND)运算符
对于逻辑与运算符,只有当运算符两边的条件都为真时,才返回数据,否则查询不返回数据。例如,以下语句使用AND运算符查找月薪超过10 000元的女性员工:
查询返回的结果如下:
女性员工中只有“孙尚香”的月薪超过了10 000元。
2.逻辑或(OR)运算符
对于逻辑或运算符,只要运算符两边的条件有一个为真,就返回数据,否则查询不返回数据。例如,我们可以使用OR运算符实现2.2.1节中的IN运算符示例:
该查询同样返回了姓名为“刘备”、“关羽”或者“张飞”的员工。
对于逻辑运算符AND和OR,SQL使用短路运算(Short-Circuit Evaluation)。也就是说,只要左边的表达式能够决定最终的结果,就不计算右边的表达式。例如,以下语句不会产生除零错误:
第一个查询使用了AND运算符,由于1=0结果为假,查询肯定不会返回任何结果,也就不会计算右边的1/0。第二个查询使用了OR运算符,由于1=1结果为真,查询返回全部员工,同样不会计算右边的1/0。
提示:SQL语句的短路运算方法可以减少某些情况下的表达式计算,提高运算的效率。
3.逻辑非(NOT)运算符
逻辑非运算符与其他运算符一起使用时,表示将随后的运算结果取反:
● NOT>,查找不大于(小于或等于)指定值的数据。也可以使用NOT=、NOT<等运算符。
● NOT BETWEEN,查找位于指定范围之外的数据。
● NOT IN,查找不在指定列表之中的数据。
● NOT LIKE,查找不匹配某个模式的文本。
● NOT expr IS NULL,查找expr不为空的数据,等价于expr IS NOT NULL。
例如,以下语句查找奖金低于2000元或者高于10 000元的员工:
查询返回的结果如下:
虽然有很多员工没有奖金(bonus字段为空),但是查询并没有返回这些员工的信息,因为未知结果取反之后仍然未知。
我们还需要注意多个运算符之间的优先级问题。一般来说,比较运算符的优先级比逻辑运算符的优先级高,在逻辑运算符中NOT比AND的优先级高,AND比OR的优先级高。通常优先级高的运算符先执行,相同级别的运算符从左至右顺序执行。
我们想要知道人力资源部(dept_id=2)或者财务部(dept_id=3)中有哪些员工有奖金,如果使用以下查询语句:
返回的结果如下:
“黄忠”和“魏延”并没有奖金,不是我们期望的结果。那么问题出在哪里了呢?因为AND运算符比OR运算符的优先级高,以上查询实际返回了人力资源部(dept_id=2)的员工,以及财务部(dept_id=3)中有奖金的员工。
如果想要获得我们期望的结果,可以使用圆括号调整运算符的优先级,例如:
查询返回的结果如下:
注意:由于各种数据库的实现不同,导致运算符的优先级可能存在差异,因此我们可以通过圆括号明确指定运算符的优先级。