/*==========================================================
描述: 三值逻辑--《SQL
Server
2005技术内幕》读书笔记
===========================================================*/
/*===========================<一>==========================
在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]
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处理。
*/