MySQL

MySQL 知识量:16 - 40 - 165

4.2 组合where子句><

AND- 4.2.1 -

在现实的MySQL应用中,只用一种条件来过滤数据显然是不够的,通常查询的结果需要同时满足多项条件,这种情况下可以使用组合的where子句。

其中一种方式是使用and操作符来连接各个条件。

select * from student where age>10 and sex='male';

查询年龄大于10岁同时是男孩的学生信息。结果为:

+----+------+-----+------+
| id | name | age | sex  |
+----+------+-----+------+
|  2 | Jame |  12 | male |
|  3 | Bob  |  11 | male |
+----+------+-----+------+

每增加一个条件就可以使用and连接新添加的条件。

OR- 4.2.2 -

由or操作符连接的where子句中,只要满足任意一个条件,就将被纳入查询结果中。

select * from student where age=10 or sex='female';

查询年龄为10岁或者性别是女性的学生信息。结果为:

+----+-------+-----+--------+
| id | name  | age | sex    |
+----+-------+-----+--------+
|  1 | Susan |  11 | female |
|  4 | Robot |  10 | male   |
|  5 | Jen   |  11 | female |
|  6 | Toney |  10 | male   |
+----+-------+-----+--------+

以上结果中,任意行要么满足年龄是10岁的条件,要么满足性别是“female”的条件,要么这两项条件都满足。

IN- 4.2.3 -

in操作符用来指导条件的范围,在范围内的数据都是匹配的。

select * from student where age in (10,12);

查询年龄为10岁和12岁的学生信息。结果为:

+----+-------+-----+------+
| id | name  | age | sex  |
+----+-------+-----+------+
|  2 | Jame  |  12 | male |
|  4 | Robot |  10 | male |
|  6 | Toney |  10 | male |
+----+-------+-----+------+

in操作符后面跟一个括号,里面列出的是具体的数据范围,各数据间使用逗号隔开。

in操作符与使用or操作符完成的功能类似,但是in操作符有许多优点:

  • 当数据范围较广时,因为语法简单,in操作符更清楚和直观。

  • 范围数据更容易修改。

  • 执行更快。

  • 可以包含其他select子句,构成更复杂的查询。

NOT- 4.2.4 -

not操作符的作用是否定其后的所有条件。

select * from student where age not in (10,12);

查询年龄不是10岁和12岁的学生信息。结果为:

+----+-------+-----+--------+
| id | name  | age | sex    |
+----+-------+-----+--------+
|  1 | Susan |  11 | female |
|  3 | Bob   |  11 | male   |
|  5 | Jen   |  11 | female |
+----+-------+-----+--------+

计算次序问题- 4.2.5 -

因为SQL是结构化查询语言,因此各子句的排列顺序十分重要。如果同时使用and操作符和or操作符,and操作符的优先级更高,会优先处理and操作,这一点十分重要。

例如:查询年龄为10岁或11岁,并且是女孩的学生信息。

select * from student where age=10 or age=11 and sex='female';

结果为:

+----+-------+-----+--------+
| id | name  | age | sex    |
+----+-------+-----+--------+
|  1 | Susan |  11 | female |
|  4 | Robot |  10 | male   |
|  5 | Jen   |  11 | female |
|  6 | Toney |  10 | male   |
+----+-------+-----+--------+

这个结果不是预计的结果,因为里面出现了男孩信息。这正是由于and操作符优先于or操作符导致的,要想得到想要的结果,可以在必要的地方加上括号。

select * from student where (age=10 or age=11) and sex='female';

查询结果变为:

+----+-------+-----+--------+
| id | name  | age | sex    |
+----+-------+-----+--------+
|  1 | Susan |  11 | female |
|  5 | Jen   |  11 | female |
+----+-------+-----+--------+

这样就可以得到预计结果了。