您的位置:首页 > 数据库

Sql Server中and和or的优先级问题

2015-09-06 21:09 225 查看

背景        

      前几天在给徒弟验收第一遍机房收费系统的时候,对于“组合查询”这一块,如果把三行查询内容输满的话,就会出错误,两行没有问题,经过第二遍验收后来和徒弟一同探讨这个问题,找到了出错的地方:一、输入查询内容的框对应数据库的字段类型全部是“String”,导致出现“2>11”这样的错误;二、对于Sql Server中and和or的优先级理解不当,徒弟一直坚持在Sql
Server中and和or的优先级相同,也就是说无论是选择and还是or,执行顺序都是从上往下,前两行做完筛选之后,再去结合第三行到数据库中做筛选,可是真的是这样的吗?

验证


     针对Student_Info表,表中字段信息如图:



     按照徒弟的思路(and和or在SqlServer中优先级相同),设计如下查询语句:

select * from Student_Info where StudentNo='1' or Sex='男'</span>
   
这样子选出来的是三条完整的记录,没有问题。

      同样照着这个思路再加上一个限制条件:

select * from Student_Info where StudentNo='1' or Sex='男' and Holder='3'
   按照徒弟的意思,这次筛选出来的记录仅仅是第三条,即“StudentNo=2”的那条,可是结果却让我们大跌眼镜,如图:

     


    此时出现了两条记录!!!,这说明“and和or在Sql Server中的优先级是不同的”。然而出现这个结果的那条Sql语句真正的逻辑关系应该是这样的:

select * from Student_Info where (StudentNo='1') or (Sex='男' and Holder='3')
   
虽然加上括号不符合规范,但是这样能够直观的说明问题,也就是说,就像我们学习模拟电路中讲的逻辑关系一样,逻辑与的优先级比逻辑或要高,但是同时低于逻辑非,知识是相通的,最近接触数据结构开始研究算法了,经历了这次师徒交流,为算法的学习打下了一点兴趣。

扩展

       除了Sql Server,对于C#、JAVA等编程语言,我拿JAVA做了测试:

public class AndOr {
public static void main(String[] args){
System.out.println(false && true ||true);
System.out.println(true || true && false);
}
}
     
输出结果如图:

                                       


         则说明,不仅仅是在Sql Server中,电路中、编程语言中都是and的优先级高于or,这对于将来算法的学习也是做了铺垫。同时,建议大家回头去想想自己做的组合查询,是不是会因为第二个逻辑判断条件的加入而导致输出错误的现象,如果有,欢迎一起交流,这块我相信这个问题绝对不是一个人的问题。

      

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: