Transact-SQL三值逻辑
/*===========================<一>==========================
在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三值逻辑的更多相关文章
- T-SQL、JET SQL、PL-SQL
数据库分为网状.层状.关系.对象四种类型,目前的数据库一般都是属于关系数据库(包括MYSQL和SQL SERVER),网状.层状基本上已成历史,对象类型尚未普及. SQL 语言是有 ANSI 标准的. ...
- SQL SERVER 简介及应用 - 数据库系统原理
SQL SERVER 是一个分布式的关系型数据库管理系统(RDBMS),具有客户 - 服务器体系结构,一般发行的版本有企业版.标准版.个人版.开发版. SQL SERVER 提供的服务 MS SQL ...
- SQL Server中的锁 详解 nolock,rowlock,tablock,xlock,paglock
摘自: http://www.myexception.cn/sql-server/385562.html 高手进 锁 nolock,rowlock,tablock,xlock,paglock 锁 no ...
- SQL SERVER CURSOR游标的使用(转载)
一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...
- SQL Server数据库学习总结
经过一段时间的学习,也对数据库有了一些认识,数据库基本是由表,关系,操作组成:对于初学者首先要学的 一图胜“十”言:SQL Server 数据库总结 一个大概的总结 经过一段时间的学习,也对数 ...
- SQL Server自定义函数( 转载于51CTO )
用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...
- SQL Server DML(UPDATE、INSERT、DELETE)常见用法(一)
1.引言 T-SQL(Transact Structured Query Language)是标准的SQL的扩展,是程序和SQL Server沟通的主要语言. T-SQL语言主要由以下几部分组成: 数 ...
- 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML
在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...
- Python和SQL 2017的强大功能
Python和SQL Server 2017的强大功能 原文来自:https://www.red-gate.com/simple-talk/sql/sql-development/power-py ...
- Linux 上的 SQL Server 2017 的安装指南
一:介绍背景 微软在2016年 3 月首次对外宣布了 Linux 版的 SQL Server,并于2017年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会 ...
随机推荐
- mysql基础知识(4)--修改
修改表: 一般概述 通常,创建一个表,能搞定(做到)的事情,修改表也能做到.大体来说,就可以做到: 增删改字段: 增:alter table 表名 add [column] 字段名 字段类 ...
- 在Windows Server2008R2中导入Excel不能使用Jet 4.0的解决方法
一直使用以下代码从Excel中取数据,速度快方便: string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Dat ...
- SQL获取变量类型以及变量最大长度
DECLARE @Temp nvarchar(1050)='' SELECT CAST(SQL_VARIANT_PROPERTY(@Temp, 'BaseType') AS VARCHAR(50))S ...
- excel分组求和
=SUMPRODUCT((C2:C99=F2)*(B2:B99)) 说明: C2:C99=F2 找到C2到C99之间的等于F2的值 如果有多个判断条件,采用*来管理 B2:B99 求和
- 缓存需要注意的问题以及使用.net正则替换字符串的方法
参考资料:http://www.infoq.com/cn/news/2015/09/cache-problems 正则替换字符串的简单方法: var regTableType = new Regex( ...
- JQ避免出现多次执行一个事件的解决方案
点击按钮之后会多次执行一个事件的话,就在方法结尾加入如下代码,这样的话事件就可以只执行一次了 //避免出现多次执行事件的问题 event.stopPropagation(); 此外,时间的重复绑定也有 ...
- 51Nod 1201 整数划分 (经典dp)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题意不多说了. dp[i][j]表示i这个数划分成j个数 ...
- C#.NET 消息机制
一.消息概述 众人周知,window系统是一个消息驱动的系统, windows操作系统本身有自己的消息队列,消息循环,它捕捉键盘,鼠标的动作生成消息,并将这个消息传给应用程序的消息队列. 余下的工作有 ...
- Unity3d:播放物理目录下的MP3文件
u3d里,是支持播放MP3文件的,但要放到资源里,不支持播放物理目录下的MP3文件.由于界面上无需显示,只是当作背景音乐来播放,所以想到调用c#的组件来解决此问题.主要代码都在附件中,根据需要加到自己 ...
- C++成员变量、构造函数的初始化顺序 [转]
C++成员变量.构造函数的初始化顺序 一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静 ...