为了账号安全,请及时绑定邮箱和手机立即绑定

通过逻辑操作符过滤数据

AND操作符

如果要通过不止一个列进行过滤数据,可以使用AND操作符。

Students表:

+----+----------+------+--------+-------+
| id | class_id | name | gender | score |
+----+----------+------+--------+-------+
| 1  | 1        | 小明 | M      | 90    |
| 2  | 1        | 小红 | F      | 95    |
| 3  | 1        | 小军 | M      | 88    |
| 4  | 1        | 小米 | F      | 73    |
| 5  | 2        | 小白 | F      | 81    |
| 6  | 2        | 小兵 | M      | 55    |
| 7  | 2        | 小林 | M      | 85    |
| 8  | 3        | 小新 | F      | 91    |
| 9  | 3        | 小王 | M      | 89    |
| 10 | 3        | 小丽 | F      | 88    |
+----+----------+------+--------+-------+
SELECT name,gender,score FROM Students WHERE score>80 AND gender='M';

+------+--------+-------+
| name | gender | score |
+------+--------+-------+
| 小明 | M      | 90    |
| 小军 | M      | 88    |
| 小林 | M      | 85    |
| 小王 | M      | 89    |
+------+--------+-------+

这条SQL语句检索出score大于80且gender等于M的学生,返回的数据必须满足用AND关键字联结的两个条件。
如果想增加多个过滤条件,每个条件间都要使用AND关键字。

OR操作符

与AND操作符相反,满足任一条件就可以被检索出来。
实际上,在第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来。

SELECT name,gender,score FROM Students WHERE score >= 90 OR gender = 'F';

+------+--------+-------+
| name | gender | score |
+------+--------+-------+
| 小明 | M      | 90    |
| 小红 | F      | 95    |
| 小米 | F      | 73    |
| 小白 | F      | 81    |
| 小新 | F      | 91    |
| 小丽 | F      | 88    |
+------+--------+-------+

求值顺序

WHERE子句是可以包含任意数目的AND和OR操作符,两者结合就会带来求值顺序的问题。
假如需要检索出class_id为1或3,且score大于等于90的学生:

SELECT class_id,name,gender,score FROM Students WHERE class_id = 1 OR class_id = 3 AND score >= 90;

+----------+------+--------+-------+
| class_id | name | gender | score |
+----------+------+--------+-------+
| 1        | 小明 | M      | 90    |
| 1        | 小红 | F      | 95    |
| 1        | 小军 | M      | 88    |
| 1        | 小米 | F      | 73    |
| 3        | 小新 | F      | 91    |
+----------+------+--------+-------+

由于AND比OR操作符拥有更高的优先级,因此返回的数据并未达到预期。
此问题的解决方法是通过圆括号明确求值顺序:

SELECT class_id,name,gender,score FROM Students WHERE (class_id = 1 OR class_id = 3) AND score >= 90;

+----------+------+--------+-------+
| class_id | name | gender | score |
+----------+------+--------+-------+
| 1        | 小明 | M      | 90    |
| 1        | 小红 | F      | 95    |
| 3        | 小新 | F      | 91    |
+----------+------+--------+-------+

IN操作符

IN操作符用来指定条件范围,满足范围内条件的数据都将被检索出来。
IN操作符后跟由逗号分隔的合法值,这些值必须括在圆括号中。

SELECT class_id,name FROM Students WHERE class_id IN (1,3);

+----------+------+
| class_id | name |
+----------+------+
| 1        | 小明 |
| 1        | 小红 |
| 1        | 小军 |
| 1        | 小米 |
| 3        | 小新 |
| 3        | 小王 |
| 3        | 小丽 |
+----------+------+

NOT操作符

NOT操作符有且只有一个功能,那就是否定其后跟随的任何条件。
NOT总是与其他操作符一起使用。

SELECT class_id,name FROM Students WHERE NOT class_id = 2;

+----------+------+
| class_id | name |
+----------+------+
| 1        | 小明 |
| 1        | 小红 |
| 1        | 小军 |
| 1        | 小米 |
| 3        | 小新 |
| 3        | 小王 |
| 3        | 小丽 |
+----------+------+
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
1.4万
获赞与收藏
860

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消