/*===========================<一>==========================
在SQL中邏輯表達式的值有三種: 1.TRUE 2.FALSE 3.UNKNOWNUNKNOWN邏輯值通常出現在包含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,這里需要修改成你的數據庫名。*/GOCREATE TABLE Salary( SalaryID NVARCHAR(36) NOT NULL ,EmployeeID NVARCHAR(36) ,Salary INTCONSTRAINT [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]GOALTER TABLE [dbo].[Salary] WITH NOCHECK ADD CONSTRAINT [CK_Salary] CHECK (([Salary] > 0))GOALTER TABLE [dbo].[Salary] CHECK CONSTRAINT [CK_Salary]GOALTER TABLE Salary ADD CONSTRAINT AK_Employee UNIQUE (EmployeeID);GOView Code
然后,向測試表中插入數據。
--插入正常數據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)GOINSERT INTO [Study].[dbo].[Salary] ([SalaryID] ,[EmployeeID] ,[Salary])VALUES (NEWID() ,NEWID() ,null)GOView Code
查詢一下,插入數據以后的表中的數據情況:
SELECT * FROM [Salary]View Code
表數據:
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)GOView Code
分析:
我插入-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 SalaryWHERE Salary > 4000View Code
分析:
查詢結果為兩條數據,Salary分別為5600和4800.而兩條Salary為NULL的沒有被查詢出來。 說明NULL > 4000的邏輯值(UNKNOWN)被視為FALSE.
3. GROUP BY/ORDER BY中UNKNOWN被視作TRURE;
SELECT Salary FROM SalaryGROUP BY SalarySELECT Salary FROM SalaryORDER BY Salary ASCView Code
查詢結果分別為:
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)GOView Code
執行結果,提示如下信息:
Violation of UNIQUE KEY constraint 'AK_Employee'. Cannot insert duplicate key in object 'dbo.Salary'.
分析: 則說明 NULL == NULL的邏輯值(UNKNOWN),被視作FALSE處理。===========================<End>============================
新聞熱點
疑難解答