偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在SQL Server中處理空值時(shí)涉及的三個(gè)問(wèn)題

數(shù)據(jù)庫(kù) SQL Server
SQL Server是關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),SQL Server數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)市場(chǎng)上雖然不能說(shuō)是最好的,SQL Server數(shù)據(jù)庫(kù)還是占據(jù)著一定地位的,功能性是很完善的,在SQL Server數(shù)據(jù)庫(kù)中處理空值時(shí)涉及到那些問(wèn)題呢?

這篇文章主要介紹了在SQL Server中處理空值時(shí)所涉及的3個(gè)問(wèn)題:計(jì)數(shù)、使用空表值以及外鍵處理,下文將會(huì)給出詳細(xì)的分析,希望對(duì)大家能夠有所幫助。

用COUNT(*)處理空值

大多數(shù)集合函數(shù)都能在計(jì)算時(shí)消除空值;COUNT函數(shù)則屬于例外。對(duì)包含空值的一個(gè)列使用COUNT函數(shù),空值會(huì)從計(jì)算中消除。但假如COUNT函數(shù)使用一個(gè)星號(hào),它就計(jì)算所有行,而不管是否存在空值。

如果希望COUNT函數(shù)對(duì)給定列的所有行(包括空值)進(jìn)行計(jì)數(shù),請(qǐng)使用ISNULL函數(shù)。ISNULL函數(shù)會(huì)將空值替換成有效的值。

事實(shí)上,對(duì)集合函數(shù)來(lái)說(shuō),如果空值可能導(dǎo)致錯(cuò)誤結(jié)果,ISNULL函數(shù)就非常有用。記住在使用一個(gè)星號(hào)時(shí),COUNT函數(shù)會(huì)對(duì)所有行進(jìn)行計(jì)算。下例演示了空值在AVG和COUNT集合函數(shù)中的影響:

 

以下為引用的內(nèi)容:

SET NOCOUNT ON

GO

CREATE TABLE xCount

(pkey1 INT IDENTITY NOT NULL

CONSTRAINT pk_xCount PRIMARY KEY,

Col1 int NULL)

GO
INSERT xCount (Col1) VALUES (10)

GO

INSERT xCount (Col1) VALUES (15)

GO
INSERT xCount (Col1) VALUES (20)

GO

INSERT xCount (Col1) VALUES (NULL)

GO

SELECT AVG(Col1) AvgWithoutIsNullFunctionOnCol1,

AVG(ISNULL(Col1,0)) AvgWithIsNullFunctionOnCol1,

COUNT(Col1) NoIsNullFunctionOnCol1 ,

COUNT(ISNULL(Col1,0)) UsingIsNullFunctionOnCol1,

Count(*) UsingAsterisk

FROM xCount

GO

DROP TABLE xCount

GO

OUTPUT:

AvgWOIsNullFnctnCol1 AvgWIsNullFnctnCol1 WOIsNullFnctnCol1

WIsNullFnctnCol1 UsingAsterisk

15 11 3 4 4

#p#

恰當(dāng)使用空表值

SQL Server可能出現(xiàn)一種特殊情況:在引用父表的一個(gè)表中,因?yàn)椴辉试S空值,所以“聲明引用完整性”(DRI)可能不會(huì)得到強(qiáng)制。即使父表不包含空值,在子表引用了父表主鍵約束或惟一約束的列中,也可能包含空值。

假如來(lái)自父表的值目前未知,就不會(huì)有任何問(wèn)題。例如,父表可能是一個(gè)地址表,而子表可能包含聯(lián)系信息。由于許多原因,可能暫時(shí)不知道要傳給父表的聯(lián)系地址。這是一種基于時(shí)間的問(wèn)題,空值在其中或許是合適的。

如下例所示,我們創(chuàng)建父表,并在其中插入兩個(gè)值。

以下為引用的內(nèi)容:

SET NOCOUNT ON

GOCREATE TABLE Parent(pkey1 INT IDENTITY NOT NULL

CONSTRAINT pkParent PRIMARY KEY,col1 INT NULL)GOINSERT

Parent (col1) VALUES (284)GOINSERT

Parent (col1) VALUES (326)GO
 

 

以下代碼則創(chuàng)建子表,并在引用父表的列中插入一個(gè)空值。

以下為引用的內(nèi)容:

CREATE TABLE Child

(pkey1 INT IDENTITYCONSTRAINT pkChild

PRIMARY KEY,Parentpkey1 INT NULLCONSTRAINT fkChildParent

FOREIGN KEYREFERENCES Parent(pkey1),col1 INT NULL)

GOINSERT Child (Parentpkey1, col1) VALUES (null,2)GO
 

但在以下代碼中,要同時(shí)從父表和子表選擇值。雖然父表不包含空值,但在子表引用了父表的那個(gè)列中,將允許一個(gè)空值。

然后丟棄所有表,清除這個(gè)演示所用的數(shù)據(jù)庫(kù)對(duì)象。

SELECT * FROM ChildGOSELECT * FROM ParentGODROP TABLE Child, ParentGO

在可以為空的外鍵中檢查數(shù)據(jù)的有效性

如果由兩個(gè)列共同組成主鍵,而且一個(gè)子表將主鍵作為可為空值的外鍵來(lái)繼承,就可能得到錯(cuò)誤的數(shù)據(jù)。可在一個(gè)外鍵列中插入有效的值,但在另一個(gè)外鍵列中插入空值。然后,可添加一個(gè)數(shù)據(jù)表檢查約束,在可為空的外鍵中檢查數(shù)據(jù)的有效性。

任何多列外鍵都可能遇到同樣的問(wèn)題。所以,你需要添加一個(gè)檢查約束來(lái)檢測(cè)異常。最初,檢查約束將檢查構(gòu)成外鍵的所有列中可能為空的值。檢查約束還要檢查這些列中不能為空的值。如兩個(gè)檢查都通過(guò),問(wèn)題就解決了。

以下示范腳本展示了這樣的一個(gè)異常,以及如何用檢查約束來(lái)糾正它。

 

 

【編輯推薦】

  1. SQL Server數(shù)據(jù)庫(kù)占用過(guò)多內(nèi)存的解決方法
  2. SQL Server數(shù)據(jù)庫(kù)服務(wù)器高性能設(shè)置
  3. 優(yōu)化sql server數(shù)據(jù)庫(kù)的經(jīng)驗(yàn)總結(jié)
責(zé)任編輯:迎迎 來(lái)源: 賽迪網(wǎng)
相關(guān)推薦

2010-07-02 13:26:56

SQL Server處

2023-03-16 15:13:41

缺失值據(jù)集中數(shù)據(jù)分析

2009-03-06 09:42:16

性能索引

2010-04-02 10:16:17

Oracle備份

2024-01-09 15:37:46

2023-09-08 20:52:02

數(shù)字孿生測(cè)試驅(qū)動(dòng)開(kāi)發(fā)

2024-03-19 14:14:27

線程開(kāi)發(fā)

2020-07-03 07:56:34

Golang編程語(yǔ)言

2011-04-01 16:48:28

SQL Server

2011-12-20 10:41:36

程序員

2009-08-13 17:22:15

C#數(shù)據(jù)集

2010-07-06 10:25:16

SQL Server空

2009-08-06 16:24:32

C#向Sql Serv

2023-10-17 07:23:00

Vue組件代碼

2011-03-07 10:10:35

MySQL處理空值

2011-08-04 18:32:47

數(shù)據(jù)庫(kù)字典SQL Server數(shù)

2012-10-30 17:40:00

產(chǎn)品Minefold開(kāi)發(fā)

2011-11-04 09:22:37

SQL Server

2011-01-19 13:11:25

Zimbra白名單證書(shū)

2010-04-09 15:29:10

無(wú)線信號(hào)故障
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)