SQL 知识量:22 - 44 - 129
除了使用单个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操作符用于表示查询匹配任一给定条件的行,其实,许多的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和性别男性任意一个条件,都是成功匹配的。
有一个问题:如果同时使用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操作符时,一定要使用括号进行明确分组,不要过分依赖默认计算顺序,括号的使用可以消除歧义,避免错误并便于阅读。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6