SQL開發中容易忽視的一些小地方 一

2021-09-06 20:34:00 字數 3617 閱讀 4858

原文:

sql開發中容易忽視的一些小地方(一)

寫此系列文章緣由: 做開發三年來(b/s),發現基於web 架構的專案技術主要分兩大方面: 

第一:c#,它是程式的基礎,也可是其它開發語言,沒有開發語言也就不存在應用程式.

第二:資料庫,現在是資訊化世界,大多數資訊都可以通過資料庫儲存來交換資訊.常與應用程式互相交流資訊.

但在sql開發應用時,我們往往只觀注些常用的方法(insert delete select update),對些小細節方面(系統儲存過程,函式的應用,優化分析)研究的並不多或者是知其一不知其二,所以本人想把在學習工作當中遇到的問題總結些,希望還沒有重視這些方面的朋友會有幫助,少走些彎路.

主旨:本文首先根據自己的經驗整理了一下sql中的null的用法及要注意的方面.

名詞解釋(英文辭典):null:無效的, 無價值的, 等於零的.

(sql定義):sql中, null 與空格, 零, 都不相同. 是指為未定義或是不可用的.

構成因素:造成某一列成為 null 的因素可能是:

(1),值不存在;

(2), 值未知;

(3), 列對表不可用.         

它與普通的值最大的異同是:

相同點:

1:統統屬於值範疇.數字1是乙個值,字串'aaa'同樣是乙個值,同理 null也是乙個值.

2:都是合法的值,普通的數字,字元可以存在於表中字段,null也可以,而且是有意義的.

不同點:

先建立測試表:

use [mytestdb] go

/****** 物件:  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]

插入相關測試值:

insert into testnull

values('1','')

insert into testnull

values('2',null)

1:普通的值一般都可能進行運算子操作,例如:id列為int,所以可以這樣:id=id+1等,但如果一列的值為null,null+1=null,就是說null與任何運算子運算後都為null,這就是大家說的黑洞,會吃掉所有的東西.

update testnull

set b=b+1

where b is null

結論:查詢後發現b的值沒有變化,仍然為null.

2:普通的值可以進行"="操作,例如條件中一般都會這樣出現:susername='張三',如果susername的值為null,要想找出所有名字為null的記錄時,不能這樣用:susername=null,因為null不是乙個具體的值,任何值與它比較時都會返回false.此時可借用is null 或者是is not null.

示例查詢:

1:select * from testnull where a=null --返回空結果集

2:select * from testnull where b is null --返回結果集 2 2 null

結論:說明null是不能用"="來比較,可用is null來替換

3:在用統計函式count時會不同,例如count(id):統計記錄數.當統計的記錄中的包含有null值時,它會忽略null值.

示例查詢:

1:select count(*),count(b) from testnull 它的返回值為2 1

2: select count(*),count(isnull(b,'')) from testnull 它的返回值為2 2

結論:對於列包含null 時,統計行數是可用count(*),或者是先把null值轉換成對應的值再統計,例如count(isnull(b,''));

4:對於in 的影響不同.

示例查詢: 查詢testnull表中b的值包含在null中的記錄.

select * from testnull

where b in(null) --沒有任何記錄

結論:in在查詢時會忽略null的記錄,查詢的時候可用is not null來查詢.

5:排序時順序有不同:當使用order by時,首先呈現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:當使用group by時,所有的null值被認為是相等的。這時先多插入幾條資料,方便檢視結果.

insert into testnull

values('3',null)

values('4','4')

select * from testnull

select count(b) from testnull

group by b

返回結果:

0 1 1

結論:可見在group by  的時候,null視為等同.

7:永遠不會有什麼資料等於null。1不等於null,2也一樣。但null也不等於null。所以我們只能比較它「是」或「不是」。

總結:sql中提供了如此眾多的儲存過程,函式供我們呼叫,而我們又真正的理解幾個呢?只有真正了解它們,才會對開發中出現的種種問題迅速找出問題所在並解決它.  

注:

SQL開發中容易忽視的一些小地方 一

sql開發中容易忽視的一些小地方 一 寫此系列文章緣由 做開發三年來 b s 發現基於web 架構的專案技術主要分兩大方面 第一 c 它是程式的基礎,也可是其它開發語言,沒有開發語言也就不存在應用程式.第二 資料庫,現在是資訊化世界,大多數資訊都可以通過資料庫儲存來交換資訊.常與應用程式互相交流資訊...

SQL開發中容易忽視的一些小地方 一

原文 sql開發中容易忽視的一些小地方 一 寫此系列文章緣由 做開發三年來 b s 發現基於web 架構的專案技術主要分兩大方面 第一 c 它是程式的基礎,也可是其它開發語言,沒有開發語言也就不存在應用程式.第二 資料庫,現在是資訊化世界,大多數資訊都可以通過資料庫儲存來交換資訊.常與應用程式互相交...

SQL開發中容易忽視的一些小地方 六

原文 sql開發中容易忽視的一些小地方 六 事由 今天在北京俱樂部msn群中和討論了關於索引對delete的影響問題,事後感覺非常汗顏,因為我的隨口導致錯誤連篇。大致話題是這樣的,並非原話 討論 delete course where classid 500001 classid上沒有建立任何索引,...