本章讲授如何组合WHERE子句以建立功能更强的更高级的搜索条件,我们还将学习如何使用NOT和IN操作符

7.1组合WHERE子句

上一章所介绍的所有WHERE子句在过滤数据的时候使用的都是单一的条件。为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或者OR子句的方式使用。
这些用来连接或者改变WHERE子句的关键字,被称为逻辑操作符。

7.1.1 AND操作符

为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加条件,下面的代码给出了一个例子。

SELECT 
	e.`ename`,e.`id`,e.`salary`,e.`bonus`
FROM
	emp e
WHERE 
	e.`salary`>10000 AND e.`bonus`>0
;

mysql 过滤空字符串或者特殊符号 mysql过滤空数据_MySQL数据过滤


此SQL语句检索所有salary大于10000并且bunos大于0的人。这条SELECT语句的WHERE子句包含两个条件,并且用AND关键字连接他们。AND只是DBMS只返回满足给定条件的行。

OR操作符

OR操作符与AND操作符不同,它指示MySQL检索匹配任何一个条件的行。

SELECT 
	e.`ename`,e.`id`,e.`salary`,e.`bonus`
FROM
	emp e
WHERE 
	e.`salary`>10000 OR e.`bonus`>0
;

mysql 过滤空字符串或者特殊符号 mysql过滤空数据_MySQL_02


OR告诉DBMS匹配任一条件。

计算次序

那么问题来了,如果WHERE子句即包含AND又包含OR,那么二者的逻辑运算次序怎么定义呢?
假如需要列出salary大于25000或者小于20000中bonus不为0的,怎么办呢?

SELECT 
	e.`ename`,e.`id`,e.`salary`,e.`bonus`
FROM
	emp e
WHERE 
	(e.`salary`<20000 OR e.`salary`>25000) AND e.`bonus`>0
;

mysql 过滤空字符串或者特殊符号 mysql过滤空数据_MySQL_03


对于所有语言的这种次序问题,不需要死记硬背,只需要恰当的使用()就好了。把你想要先运算的用()包起来。

7.2 IN操作符

圆括号在WHERE子句中还有另一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的有逗号分隔的骑龟蛋,全部都在括号中,下面说明。

SELECT 
	e.`ename`,e.`id`,e.`salary`,e.`bonus`
FROM
	emp e
WHERE 
	e.`id` IN (1001,1003,10060)
;

mysql 过滤空字符串或者特殊符号 mysql过滤空数据_MySQL数据过滤_04


在这里id在(1001,1003,10060)符合任意一个的都可以列出,因为没有10060的,所以只是列出了两个。

那么为什么用IN不用OR呢?因为IN更快

7.3NOT操作符

WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
比如同样刚才的例子

SELECT 
	e.`ename`,e.`id`,e.`salary`,e.`bonus`
FROM
	emp e
WHERE 
	e.`id` IN (1001,1003)
;

现在改成:

SELECT 
	e.`ename`,e.`id`,e.`salary`,e.`bonus`
FROM
	emp e
WHERE 
	e.`id` NOT IN (1001,1003)
;

mysql 过滤空字符串或者特殊符号 mysql过滤空数据_操作符_05


在于IN联合使用的时候,找出不匹配列表中的record是很容易的。

也可以和BETWEEN联合使用。