SQL

SQL 知识量:22 - 44 - 129

5.1 组合where子句><

AND操作符- 5.1.1 -

除了使用单个where子句过滤数据外,还可以使用多个where子句进行更复杂的查询,每个子句间使用AND操作符或OR操作符进行分隔。

and操作符用于指示查询满足所有给定条件的行。

例如:查询年龄是11岁的男孩信息。

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

查询结果:

+----+--------+-----+------+
| id | name   | age | sex  |
+----+--------+-----+------+
|  3 | Bob    |  11 | male |
|  9 | Bonnie |  11 | male |
+----+--------+-----+------+

以上查询中,使用and操作符来连接age和sex条件,表示查询的行需要同时满足这两个条件。

除了设置2个where子句外,还可以设置3个以上及更多的where子句。例如:查询年龄是11岁、id值小于8的男孩信息。

select * from student where age=11 and sex='male' and id<8;

查询结果:

+----+------+-----+------+
| id | name | age | sex  |
+----+------+-----+------+
|  3 | Bob  |  11 | male |
+----+------+-----+------+

OR操作符- 5.1.2 -

or操作符用于表示查询匹配任一给定条件的行,其实,许多的DBMS在第一个where子句满足条件时,就不会再计算后面的where子句是否满足条件。

例如:查询年龄为11岁的学生或性别是男性的学生信息,按照性别升序排序。

select * from student where age=11 or sex='male' order by sex;

查询结果:

+----+--------+-----+--------+
| id | name   | age | sex    |
+----+--------+-----+--------+
|  1 | Susan  |  11 | female |
|  5 | Jen    |  11 | female |
|  2 | Jame   |  12 | male   |
|  3 | Bob    |  11 | male   |
|  4 | Robot  |  10 | male   |
|  6 | Toney  |  10 | male   |
|  7 | Jack   |  13 | male   |
|  9 | Bonnie |  11 | male   |
+----+--------+-----+--------+

只要满足年龄11和性别男性任意一个条件,都是成功匹配的。

优先级- 5.1.3 -

有一个问题:如果同时使用and和or会怎样,DBMS会先计算哪个?其实,SQL与多数编程语言一样,在处理or操作符之前,会优先处理and操作符,也就是说and的优先级比or更高。

例如下面的SQL语句:查询id值小于3或者大于8的男生信息。

select * from student where id<3 or id>8 and sex='male';

查询结果:

+----+--------+-----+--------+
| id | name   | age | sex    |
+----+--------+-----+--------+
|  1 | Susan  |  11 | female |
|  2 | Jame   |  12 | male   |
|  9 | Bonnie |  11 | male   |
+----+--------+-----+--------+

结果让人有些意外,女生的信息也被查询出来了,显然DBMS先计算了and条件,后计算了or条件。

如果想要得到预期的结果,需要修改一下SQL代码:

select * from student where (id<3 or id>8) and sex='male';

查询结果:

+----+--------+-----+------+
| id | name   | age | sex  |
+----+--------+-----+------+
|  2 | Jame   |  12 | male |
|  9 | Bonnie |  11 | male |
+----+--------+-----+------+

需要注意的是,当同时使用and和or操作符时,一定要使用括号进行明确分组,不要过分依赖默认计算顺序,括号的使用可以消除歧义,避免错误并便于阅读。