谓词和运算符配合使用是我们得到理想数据的最佳途径。

一、浅谈谓词

  谓词的概念:一个运算结果为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中的谓词和运算符的更多相关文章

  1. SQL SERVER中什么情况会导致索引查找变成索引扫描

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致 ...

  2. SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  3. 【转】SQL Server中关于跟踪(Trace)那点事

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  4. SQL Server中关于基数估计如何计算预估行数的一些探讨

    关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimat ...

  5. SQL Server中关于跟踪(Trace)那点事(转载)

    前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...

  6. SQL Server中SCAN 和SEEK的区别

    SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...

  7. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  8. 【转贴】SQL Server中关于跟踪(Trace)那点事

    SQL Server中关于跟踪(Trace)那点事 https://www.cnblogs.com/zhijianliutang/p/4113911.html 作者很牛B.. 前言 一提到跟踪俩字,很 ...

  9. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

随机推荐

  1. Windows 8.1 硬盘安装 Ubuntu14.04 双系统参考教程及注意事项

    硬盘安装,无需光盘.U盘:Win8.1为主,Ubuntu14.04为辅,可将Windows或Ubuntu设置为开机默认启动项:在Ubuntu下可查看.操作Windows系统下的文件:适用于安装和14. ...

  2. ArrayList的subList方法

    参考博文使用java.util.List.subList时最好小心点 List接口中定义: List<E> subList(int fromIndex, int toIndex); 英文注 ...

  3. 笔记三:python乱码深度剖析一

    一:学习内容 python编码转换 python乱码原因深入解析 二:python编码转换 1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的. ...

  4. Shell脚本编写5-----Shell 基本运算符

    算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用.expr 是一款表达式计算工具,使用它能完成表达式的求值操作.例如: 两个数相加 ...

  5. Ionic APP 热更新

    开门见山,本文主题:cordova-hot-code-push 作用:cordova热更新插件,提供了在应用程序中对基于Web的内容进行自动更新的功能. GitHub地址:https://github ...

  6. sqlserver中调用服务器中的webservice接口

    declare @ServiceUrl as varchar(1000) declare @UrlAddress varchar(500)--WebService地址:以http开头,结尾带斜杠,例如 ...

  7. ajax请求下载Execl表

    Execl表是经常要用到的存放二位数据的表格,Java也可以直接操作Execl表,经常用到的方式就是jxl和poi. 在这次项目中,我用到的poi往Execl中写数据,刚开始设计的是前端发送一个aja ...

  8. 【5】Builder模式(构建者模式)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  9. Highchar.js插件提示框千分位显示为空格而不是逗号 --(2018 08/06-08/12周总结)

    1.Oracle在已经存在主键的表中插入复合主键的SQL语句 如已有一个表test_key,其中a1列为主键. CREATE TABLE TEST_KEY( A1 VARCHAR2(3) NOT NU ...

  10. 浅谈一致性哈希(My转)

    一致性哈希(Consistent hashing)算法是由 MIT 的Karger 等人与1997年在一篇学术论文(<Consistent hashing and random trees: d ...