第五课 高级数据过滤

  • 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关键字联结在一起。

输出:

pymysql where 多个_操作符

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匹配任一条件而不是同时匹配两个条件。

输出:

pymysql where 多个_操作符_02

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制造的所有产品,但是

输出:

pymysql where 多个_pymysql where 多个_03


返回的行中有两个小于10美元,显然,这不是我们预期的结果。

为什么会这样呢?原因在于求值的顺序,SQL在处理OR操作符前,优先处理AND操作符。原因在于AND在求值过程中优先级更高,操作符被错误的组合了。
解决此问题的方法是使用圆括号对操作符进行明确分组。

例如:输入

SELECT prod_name,prod_price FROM Products WHERE (vend_id='1001' OR vend_id='1002') AND prod_price >=10

输出:

pymysql where 多个_sql_04


因为圆括号具有比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操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。

输出:

pymysql where 多个_pymysql where 多个_05


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之外的供应商制造的产品。

输出:

pymysql where 多个_操作符_06

小结

  这一课介绍了如何用AND和OR操作符组合成WHERE子句,还学习了如何明确地管理求值顺序,如何使用IN和NOT操作符。