关于SQL语句中的AND和OR执行顺序遇到的问题
程序员文章站
2024-02-06 11:31:28
问题
昨天在写数据库sql的时候遇到一个问题。问题的根结在sql语句的and和or关键字的执行优先级问题。下面就针对这个问题进行一下测试。
场景
1、有一张学...
问题
昨天在写数据库sql的时候遇到一个问题。问题的根结在sql语句的and和or关键字的执行优先级问题。下面就针对这个问题进行一下测试。
场景
1、有一张学生表student,表字段包括id(用户主键)、name(用户名)、grade(年级)、class(班级)、sex(性别)。如下:
表结构
2、在表中导入十条测试数据,如下:
表数据
3、现需要查询出性别为女的1年级女学生,或者性别为女的2班级女学生。sql语句如下:
select * from student where sex='女' and grade=1 or class=2
但是该sql查询出来的结果并不符合要求,执行结果如下:
执行结果
执行的结果中还查询出了班级为2的男学生,显然结果是不正确的。
4、修改下sql语句,添加上括号。如下:
select * from student where sex='女' and (grade=1 or class=2)
该sql查询出来的结果符合要求
分析
从上面的场景中,问题的关键就在于and和or的执行顺序问题。
查阅资料,关系型运算符优先级高到低为:not >and >or
如果where 后面有or条件的话,则or自动会把左右的查询条件分开。
就如上面场景中的第一条语句,他的查询条件分为两部分(或):
1、sex='女' and grade=1 2、 class=2
这也就是查询出1年级的女学生,2班级的学生。不符合最初查询的要求。
那么解决办法就是使用括号区分执行的顺序
就如上面场景的第二条语句,查询条件分为两部分(并):
1、 sex='女' 2、 (grade=1 or class=2)