?
?????? 寫此系列文章緣由 : 做開發(fā)三年來(B/S),發(fā)現(xiàn)基于web 架構(gòu)的項(xiàng)目技術(shù)主要分兩大方面:?
????????? 第一:C#,它是程序的基礎(chǔ),也可是其它開發(fā)語言,沒有開發(fā)語言也就不存在應(yīng)用程序.
????????? 第二:數(shù)據(jù)庫,現(xiàn)在是信息化世界,大多數(shù)信息都可以通過數(shù)據(jù)庫存儲(chǔ)來交換信息.常與應(yīng)用程序互相交流信息.
?
???????? 但在SQL開發(fā)應(yīng)用時(shí),我們往往只觀注些常用的方法(insert delete select update),對(duì)些 小細(xì)節(jié)方面 ( 系統(tǒng)存儲(chǔ)過程,函數(shù)的應(yīng)用,優(yōu)化分析 )研究的并不多或者是知其一不知其二,所以本人想把在學(xué)習(xí)工作當(dāng)中遇到的問題總結(jié)些,希望還沒有重視這些方面的朋友會(huì)有幫助,少走些彎路.
?
??????
主旨:
本文首先根據(jù)自己的經(jīng)驗(yàn)整理了一下
SQL中的null的用法及要注意的方面
.
??????
名詞解釋
(英文辭典):
null:無效的, 無價(jià)值的, 等于零的.
?????????????????? (SQL定義): SQL中, NULL 與空格, 零, 都不相同. 是指為未定義或是不可用的.
??????? 構(gòu)成因素: 造成某一列成為 NULL 的因素可能是:
??????????????????????? (1),值不存在;
??????????????????????? (2), 值未知;
??????????????????????? (3), 列對(duì)表不可用.?????????
?????? 它與普通的值最大的 異同 是:
????????? 相同點(diǎn):???????????? 1:統(tǒng)統(tǒng)屬于值范疇.數(shù)字1是一個(gè)值,字符串'aaa'同樣是一個(gè)值,同理 null也是一個(gè)值.
????? ? ? ?? 2:都是合法的值,普通的數(shù)字,字符可以存在于表中字段,null也可以,而且是有意義的.
?
?????????? 不同點(diǎn):????????????? 先創(chuàng)建測(cè)試表:
USE [myTestDB]
GO
/****** 對(duì)象:? Table [dbo].[testNull]??? 腳本日期: 10/11/2008 13:45:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[testNull](
?? ?[ID] [int] IDENTITY(1,1) NOT NULL,
?? ?[a] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
?? ?[b] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,
?CONSTRAINT [PK_testNull] PRIMARY KEY CLUSTERED
(
?? ?[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
????????????? 插入相關(guān)測(cè)試值:
insert into testNull
values('1','')
insert into testNull
values('2',null)
?
??????? update testNull
?set b=b+1
?where b is null
?????????????????????????? 結(jié)論:查詢后發(fā)現(xiàn)b的值沒有變化,仍然為null.
?
?????????????????? 2: 普通的值可以進(jìn)行"="操作,例如條件中一般都會(huì)這樣出現(xiàn):sUserName='張三',如果sUserName的值為null,要想找出所有名字為null的記錄時(shí),不能這樣用:sUserName=null,因?yàn)閚ull不是一個(gè)具體的值,任何值與它比較時(shí)都會(huì)返回false.此時(shí)可借用is null 或者是is not null.???????
????????????????? 示例查詢:
??????? ? ? ? ? ? ? ? ? ? ? 1:select * from testNull where a=null --返回空結(jié)果集????????? ?
??????????????????????????? 2:select * from testNull where b is null --返回結(jié)果集 2 2 NULL
??????????????????????????? 結(jié)論: 說明null是不能用"="來比較,可用is null來替換
?
?????????????????? 3: 在用統(tǒng)計(jì)函數(shù)count時(shí)會(huì)不同,例如count(ID):統(tǒng)計(jì)記錄數(shù).當(dāng)統(tǒng)計(jì)的記錄中的包含有null值時(shí),它會(huì)忽略null值.?????????????????????? 示例查詢:
?
??????????????????????????? 1:select count(*),count(b) from testNull 它的返回值為2 1??????????????????????????? 2: select count(*),count(isnull(b,'')) from testNull 它的返回值為2 2
??????????????????????????? 結(jié)論: 對(duì)于列包含null 時(shí),統(tǒng)計(jì)行數(shù)是可用count(*),或者是先把null值轉(zhuǎn)換成對(duì)應(yīng)的值再統(tǒng)計(jì),例如count(isnull(b,''));
?
?????????????????? 4: 對(duì)于in 的影響不同.????????????????????? 示例查詢: 查詢testNull表中b的值包含在null中的記錄.
?
??????????? select * from testNullwhere b in(null) --沒有任何記錄
?????????????????????????? 結(jié)論: in在查詢時(shí)會(huì)忽略null的記錄,查詢的時(shí)候可用is not null來查詢.
??????????????????? 5: 排序時(shí)順序有不同:當(dāng)使用ORDER BY時(shí),首先呈現(xiàn)NULL值。如果你用DESC以降序排序,NULL值最后顯示。
??????????????????????? 1:select * from testNull
????????? ? ? ? ? ? ? ? ? ? 1 1 ''
????????? ? ? ? ? ? ? ? ? ? 2 2 NULL
??????????????????????? 2:select * from testNull order by b
???????????????????????????? 2 2 NULL
???????????????????????????? 1 1 ''
???????????????????????? 3:select * from testNull order by b desc
???????????????????????????? 1 1 ''
???????????????????????????? 2 2 NULL
?
????????????????????? 6: 當(dāng)使用GROUP BY時(shí),所有的NULL值被認(rèn)為是相等的。這時(shí)先多插入幾條數(shù)據(jù),方便查看結(jié)果.?????????? insert into testNull
values('3',null)
???????? values('4','4')
select * from testNull
?????????? select count(b) from testNull
group by b
???????????????????????? 返回結(jié)果:
?????????????????????????? 0 1 1
?????????????????????????? 結(jié)論: 可見在group by? 的時(shí)候,null視為等同.
?
????????????????????? 7: 永遠(yuǎn)不會(huì)有什么數(shù)據(jù)等于NULL。1不等于NULL,2也一樣。但NULL也不等于NULL。所以我們只能比較它“是”或“不是”。
????? ? 總結(jié): SQL中提供了如此眾多的存儲(chǔ)過程,函數(shù)供我們調(diào)用,而我們又真正的理解幾個(gè)呢?只有真正了解它們,才會(huì)對(duì)開發(fā)中出現(xiàn)的種種問題迅速找出問題所在并解決它. ?
注:
?? 本文引用網(wǎng)絡(luò)上相關(guān)資料.
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
