第五课 高级数据过滤
- 5.1 组合WHERE子句
- 5.2 AND操作符
- 5.3 OR操作符
- 5.4 求值顺序
- 5.5 IN操作符
- 5.6 NOT操作符
- 小结
这一课记录了如何组合WHERE子句以建立功能更强、更高级的搜索条件,还将学习NOT和IN操作符。
5.1 组合WHERE子句
SQL允许给出多个WHERE子句,有两种使用方式,即以AND子句或OR子句的方式使用。
操作符(operator):
用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符。
5.2 AND操作符
要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。
例如:输入
SELECT prod_id,prod_name,prod_price FROM Products WHERE vend_id='1001'
AND prod_price >=4
上述语句检索由供应商1001制造且价格大于等于4美元的所有产品的名称和价格。
这条SELECT语句中的WHERE子句包含两个条件,用AND关键字联结在一起。
输出:
AND:
用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
5.3 OR操作符
OR操作符与AND操作符正好相反,它指示DBMS检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件得到满足的情况下,就不再计算第二个条件了。
例如:输入
SELECT prod_name,prod_price FROM Products WHERE vend_id='1001' OR vend_id='1002'
上述语句检索由任一指定供应商制造的所有产品的产品名和价格。OR操作符告诉DBMS匹配任一条件而不是同时匹配两个条件。
输出:
OR:
WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
5.4 求值顺序
WHERE子句可以包含任意数目的AND和OR操作符,允许两者结合以进行复杂、高级的过滤。
但是,组合AND和OR会带来一个有趣的问题
例如:输入
SELECT prod_name,prod_price FROM Products WHERE vend_id='1001'
OR vend_id='1002' AND prod_price >=10
我们需要列出价格为10美元及以上,且由供应商1001或1002制造的所有产品,但是
输出:
返回的行中有两个小于10美元,显然,这不是我们预期的结果。
为什么会这样呢?原因在于求值的顺序,SQL在处理OR操作符前,优先处理AND操作符。原因在于AND在求值过程中优先级更高,操作符被错误的组合了。
解决此问题的方法是使用圆括号对操作符进行明确分组。
例如:输入
SELECT prod_name,prod_price FROM Products WHERE (vend_id='1001' OR vend_id='1002') AND prod_price >=10
输出:
因为圆括号具有比AND或OR操作符更高的求值顺序,所以DBMS优先过滤圆括号内的OR条件。
在WHERE子句中使用圆括号:
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。
5.5 IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
IN取一组由逗号分隔,括在圆括号中的合法值。
例如:输入
SELECT prod_name,prod_price FROM Products WHERE vend_id IN('1001','1002')
上述SQL语句检索由供应商1001和1002制造的所有产品,IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。
输出:
IN操作符完成了与OR操作符相同的功能。
IN:
WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
那为什么还要使用IN操作符?其优点如下:
- 在有很多合法选项时,IN操作符的语法更清楚,更直观
- 在与其他AND和OR操作符组合使用IN时, 求值顺序更容易管理
- IN操作符一般比一组OR操作符执行得更快
- IN最大的优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句
5.6 NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件。
NOT关键字可以用在要过滤的列前,而不仅仅是在其后。
NOT:
WHERE子句中用来否定其后条件的关键字。
例如:输入
SELECT prod_name,prod_price FROM Products WHERE NOT vend_id='1001'
上述语句列出除1001之外的供应商制造的产品。
输出:
小结
这一课介绍了如何用AND和OR操作符组合成WHERE子句,还学习了如何明确地管理求值顺序,如何使用IN和NOT操作符。