Sql Server中的谓词和运算符
谓词和运算符配合使用是我们得到理想数据的最佳途径。
一、浅谈谓词
谓词的概念:一个运算结果为True、False或Unknown的逻辑表达式。它的运用范围有:where子句、Having子句、Check约束、联接查询的联接条件等。
示例1,用于实施数据完整性为数据表添加约束:在员工表中,仅允许工资大于0的员工存储在表中。其中的谓词是“工资大于0”(SQL表达式:工资>0)。
示例2,用于查询筛选数据的条件:查询员工表要求只返回销售部的员工。其中谓词是“部门等于销售部”(SQL表达式:部门='销售部')。
谓词和运算符的相互使用:
1.通过逻辑运算符连接多个谓词(逻辑表达式),如使用AND和OR。
2.谓词中使用比较运算符,如某个属性值大于或小于某指定个值。
SQL Server中有一些关键字可以替代谓词语义的含义,也可以称为SQL Server中的谓词。
其中常用的包括:
1.IN,在...之内,检查一个值是否存在于指定的集合内。
2.BETWEEN,检查一个值是否在指定的区间范围内,范围包括两个边界值。
3.LIKE,判断字符串是否满足指定的格式,例如,查询名字姓氏为黄的员工(where name like '黄%')。
二、运算符
比较运算符:
| =(等于) | 等于 | 
| >(大于) | 大于 | 
| <(小于) | 小于 | 
| >=(大于或等于) | 大于或等于 | 
| <=(小于或等于) | 小于或等于 | 
| <>(不等于) | 不等于 | 
| !=(不等于) | 不等于(非 ISO 标准) | 
| !<(不小于) | 不小于(非 ISO 标准) | 
| !>(不大于) | 不大于(非 ISO 标准) | 
算术运算符:
| +(加) | 加 | 
| -(减) | 减 | 
| *(乘) | 乘 | 
| / (Divide) | 除 | 
| %(取模) | 返回一个除法运算的整数余数。 例如,12 % 5 = 2,这是因为 12 除以 5,余数为 2。 | 
逻辑运算符:
| ALL | 如果一组的比较都为 TRUE,那么就为 TRUE。 | 
| AND | 如果两个布尔表达式都为 TRUE,那么就为 TRUE。 | 
| ANY | 如果一组的比较中任何一个为 TRUE,那么就为 TRUE。 | 
| BETWEEN | 如果操作数在某个范围之内,那么就为 TRUE。 | 
| EXISTS | 如果子查询包含一些行,那么就为 TRUE。 | 
| IN | 如果操作数等于表达式列表中的一个,那么就为 TRUE。 | 
| LIKE | 如果操作数与一种模式相匹配,那么就为 TRUE。 | 
| NOT | 对任何其他布尔运算符的值取反。 | 
| OR | 如果两个布尔表达式中的一个为 TRUE,那么就为 TRUE。 | 
| SOME | 如果在一组比较中,有些为 TRUE,那么就为 TRUE。 | 
在SQL Server中运算符分为标准和非标准,如 “!=” 可用 "<>" 替代,建议使用标准的运算符。
三、关于表达式中涉及两个操作数的运算(重点)
当表达式涉及两个操作数使用算术运算符运算时,其运算结果的数据类型,根据两方面判定。
1.两个数据类型相同的数值进行运算,其结果数值的数据类型和两个操作数的数据类型一样:
例如,两个整数(int)相除生成一个整数,4/2返回整数类型2。
根据这样的一个定论,存在着一个隐患,例如用5/2的时候正常结果因为2.5,然后sql Server返回整数类型2。当然在创建表的时候可以对此类型的列设为小数类型,那就是5.0/2.0=2.5,
但就此情况非要运算,还要得到正确的结果时。可以像两个操作数进行数据类型转换,即:CAST(5 as Numeric(2,1)) / CAST(2 as Numeric(2,1))。
Numeric(2,1)数据类型的含义:数值一共占2位,其中小数占一位。
2.数值数据的精度和小数位:
精度的意思是数值中有多少位数,小数位指小数点精确到几位,小数位的位数包含在精度里,故指定数据类型的小数位必须小于小于指定的精度。
    
3.两个数据类不同的数值进行运算,其结果的数据类型为两操作数中数据类型优先级较高的数据类型:
例如,5/2.0中,5的数据类型为INT,2.0的数据类型为NUMERIC。根据SQL Server的数据类型优先级的规则。判定NUMERIC优先于INT,
则,在运算之前会把操作数5隐式地转换为5.0,得到结果就为2.5(符合其定论)。
4.SQL Server数据类型优先级顺序:
可以查阅MSDN最新的“数据类型优先级顺序”:https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017
在查阅后可以发现一个规律,就是在同一特定的范围内,数据容量大的数据类型优先级大于数据容量小的数据类型。例如int和decimal后者的精度长度大于int,
那么在运算时可以判断decimal优先级较高与int,运算结果为decimal数据类型。
四、运算符优先级
当SQL中出现复杂的表达式,那么相应就会在表达式中出现多个运算符。那么这个时候,就要依靠SQL Server中的运算符优先级规则,按顺序计算。
运算符的优先级别如下表中所示。 在较低级别的运算符之前先对较高级别的运算符进行求值。
| 级别 | 运算符 | 
|---|---|
| 1 | ()圆括号 | 
| 2 | *(乘)、/(除)、%(取模) | 
| 3 | +(正)、-(负)、+(加)、+(串联)、-(减)、&(位与)、^(位异或)、|(位或) | 
| 4 | =、>、<、>=、<=、<>、!=、!>、!<(比较运算符) | 
| 5 | NOT | 
| 6 | AND | 
| 7 | ALL、ANY、BETWEEN、IN、LIKE、OR、SOME | 
| 8 | =(赋值) | 
由于运算符数量不小,死记硬背下来要花点功夫。分析规律我们可以以类型来制定顺序,记住个大概:(圆括号)>算术运算符>比较运算符>逻辑运算符。
Sql Server中的谓词和运算符的更多相关文章
- SQL SERVER中什么情况会导致索引查找变成索引扫描
		
SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...
 - SQL Server中关于跟踪(Trace)那点事
		
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
 - 【转】SQL Server中关于跟踪(Trace)那点事
		
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
 - SQL Server中关于基数估计如何计算预估行数的一些探讨
		
关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimat ...
 - SQL Server中关于跟踪(Trace)那点事(转载)
		
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
 - SQL Server中SCAN 和SEEK的区别
		
SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...
 - c#Winform程序调用app.config文件配置数据库连接字符串  SQL Server文章目录   浅谈SQL Server中统计对于查询的影响   有关索引的DMV  SQL Server中的执行引擎入门 【译】表变量和临时表的比较  对于表列数据类型选择的一点思考  SQL Server复制入门(一)----复制简介  操作系统中的进程与线程
		
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
 - 【转贴】SQL Server中关于跟踪(Trace)那点事
		
SQL Server中关于跟踪(Trace)那点事 https://www.cnblogs.com/zhijianliutang/p/4113911.html 作者很牛B.. 前言 一提到跟踪俩字,很 ...
 - SQL Server中的高可用性(2)----文件与文件组
		
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
 
随机推荐
- linux安装tmux
			
由于tmux依赖于libevent和ncurses-devel,所以应首先有这两个库,和相关的头文件. 1.对于ncurses-devel,可用yum安装. yum install ncurses-d ...
 - 阿里云使用镜像安装freepbx
			
安装freepbx真的是历经坎坷,不过也收获了一些东西.freepbx可以通过源码安装也可以通过镜像安装.源码安装我们会在另外一篇文章中讲到,这里我们讲到的是镜像安装,在本地进行镜像安装还是比较简单的 ...
 - 01-python基础
			
前几天, 觉得python简单的不行, 没有仔细做笔记, 然后今天翻了下前几天看的东西, 还是记下来吧 对于python2.7 和 python3 , 建议使用python3 的模式编程, 然后使用p ...
 - elasticsearch插件安装之--中文分词器 ik 安装
			
/** * 系统环境: vm12 下的centos 7.2 * 当前安装版本: elasticsearch-2.4.0.tar.gz */ ElasticSearch中内置了许多分词器, standa ...
 - Linux-(vmstat,iostat,netstat)
			
vmstat命令 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无 ...
 - nginx 学习笔记(4) Connection处理方法
			
nginx支持connection的多种处理方法.nginx运行的平台确定了可用的处理方法. 在特定平台下connection的多种处理方法中,nginx会自动选择一种最有效的方法.然而,如果需要,你 ...
 - bootstrap table分页,重新数据查询时页码为当前页问题
			
问题描述: 使用bootstrap table时遇到一个小问题,第一次查询数据未5页,翻页到第5页后,选中条件再次查询数据时,传到后端页码仍旧为5,而此时数据量小于5页,表格显示为未查询到数据. 处理 ...
 - 4.1 SQL的本质
			
对于早期的关系数据库,整个行业做了很多努力,试图统一不同的专用查询语言.IBM曾建立了一个早期的标准,被称为Structured English Query Language,这个名字缩写为SEQUE ...
 - Dev中控件的js事件代码放在form标签中存在问题
			
Dev中控件的js事件代码放在form标签中会获取不到(head标签中有其他js代码,未验证是否是这个问题)
 - 新增的input
			
原有的input类型: input标签原有的type类型: text(普通文本框,默认字) button(普通按钮) password(密码框) submit(提交按钮) radio(单选框) r ...