WHERE高级搜索和NOT、IN操作符

组合WHERE子句

为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。
有2种方式

  • AND子句
  • OR子句

操作符(operator)

用来联结或改变WHERE子句中的子句关键字。也称为逻辑操作符

AND操作符

给WHERE子句添加附加条件,指示DBMS只返回满足所有给定的条件行

SELECT
	prod_id,
	prod_price,
	prod_name 
FROM
	products 
WHERE
	vend_id = 1003 
	AND prod_price <= 10;

image.png
检索由供应商1003制造且价格小于等于10美元

OR操作符

指示DBMS检索匹配任一条件的行

SELECT
	prod_id,
	prod_price,
	prod_name 
FROM
	products 
WHERE
	vend_id = 1003 
	OR vend_id = 1002;

image.png

计算次序

WHERE可以包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤
SQL在处理OR操作符之前,会优先处理AND操作符,解决此问题的办法是使用圆括号明确地分组相应的操作符

SELECT
	prod_name,
	prod_price 
FROM
	products 
WHERE
	( vend_id = 1002 OR vend_id = 1003 ) 
	AND prod_price >= 10;

image.png
如果不使用括号,则结果和预期完全不同
image.png

在WHERE子句中使用圆括号

因为圆括号具有较AND和OR操作符高的计算次序。任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组,能够确保按照预期结果运行,消除歧义

IN操作符

指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都在圆括号中。

SELECT
	prod_name,
	prod_price 
FROM
	products 
WHERE
	vend_id IN ( 1002, 1003 ) 
ORDER BY
	prod_name;

其等价于

SELECT
	prod_name,
	prod_price 
FROM
	products 
WHERE
	vend_id = 1002 
	OR vend_id = 1003 
ORDER BY
	prod_name;

image.png

为什么要使用IN操作符

  • IN操作符语法更清楚且更直观
  • IN操作符计算的次序更容易管理(使用的操作符更少)
  • IN操作符一般比OR操作符执行更快
  • IN操作符最大优点是可以包含其他SELECT语句,更动态地建立WHERE子句

NOT操作符

NOT操作符有且仅有一个功能,否定NOT之后所根的任何条件

SELECT
	prod_name,
	prod_price 
FROM
	products 
WHERE
	vend_id NOT IN ( 1002, 1003 ) 
ORDER BY
	prod_name;

image.png
检索1002和1003之外的所有供应商制造的产品

为什么使用NOT

简单的WHERE子句中,NOT没有什么优点,但是在复杂子句中,NOT是非常有用的

MySQL中的NOT

MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反


这个家伙很懒,啥也没有留下😋