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 | 小丽 |
+----------+------+