/*===========================<一>==========================

在SQL中逻辑表达式的值有三种:
  1.TRUE
  2.FALSE
  3.UNKNOWN

UNKNOWN逻辑值通常出现在包含NULL的逻辑表达式中,例如:
  1. NULL > 0
  2. NULL = NULL
  3. 1 + NULL = X

============================<二>==========================

1. 在所有的查询筛选器中【ON、WHERE、HAVING】,都把UNKNOWN当
做FALSE处理;
2. 在CHECK约束中UNKNOWN的值被当做TRUE处理;
3. 在UNIQUE约束、排序操作、分组操作UNKNOWN的值被当做TRUE处理;

============================<三>==========================*/

首先,你的测试数据库中创建测试表,脚本如下:

USE Study --/*我的测试数据库是Study,这里需要修改成你的数据库名。*/
GO CREATE TABLE Salary(
SalaryID NVARCHAR(36) NOT NULL
,EmployeeID NVARCHAR(36)
,Salary INT
CONSTRAINT [PK_Salary] PRIMARY KEY CLUSTERED
(
[SalaryID] ASC
)
WITH (PAD_INDEX = OFF
, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO ALTER TABLE [dbo].[Salary] WITH NOCHECK ADD CONSTRAINT [CK_Salary] CHECK (([Salary] > 0))
GO ALTER TABLE [dbo].[Salary] CHECK CONSTRAINT [CK_Salary]
GO ALTER TABLE Salary ADD CONSTRAINT AK_Employee UNIQUE (EmployeeID);
GO

然后,向测试表中插入数据。

--插入正常数据
INSERT INTO [Study].[dbo].[Salary]
([SalaryID]
,[EmployeeID]
,[Salary])
VALUES
(NEWID()
,NEWID()
,4800)
GO --插入EmployeeID为NULL的值
INSERT INTO [Study].[dbo].[Salary]
([SalaryID]
,[EmployeeID]
,[Salary])
VALUES
(NEWID()
,null
,5600)
GO --插入两条SALARY为NULL的值
INSERT INTO [Study].[dbo].[Salary]
([SalaryID]
,[EmployeeID]
,[Salary])
VALUES
(NEWID()
,NEWID()
,null)
GO INSERT INTO [Study].[dbo].[Salary]
([SalaryID]
,[EmployeeID]
,[Salary])
VALUES
(NEWID()
,NEWID()
,null)
GO

查询一下,插入数据以后的表中的数据情况:

SELECT * FROM [Salary]

表数据:

SalaryID EmployeeID  Salary
2D5E8F91-8312-4FA4-BF0C-2643E688555D NULL 5600
6A22894A-9D7B-4964-9E1B-EF1307D86AFA 70AD8361-B392-41A3-B30F-6F1B04281808 NULL
B6D65637-D65E-4E62-BD15-741BD1F8F8C0 CAA18E7E-A792-45B8-82CE-80F719359F62 NULL
F0FDEA1F-1814-406C-A91C-146751B6BD92 2BA81F41-B9BC-4F2A-ABAA-662D1B1ED032 4800

1. 验证Check约束,建表时我加了Salary的Check约束,Salary > 0;

INSERT INTO [Study].[dbo].[Salary]
([SalaryID]
,[EmployeeID]
,[Salary])
VALUES
(NEWID()
,NEWID()
,-1000)
GO

分析

  我插入-1000时有如下消息提示(说明我的约束是起作用的):

  The INSERT statement conflicted with the CHECK constraint "CK_Salary".
  The conflict occurred in database "Study", table "dbo.Salary", column 'Salary'.

  前面我已经插入了两条Salary为NULL的记录,说明在Check约束中NULL > 0的逻辑值(UNKNOWN)
  是被视为TRURE值。

2. 在查询筛选器中,UNKNOWN被视作FALSE;

SELECT * FROM Salary
WHERE Salary > 4000

分析

  查询结果为两条数据,Salary分别为5600和4800.而两条Salary为NULL的没有被查询出来。
  说明NULL > 4000的逻辑值(UNKNOWN)被视为FALSE.

3. GROUP BY/ORDER BY中UNKNOWN被视作TRURE;

SELECT Salary FROM Salary
GROUP BY Salary SELECT Salary FROM Salary
ORDER BY Salary ASC

查询结果分别为:

1.分组查询

Salary
NULL
4800
5600

2.排序查询

Salary
NULL
NULL
4800
5600

分析
  根据以下查询结果我们可以分析出:NULL == NULL的逻辑值(UNKNOWN),被视作TURE处理。

4. UNIQUE约束中,UNKNOWN被视作FALSE;EmployeeID已经加了UNIQUE约束,前面我已经

  插入了一条EmployeeID为NULL的值,下面我再插入一条EmployeeID为NULL的值的记录:

INSERT INTO [Study].[dbo].[Salary]
([SalaryID]
,[EmployeeID]
,[Salary])
VALUES
(NEWID()
,null
,5600)
GO

执行结果,提示如下信息:

Violation of UNIQUE KEY constraint 'AK_Employee'.
    Cannot insert duplicate key in object 'dbo.Salary'.

分析
  则说明 NULL == NULL的逻辑值(UNKNOWN),被视作FALSE处理。
===========================<End>============================

Transact-SQL三值逻辑的更多相关文章

  1. T-SQL、JET SQL、PL-SQL

    数据库分为网状.层状.关系.对象四种类型,目前的数据库一般都是属于关系数据库(包括MYSQL和SQL SERVER),网状.层状基本上已成历史,对象类型尚未普及. SQL 语言是有 ANSI 标准的. ...

  2. SQL SERVER 简介及应用 - 数据库系统原理

    SQL SERVER 是一个分布式的关系型数据库管理系统(RDBMS),具有客户 - 服务器体系结构,一般发行的版本有企业版.标准版.个人版.开发版. SQL SERVER 提供的服务 MS SQL ...

  3. SQL Server中的锁 详解 nolock,rowlock,tablock,xlock,paglock

    摘自: http://www.myexception.cn/sql-server/385562.html 高手进 锁 nolock,rowlock,tablock,xlock,paglock 锁 no ...

  4. SQL SERVER CURSOR游标的使用(转载)

    一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...

  5. SQL Server数据库学习总结

    经过一段时间的学习,也对数据库有了一些认识,数据库基本是由表,关系,操作组成:对于初学者首先要学的     一图胜“十”言:SQL Server 数据库总结 一个大概的总结 经过一段时间的学习,也对数 ...

  6. SQL Server自定义函数( 转载于51CTO )

    用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...

  7. SQL Server DML(UPDATE、INSERT、DELETE)常见用法(一)

    1.引言 T-SQL(Transact Structured Query Language)是标准的SQL的扩展,是程序和SQL Server沟通的主要语言. T-SQL语言主要由以下几部分组成: 数 ...

  8. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML

    在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...

  9. Python和SQL 2017的强大功能

    Python和SQL Server 2017的强大功能   原文来自:https://www.red-gate.com/simple-talk/sql/sql-development/power-py ...

  10. Linux 上的 SQL Server 2017 的安装指南

    一:介绍背景 微软在2016年 3 月首次对外宣布了 Linux 版的 SQL Server,并于2017年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会 ...

随机推荐

  1. Cocos2d-JS v3.0 alpha 导入 cocostudio的ui配置

    1.在新项目的根文件夹下打开project.json文件,修改: "modules" : ["cocos2d", "extensions", ...

  2. cocos中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)

    CCLabelTTF CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OPENGL 纹理将会被创建..这意味着setString 和创建一个新的标签一样慢. 这个类使 ...

  3. C++11用于元编程的类别属性

    [C++11用于元编程的类别属性] 许多算法能作用在不同的数据类别; C++ 模板支持泛型,这使得代码能更紧凑和有用.然而,算法经常会需要目前作用的数据类别的信息.这种信息可以通过类别属性 (type ...

  4. javascript日期格式化方法汇总

    本文给大家汇总介绍了javascript格式化日期时间的几种常用方法,个人对最后一种个性化输出时间比较有兴趣,基本上只要项目中能用到都是使用这种,推荐给小伙伴们. 方法一: ? 1 2 3 4 5 6 ...

  5. 【LeetCode】 Subsets

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  6. HDU 4667 Building Fence

    题意: 给n个圆和m个三角形,且保证互不相交,用一个篱笆把他们围起来,求最短的周长是多少. 做法:--水过... 把一个圆均匀的切割成500个点,然后求凸包. 注意:求完凸包,在求周长的时候记得要把圆 ...

  7. HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. HDU 5443 The Water Problem (水题,暴力)

    题意:给定 n 个数,然后有 q 个询问,问你每个区间的最大值. 析:数据很小,直接暴力即可,不会超时,也可以用RMQ算法. 代码如下: #include <cstdio> #includ ...

  9. js判断滚动方向

     //页面滚动监听事件     window.onscroll = function (e) {                scrollFunc();         $("#t&quo ...

  10. OC: NSString、NSArray、NSNumber

    数组参考: 参考1  参考2  参考3 //字符串 //1.获取字符串的长度: //表情符号最少占两个字节 NSString * s = @"中文字符串