MySQL WHERE数据过滤
在MySQL检索数据时,我们总是需要让被检索的数据满足各种各样的条件,在MySQL中,通过关键字 WHERE来对数据进行过滤。
下面还以该表做例
name | city | age | zip | |
---|---|---|---|---|
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
例如想要查找年龄小于30岁的所有人员的信息
SELECT *
FROM exampletable
WHERE age<30;
得出结果:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
AND、OR与其计算次序
1.AND,OR操作符
and与or在MySQL中的涵义与计算机其他分支中的涵义相同,具体内容可以参考文章 数字逻辑电路,逻辑运算与或非
以前面文章的表exampletable为例,
如果需要查找身处北京,且年龄小于等于20岁的人那么,可以用到操作符 AND,即满足所有条件即为真,满足一条或全部不满足即为假
AND左右两边条件同时满足后,语句为真。也就是要查找 city=‘BJ’ 同时age<=20 条件成立的数据才符合要求。
SELECT *
FROM exampletable
WHERE city='BJ' AND age<=20;
得出结果:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
那么如果想让输入的条件满足一条即可成立,那么会使用到OR操作符,即满足一条或两条全部满足即为真,全部不满足即为假
如果当前有需求需要查找city='BD’或者city='BJ’的人员信息
SELECT *
FROM exampletable
WHERE city='BD' OR city='BJ';
得出结果:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
2.AND/OR的计算次序
在条件想对简单的需求下,可能仅仅需要单独使用AND或者OR即可,但是在复杂条件下,可能需要多个条件的过滤语句。
比如:查找年龄小于等于20且身处BJ或SJZ的人员信息
如果我们这样写:
SELECT *
FROM exampletable
WHERE age<=20 AND city='BJ' OR city='SJZ';
看起来好像没什么问题,我们预计的结果是只有
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
符合上述条件,因为在表中没有身处SJZ且年龄小于等于20岁的人员
但是我们运行了代码发现结果和预想中的不一致:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
最后结果发现45岁的smith也被检索出来了
这是因为AND的优先级比OR要高,这就导致上述代码下,优先计算了年龄小于等20并且city是bj的人员,然后又将得出的结果与city是SJZ的人员信息做或运算,将满足一条或者同时满足的人员信息全部输出出来
那么这个问题要如何规避呢?那就是通过()来确定优先级,最内层的括号内的操作符运算次序最高
现在增加()后
SELECT *
FROM exampletable
WHERE age<=20 AND (city='BJ' OR city='SJZ');
得出正确的计算结果:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
IN NOT 操作符
1.IN操作符
IN操作符在WHERE语句下用于规定条件范围,当满足条件范围时,数据符合条件。此条件范围不是指20-40的区间段范围,是指符合括号内所描述的条件即可,本质上与OR操作符功能相同
需求:找出在表中,城市为BJ,TJ,SJZ的人员信息
SELECT *
FROM exampletable
WHERE city IN ('BJ','TJ','SJZ');
得出结果:
name | city | age | zip | |
---|---|---|---|---|
joe | BJ | 20 | 102102 | 4xxxx@163.com |
mike | TJ | 18 | 112165 | 5xxxx@163.com |
smith | SJZ | 45 | 132123 | 2xxxx@163.com |
szq | BJ | 23 | 110223 | 6xxxx@163.com |
使用OR也可以达到同样的效果
SELECT *
FROM exampletable
WHERE city='BJ'OR city='TJ'OR city='SJZ';
虽然OR可以达到同样的效果,但是相比之下,IN操作符有着以下优点:
1.语法清晰直观 2.语序易管理 3.运行速度更快
2.NOT操作符
not可以为非,即取反。
例如上述需求做改动,找出在表中,城市不在BJ,TJ,SJZ的人员信息
SELECT *
FROM exampletable
WHERE city NOT IN ('BJ','TJ','SJZ');
得出结果:
name | city | age | zip | |
---|---|---|---|---|
ergou | HRB | 39 | 110120 | 3xxxx@163.com |
john | BD | 14 | 154143 | 1xxxx@163.com |
注:MySQL中NOT目前仅支持对IN,BETWEEN和EXISTS子句取反,其他的均不支持