Sql Server中and和or的优先级问题
背景
前几天在给徒弟验收第一遍机房收费系统的时候,对于“组合查询”这一块,如果把三行查询内容输满的话,就会出错误,两行没有问题,经过第二遍验收后来和徒弟一同探讨这个问题,找到了出错的地方:一、输入查询内容的框对应数据库的字段类型全部是“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,这对于将来算法的学习也是做了铺垫。同时,建议大家回头去想想自己做的组合查询,是不是会因为第二个逻辑判断条件的加入而导致输出错误的现象,如果有,欢迎一起交流,这块我相信这个问题绝对不是一个人的问题。
Sql Server中and和or的优先级问题相关推荐
- SQL Server中的锁类型及用法(转载)
一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 ...
- 深入浅出SQL Server中的死锁
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...
- Microsoft SQL Server中的事务(转载)
1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一组语句要么全部成功,对数据库中的某些数据成功修改; 要么全部不成功,数据 ...
- SQL Server 中关于EXCEPT和INTERSECT的使用方法
熟练使用SQL Server中的各种使用方法会给查询带来非常多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本号支持. EXCEPT是指在第 ...
- sql server作业_在SQL Server中报告作业失败并发出警报
sql server作业 SQL Server Agent can be used to run a wide variety of tasks within SQL Server. The buil ...
- 透明加密tde_如何在SQL Server中监视和管理透明数据加密(TDE)
透明加密tde Transparent Data Encryption (TDE) was originally introduced in SQL Server 2008 (Enterprise E ...
- 如何在SQL Server中处理过多的SOS_SCHEDULER_YIELD等待类型值
The SQL Server SOS_SCHEDULER_YIELD is a fairly common wait type and it could indicate one of two thi ...
- SQL Server 中关于EXCEPT和INTERSECT的用法
熟练使用SQL Server中的各种用法会给查询带来很多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本支持. EXCEPT是指在第一个集合 ...
- SQL Server中的数字,浮点数和小数之间的差异
本文翻译自:Difference between numeric, float and decimal in SQL Server I searched in Google and also visi ...
最新文章
- mysql crm动态列设计_值得收藏:一份非常完整、详细的MySQL规范
- Linux下编译build的命令,Linux命令行下编译Android NDK的示例代码
- 小小base标签在web开发中的大作用
- count(*),count(1),count(0)效率
- 如何快速处理线上故障【转】
- Java 文件操作-RandomAccessFile
- Open Flash Chart 图表组件
- 最简单的基于DirectShow的示例:获取Filter信息
- 网站api自己怎么写_网站建设及推广网站关键词优化自己怎么做网站推广
- Hadoop开发环境搭建
- 软考高级 真题 2017年上半年 信息系统项目管理师 综合知识
- python 计算gdp_菜鸟笔记Python3——数据可视化(三)世界GDP分析
- kindle中html笔记,大神教你用Kindle做笔记,事半功倍的方法来了!
- 数据库基础及常用SQL语句
- 人脸识别最低像素_深入浅出人脸识别技术
- 一年省一,两年国集,高二斩获世界金牌,他有哪些经验值得借鉴?
- Eclipse的快捷键设置及使用
- 【5G NR】CSI-RS
- 用PhoneGap开发移动程序
- 腾讯云安装部署Linux保姆教程