(Translated by https://www.hiragana.jp/)
空值 (SQL) - 维基百科,自由的百科全书 とべ转到内容ないよう

そら值 (SQL)

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
しょううつしまれ腊字ははてきomega (ωおめが)ようらい表示ひょうじかずすえ库理论なかてきNull。

そら英語えいごNull、NULLこれ結構けっこう查詢げんちゅう使用しようてき特殊とくしゅ標記ひょうき關聯かんれんしき資料しりょうちゅう对數よりどころ属性ぞくせい未知みちあるかけしつてきいち种标识,よう指示しじすうよりどころちゅう存在そんざいすうよりどころ值。よし關聯かんれんしき資料しりょう模型もけいてき創作そうさくしゃ E.F.とくしょ引入。SQLそら值是ようらい滿足まんぞく真實しんじつ關係かんけいすうよりどころ管理かんり系統けいとう(RDBMS)ちゅう支持しじかけしつ訊與適用てきようてき訊”てき需求。とくかえかい紹了ざいすうよりどころ理論りろんちゅう使用しようしょううつしてきまれ臘字ははωおめが符號ふごうらい表示ひょうじそら值。ざい SQLちゅうのり以 NULL よう於標識空值的保留ほりゅうせきかぎ。SQL nullいち狀態じょうたい,而不いち值。這種用法ようほうあずかだい多數たすうへんほどげん完全かんぜん不同ふどう,其中參照さんしょうてきそら值意あじちょ指向しこうにんなん對象たいしょう

這不おうあずか 0 すう混淆こんこうそら表示ひょうじかけしょう值-而與れい不同ふどうあずか缺乏けつぼう答案とうあんてき方式ほうしき不同ふどう作為さくいいなてき答案とうあんれい如“とうようゆう多少たしょう本書ほんしょ?”這個問題もんだい答案とうあん可能かのうれい”(ぼつゆうある空白くうはく”(不知ふちどうようゆう多少たしょう)。ざいすうよりどころひょうかくちゅう回報かいほう問題もんだいてきれつ結果けっかはたしたがえぼつゆう值(標記ひょうきためNull)開始かいしなみ且在わが確定かくていとうぼつゆう書籍しょせきまえなみかい更新こうしんため值“れい”。

かずすえ库表しゅてき不能ふのうそら。另外,すうすえ库中てき统计计算,一般将有空值的数据忽略不计。

應用おうよう

[编辑]
  • 作為さくい插入そうにゅう資料しりょうらんてきあずかしつらえ
  • 查詢てき條件じょうけんしき
ざいSQLてきWhere條件じょうけんしき判斷はんだんidらんためNullぞう where id = null 無法むほう正確せいかく執行しっこうてき必須ひっすうつしなり where id is nullはんわかよう判斷はんだんためidらんためNullのりようwhere id is not null
  • 查詢てきそら值評估取だい(nためひょう估式あるらん名稱めいしょう,e為當ためとうnためnullようかいでんてき內容)
  • coalesce(n,e)
Oracle DB、Microsoft SQL Server、IBM DB2、Postgre SQL、MySQLとう資料しりょう支援しえん
  • isnull(n,e)
Microsoft SQL Server、Microsoft-Accessとう資料しりょう支援しえん
  • nvl(n,e)
Oracle DB資料しりょう支援しえん
  • Nz(n,e)
Microsoft-Accessとう資料しりょう支援しえん

歷史れきし

[编辑]

EF Codd ざいいちへん 1975ねんてきACM - SIGMOD FDT報告ほうこくてき論文ろんぶんちゅうひっさげいたりょうそら作為さくい表示ひょうじ關係かんけい模型もけいちゅうかけしつすうよりどころてきいちしゅ方法ほうほう。Coddさいつね引用いんようてきあずかNull語義ごぎ相關そうかんてき論文ろんぶん(如 SQLちゅうしょ採用さいようてき 1979ねんざい ACM Transactions on Database Systemsじょう發表はっぴょうてき論文ろんぶん,其中かえかい紹了てき Relational Model/Tasmania,儘管其他許多きょた提議ていぎめんてき文章ぶんしょういちちょく模糊もこ。1979ねんてき論文ろんぶん2.3せつ詳細しょうさい描述りょうそら值在做算じゅつ運算うんざん播的語義ごぎ,以及比較ひかくそら值時使用しようさん值(さんげん)邏輯てき比較ひかくかえ詳細しょうさい說明せつめいりょうたい其它集合しゅうごう操作そうさてきそら處理しょり後者こうしゃ目前もくぜん存在そんざい爭議そうぎ)。ざいすうよりどころ理論りろんかい,Codd最初さいしょてき建議けんぎ(1975,1979)現在げんざいしょうため“Codd tables”。 Codd後來こうらい強化きょうかりょうてき要求ようきゅうそくざい ComputerWorld雜誌ざっしじょう發表はっぴょうてきいちへん 1985ねんゆかりりょう部分ぶぶん組成そせいてき文章ぶんしょうちゅう所有しょゆう RDBMS支持しじ Nullらい表示ひょうじかけしつてきすうよりどころ

ざい IBM System Rちゅう實現じつげん原型げんけい,1986ねんてき SQL標準ひょうじゅん基本きほんじょう採用さいようりょう Coddてき建議けんぎ。雖然 Don Chamberlinみとめためnulls(重複じゅうふくぎょう一起かずき SQLさいゆう爭議そうぎてき特性とくせいいちただし辯護べんご SQLちゅうてき Nulls設計せっけいなみ提出ていしゅつりょう實用じつようてき觀點かんてんみとめため這是系統けいとうたいかけしょう支援しえんさい方便ほうべんてき形式けいしきしたがえ而使ほどじょいんめん受許重複じゅうふくてき應用おうようほどじょきゅうべつけん查(請參閱semipredicate問題もんだい),同時どうじ也為すうよりどころ設計せっけい人員じんいん提供ていきょうりょう願意がんい使用しよう Nullてきせんこう; れい如,ためりょう避免眾所周知しゅうちてき異常いじょうざい本文ほんぶんてき語義ごぎ部分ぶぶん討論とうろん)。Chamberlinかえみとめためじょりょう提供ていきょう一些缺失值功能之外,たい於空值的實踐じっせん經驗けいけん也會しるべ依賴いらい於空值的其它げん特性とくせい,如某些分ぐみ構造こうぞうがい連接れんせつ最後さいごみとめためざい實踐じっせんちゅう,Nulls最終さいしゅう也會用作ようさく快速かいそく修補しゅうほ現有げんゆうしきてきいちしゅ方法ほうほうとう需要じゅようちょうだし其原そのはらはじめ意圖いとてき時候じこうためりょう丟失而是ためりょう適用てきようてきすうよりどころへん碼; れい如,一個數據庫如果有每英里加侖的欄位,需要じゅよう快速かいそくしんぞう值為電動でんどう汽車きしゃ

Coddざい其 1990ねん出版しゅっぱんてきすうよりどころ管理かんり關係かんけい模型もけいだい2はん中指なかゆび,SQL標準ひょうじゅんしょ要求ようきゅうてき單一たんいつ Null 類型るいけい夠的,おう該用りょうたね不同ふどうてき Null 類型るいけい標記ひょうきらいがえだい,以表明ひょうめいすうよりどころ丟失てき原因げんいんざい Coddてき書中しょちゅう,這兩個りゃんこ Nullがた標記ひょうき分別ふんべつしょうため“A值”かず“I值”,分別ふんべつ表示ひょうじかけしつただし適用てきようかずかけしつただし適用てきよう”。 Coddてき建議けんぎはた要求ようきゅう擴展 SQLてき邏輯系統けいとう以適おうよん值邏輯系統けいとうよし於這しゅがく外的がいてき複雜ふくざつせい具有ぐゆう不同ふどう定義ていぎ類型るいけいてきそら概念がいねんなおざいすうよりどころ領域りょういきこう接受せつじゅ。儘管如此,它仍しかいち活躍かつやくてき研究けんきゅう領域りょういき許多きょた論文ろんぶんかえざい發表はっぴょう

挑戰ちょうせん

[编辑]

よし於其相關そうかんてきさん值邏輯(3VL),它在 SQL連接れんせつちゅう使用しようてき特殊とくしゅ要求ようきゅう,以及聚合函數かんすう SQLぶんぐみ操作そうさしょ需的特殊とくしゅ處理しょりそら值一直是爭議的焦點和爭議的來源。計算けいさん科學かがく教授きょうじゅ Ron van der Meydenはた各種かくしゅ問題もんだいそうゆいため:“SQL標準ひょうじゅんちゅうてき不一致ふいっち意味いみちょ不可能ふかのうはたにんなん直觀ちょっかんてき邏輯語義ごぎ於 SQLちゅうてきそら處理しょり”。 儘管ため解決かいけつ這些問題もんだい提出ていしゅつりょう各種かくしゅ建議けんぎただしこうせん方案ほうあんてき複雜ふくざつせい阻礙りょう它們てきこう採用さいよう

そら值的

[编辑]

よし於 Nullすうよりどころ值,而是かけしょう值的標記ひょうきいん此以數學すうがく運算うんざん使用しよう Nullかいきゅう未知みち結果けっか

算術さんじゅつ運算うんざん

[编辑]

結果けっかよしそら表示ひょうじしたれい中將ちゅうじょう Nullじょう以 10しょうしるべ致Null:

10 * NULL          -- Result is NULL

這可能會のうかいゆう乎意りょうてき結果けっかれい如,とうためしはた Nullじょれい平台ひらだいかえしかい Null值而かい拋出あずかてきじょ以零-すうよりどころ異常いじょう”。雖然這種行為こういよし ISO SQLしるべじゅん定義ていぎてきただし許多きょた DBMS供應きょうおう商都しょうと類似るいじてき方式ほうしき處理しょり這一操作そうされい如,Oracle,PostgreSQL,MySQL服務ふくむ Microsoft SQL Server平台ひらだい都會とかいはりたい以下いか內容かえしかいそら結果けっか

NULL / 0

くし連接れんせつ

[编辑]

ざい SQLちゅう常見つねみてきくし連接れんせつ操作そうさざい其中いち操作そうさもとため Null也會しるべ致 Null。したれいえんじしめせりょう使用しよう Nullあずか SQL くし連接れんせつ運算うんざん || かえしかいてき Null結果けっか

'Fish ' || NULL || 'Chips'   -- Result is NULL

たい於數よりどころさくらいせつなみ如此。ざい Oracle RDBMSちゅうれい如 NULLそらくしみとめためしょうどうてきいん'Fish'|| NULL || 'あきらへん'くし連接れんせつてき結果けっか 'Fishあきらへん'。

NULLさん值邏輯的比較ひかく

[编辑]

よし於 Nullにんなんすうよりどころいきてき成員せいいんいん此它ため“值”,而是ゆびかけしつ值的標記ひょうきある佔位)。よし此與 Null進行しんこう比較ひかく永遠えいえんかいしるべ致 Trueある False,而總變成へんせいざいさん值邏輯的 Unknown 結果けっかちゅう下面かめんひょうたちしきてき邏輯結果けっかこれはた值 10 あずか Null進行しんこう比較ひかくとくいたてき結果けっかかいなりため未知みち

SELECT 10 = NULL       -- Results in Unknown

ただし,如果かけしつ值與操作そうさ結果けっか無關むせきのりたい Nullてきぼう操作そうさ以返かい值。考慮こうりょ下面かめんてきれい

SELECT NULL OR TRUE   -- Results in True

ざい這種情況じょうきょう,OR 左邊さへんてき未知みち值這一事實是無關緊要的,いんため OR てき操作そうさ結果けっかはた True,而不かん左邊さへんてき值如なに

SQL實現じつげんりょうさん值邏輯,いん此 SQLてきさく必須ひっす提供ていきょう專門せんもんてきさん值邏輯(3VL)。SQL三值邏輯的規則如下表所示( 表示ひょうじ邏輯狀態じょうたい)“ SQL使用しよう AND,OR NOT てき值表,對應たいおう於 Kleene Łukasiewicz三值邏輯的常見片段,有價ゆうか值的邏輯(它們てき含義定義ていぎ不同ふどうただし SQLぼつゆう定義ていぎ這樣てき操作そうさ

p q p OR q p AND q p = q
True True True True True
True False True False False
True 未知みち True 未知みち 未知みち
False True True False False
False False False False True
False 未知みち 未知みち False 未知みち
未知みち True True 未知みち 未知みち
未知みち False 未知みち False 未知みち
未知みち 未知みち 未知みち 未知みち 未知みち
p NOT p
True False
False True
未知みち 未知みち

WHEREちゅうてき未知みちこうおう

[编辑]

ざいすうよりどころ操縱そうじゅうげん(DML)かず查詢てき比較ひかくいいちゅうわかぐういた SQLさん值邏輯,該 WHERE句會くかいしるべ致 DML語句ごく僅對些謂ひょう估為 Trueてきれつ結果けっかおこり作用さようわか INSERT,UPDATE あるもの DELETE とう DML語句ごくのりいんため此謂計算けいさんてき結果けっかためかりある未知みちれつかい執行しっこうなみ放棄ほうき SELECT查詢。はた Unknown 解釋かいしゃくなり False しょうどうてき邏輯結果けっか處理しょりそら值時かいぐういたてき常見つねみ錯誤さくご下面かめんてき簡單かんたんれい說明せつめいりょう這個謬誤:

SELECT *
FROM t
WHERE i = NULL;

うえれいてき查詢邏輯一定いっていかえしかいれいれついんため i らんあずか Null 比較的ひかくてき結果けっか一定いっていでんかい未知みち”,そく使つかいたい於那些 i ため Null てき資料しりょうれつ也是如此。未知みち結果けっかしるべ致 SELECT語句ごくりつそく丟棄ごといちれつ。(ただしざいじつ作中さくちゅういち些 SQL工具こうぐしょう使用しようあずか Nullてき比較ひかくらい檢索けんさくれつ。)

そら指定してい3VL特定とくてい比較ひかくいい

[编辑]

基本きほん SQL比較ひかく運算うんざんざいあずか Null進行しんこう比較ひかく始終しじゅうかえしかい未知みち”,いん此 SQL標準ひょうじゅん提供ていきょうりょう兩個りゃんこ特定とくていてき Null 比較ひかくいいIS NULL IS NOT NULL使用しようつづり語法ごほう),らいけんはかかずよりどころそら值。

SQL標準ひょうじゅん包含ほうがんいち擴展 F571“值測ためし”,它引にゅうりょう三個額外的邏輯一元運算符(實際じっさいじょう,如果わが計算けいさん它們てき否定ひてい,它們其語法的ほうてきいち部分ぶぶん),也使用しようりょうつづり表示法ひょうじほう們有以下いか值表:

p true false unknown
p IS TRUE true false false
p IS NOT TRUE false true true
p IS FALSE false true false
p IS NOT FALSE true false true
p IS UNKNOWN false false true
p IS NOT UNKNOWN true true false

F571擴展あずか SQLちゅうぬのりんすうよりどころ類型るいけいてき存在そんざいせい交(本文ほんぶんややこう討論とうろん),儘管語法ごほう相似そうじただし F571かいざいかたりごとちゅう引入ぬのりん值或さん文字もじ。1999ねんざいぬのりんがたすうよりどころ類型るいけい引入標準ひょうじゅんまえ,F571擴展實際じっさいじょう存在そんざい於 SQL92ちゅうしか而,F571擴展ただゆう少數しょうすう系統けいとうさく;PostgreSQLさく它的すうよりどころいち

加入かにゅう三值邏輯中的其它運算符使 SQL てき三值邏輯功用完善,這意あじちょ它的邏輯運算うんざん表示ひょうじ(以組合くみあいにんなん可能かのうてきさん值邏輯函すう

ざい支持しじ F571擴展てき系統けいとうじょう遍歷へんれきごとしゅ可能かのう組合くみあい使つかいひょうたちしき p Unknownてきさんすうらい模擬もぎ IS UNKNOWN p,なみ使用しよう IS NULLある其他 NULL特定とくてい函數かんすうらいはかためし這些さんすう,雖然這樣可能かのうさらしげる瑣。

WHEREてき排中律はいちゅうりつ

[编辑]

そら值在其它構造こうぞうしきちゅうてき影響えいきょう

[编辑]

連接れんせつ(JOIN)

[编辑]

CASEひょうたちしき

[编辑]

SQL提供ていきょうりょうりょうたね風格ふうかくてき條件じょうけんひょうたちしきいちため簡單かんたん CASE”なみぞう switch 語句ごくいちよう操作そうさ。另一ざい標準ひょうじゅん中稱ちゅうしょうため搜索そうさく CASE”,なみぞう if ... elseifいちよう運行うんこう

簡單かんたん CASE ひょうたちしき使用しようかくれしき相等そうとう比較ひかく,它們てき執行しっこう DMLてき WHERE 處理しょり Null てき規則きそくしょうどうてきよし此,いち簡單かんたん CASE ひょうたちしき無法むほう直接ちょくせつけん查 Null てき存在そんざいざい簡單かんたん CASE ひょうたちしきちゅうけん查 Null 總會そうかいしるべ結果けっかため未知みち,如下しょしめせ

SELECT CASE i WHEN NULL THEN 'Is Null'  -- This will never be returned
              WHEN    0 THEN 'Is Zero'  -- This will be returned when i = 0
              WHEN    1 THEN 'Is One'   -- This will be returned when i = 1
              END
FROM t;

かん i れつしょ包含ほうがんてきてき值是什麼いんもそく使つかい包含ほうがんNull),該表たちしきてき計算けいさん結果けっかため未知みち” ,'Is Null' くしはた永遠えいえんかいかえしかい

另一方面ほうめん,“搜索そうさくCASEひょうたちしき使用しよういい IS NULL IS NOT NULL 條件じょうけんしたれい顯示けんじ如何いか使用しよう搜索そうさく CASEひょうたちしきらい正確せいかくけん查 Null:

SELECT CASE WHEN i IS NULL THEN 'Null Result'  -- This will be returned when i is NULL
            WHEN     i = 0 THEN 'Zero'         -- This will be returned when i = 0
            WHEN     i = 1 THEN 'One'          -- This will be returned when i = 1
            END
FROM t;

Oracleてき SQL 方言ほうげん提供ていきょうりょういち內置函數かんすう DECODE以用它來代替だいたい簡單かんたんてき CASEひょうたちしきなみ考慮こうりょ兩個りゃんこ相等そうとうてきそら值。

SELECT DECODE(i, NULL, 'Null Result', 0, 'Zero', 1, 'One') FROM t;

如果最後さいごぼつゆうあずか條件じょうけんしょうひきはいてき結果けっか所有しょゆう這些結構けっこうしょうかいかえしかい NULL;它們ゆういちあずかしつらえてき ELSE NULL

ほどじょ擴展ちゅうてき IF語句ごく

[编辑]

SQL/PSM(SQLあずかそん持續じぞくぐみ定義ていぎ SQLてきあずかそんほどじょ擴展,れい如 IF 語句ごくただし歷史れきしじょう主要しゅようてき SQL供應きょうおう商都しょうと包含ほうがんりょう自己じこ專有せんゆうてきほどじょ擴展。循環じゅんかん比較的ひかくてきほどじょ擴展ざいそら比較ひかく規則きそく運行うんこう類似るいじ於 DML 語句ごく查詢。以下いかあずかそんほどじょてきかただん以 ISO SQL 標準ひょうじゅん格式かくしきえんじしめせりょうざい IF 語句ごくちゅう使用しよう 3VLてき Null 。

IF i = NULL THEN
      SELECT 'Result is True'
ELSEIF NOT(i = NULL) THEN
      SELECT 'Result is False'
ELSE
      SELECT 'Result is Unknown';

該IF語句ごく僅對些評估為 True てき比較ひかく執行しっこう操作そうさたい於評估為 False ある知的ちてき IF 語句ごく,該語はたひかえせいでん遞給 ELSEIF 最後さいごでん遞給 ELSE 上面うわつらだい碼將いんあずか Null てき比較ひかく始終しじゅうひょう估為未知みち結果けっか一定いっていかい 'Result is Unknown'

分析ぶんせきSQLそら值的語義ごぎ

[编辑]

選擇せんたくあずかはか代表だいひょうせいじゃく

[编辑]

如果考慮こうりょ連接れんせつある聯合れんごう:甚至表示ひょうじじゃく

[编辑]

けん約束やくそくがいかぎ

[编辑]

そと連接れんせつ

[编辑]

SQL てきそと連接れんせつひだりがい連接れんせつみぎがい連接れんせつかい自動じどう生成せいせいそら值以作為さくい結果けっかひょうちゅうかけしつ值的佔位。如對於左がい連接れんせつかいさんせいそら值,代替だいたいひだりがい連接れんせつ操作そうさ右側みぎがわひょうちゅうらんかけしょう值的れつしたれい使用しよう兩個りゃんこひょう來示らいじはんひだりがい連接れんせつ操作そうささんせいてきそら值佔だいいちひょう(Employee)包含ほうがんいんこうへんごう姓名せいめい,而第ひょう(PhoneNumber)包含ほうがん相關そうかんてきいんこうへんごう電話でんわごう碼,如下。

Employee
ID LastName FirstName
1 Johnson Joe
2 Lewis Larry
3 Thompson Thomas
4 Patterson Patricia
PhoneNumber
ID Number
1 555-2323
3 555-9876

以下いかしめせれい SQL查詢たい兩個りゃんこひょう執行しっこうひだりがい連接れんせつ

SELECT e.ID, e.LastName, e.FirstName, pn.Number
FROM Employee e
LEFT OUTER JOIN PhoneNumber pn
ON e.ID = pn.ID;

此查詢生成せいせいてき結果けっかしゅうえんじしめせ SQL如何いか使用しよう Null作為さくい右側みぎがわ(PhoneNumber)ひょうちゅうかけしょうてき值的佔位,如下しょしめせ

Query result
ID LastName FirstName Number
1 Johnson Joe 555-2323
2 Lewis Larry NULL
3 Thompson Thomas 555-9876
4 Patterson Patricia NULL

聚合函數かんすう

[编辑]

SQL定義ていぎりょう聚合函數かんすう以簡伺服はしてきすうよりどころ聚合計算けいさんじょ COUNT(*)函數かんすうがい所有しょゆう集合しゅうごう函數かんすう都會とかい執行しっこう Null-elimination 驟,いん計算けいさんてき最終さいしゅう結果けっかちゅう包含ほうがん Null。

注意ちゅういしょうじょ Null不等ふとう於用れいがえかわ Null。れい如下ひょうちゅう AVG(i)もとむ i らんてき平均へいきん值)しょうきゅうあずか AVG(j)不同ふどうてき結果けっか

i j
150 150
200 200
250 250
NULL 0

這裡てき AVG(i) 200(150, 200 250てき平均へいきん),而 AVG(j) のり 150(150, 200, 250 0 てき平均へいきん)。ざい SQL 聚合函數かんすうちゅうAVG(z)不等ふとうSUM(z)/COUNT(*),這是いち眾所周知しゅうちてき副作用ふくさよう

聚合函數かんすうてき輸出ゆしゅつ也可以是そら值。這裡いちれい

SELECT COUNT(*), MIN(e.Wage), MAX(e.Wage)
FROM Employee e
WHERE e.LastName LIKE '%Jones%';

此查詢將始終しじゅう輸出ゆしゅついちぎょう計算けいさん姓氏せいしちゅう包含ほうがん“Jones”てきいんこう人數にんずうなみきゅう這些いんこうてき最低さいてい最高さいこうこうただし,如果ぼつゆういんこう符合ふごうきゅうじょうてき標準ひょうじゅんかい發生はっせい什麼いんも計算けいさんそらしゅうてき最小さいしょう值或最大さいだい值是不可能ふかのうてき所以ゆえん這些結果けっか必須ひっすためNULL,表示ひょうじぼつゆう答案とうあん。這不未知みち值,它是表示ひょうじぼつゆう值的そら值。結果けっか

COUNT(*) MIN(e.Wage) MAX(e.Wage)
0 NULL NULL

とう兩個りゃんこそら值相とうぶんぐみはいじょいち設置せっち操作そうさ

[编辑]

よし於 SQL 2003しょう所有しょゆう Null標記ひょうき定義ていぎため彼此ひし相等そうとういん需要じゅよう特殊とくしゅ定義ていぎ才能さいのうざい執行しっこうぼう操作そうさはた Nullぶんぐみざいいちおこり。SQLはたにんなん兩個りゃんこ彼此ひし相等そうとうてき值或にんなん兩個りゃんこそら值”定義ていぎためぼつゆう不同ふどう”(not distinct)。這允許いんきょ SQLざい使用しよう GROUP BY たい Null 進行しんこうぶんぐみはいじょ

其他 SQL操作そうさせきかぎざい處理しょりそら值時使用しようぼつゆう不同ふどう”(not distinct)。這些包括ほうかつ以下いか內容:

  • PARTITION BY はいじょかずひらくまどこうのうてき ROW_NUMBER
  • UNION,INTERSECT EXCEPT操作そうさ,它們はたNULLためよう於行比較ひかく/しょうじょ目的もくてきしょうどう
  • DISTINCT SELECT查詢ちゅう使用しようてきせきかぎ

SQL規範きはんちゅうてき UNION操作そうさ效果こうかかい違反いはんそら值不相等そうとうてき原則げんそく(它們確實かくじつ相互そうご確定かくていりょうそら值)。よし此某些 SQL操作そうさ(如聯合れんごうある區別くべつ可能かのうさんせい不能ふのう表示ひょうじ確定かくていしんいきてき結果けっか,這與わたる及與 NULL進行しんこうあらわしき比較的ひかくてき操作そうされい如 WHERE上面うわつら討論とうろんてきちゅうてき操作そうさ不同ふどうざい 1979ねんてき Codd提案ていあんちゅう基本きほんじょうSQL92採納さいのう),通過つうか論證ろんしょう刪除集合しゅうごう操作そうさちゅうてき重複じゅうふくこうざい檢索けんさく操作そうさてきひょう估中てき等式とうしきはかためしさらひくてきほそぶしそうじょう發生はっせい”這種語義ごぎ不一致ふいっちせい合理ごうりてき

SQL標準ひょうじゅんぼつ有明ありあけかく定義ていぎそら值的默認もくにんはいじょ順序じゅんじょ相反あいはんざい符合ふごうせいてき系統けいとうじょう ORDER BY以分べつ使用しようれつひょう NULLS FIRSTある NULLS LAST,分別ふんべつ在所ざいしょ有數ゆうすうよりどころ值之まえあるこれ對空たいくう進行しんこうはいじょしか而,なみ所有しょゆう資料しりょう供應きょうおう商都しょうと實現じつげんりょう這一こうのう實現じつげん此功のうてき供應きょうおうしょう可能かのうかいざい DBMSちゅうためそら值的はいじょ指定してい不同ふどうてき處理しょり方法ほうほう

たい索引さくいん操作そうさてき影響えいきょう

[编辑]

ぼう些 SQL產品さんぴん不可ふか建立こんりゅう包含ほうがん NULL てき索引さくいんかぎれい如,PostgreSQL 8.3 版本はんぽんまえ B索引さくいんてきぶんけん說明せつめい

B-じゅ處理しょりすうよりどころてき等式とうしき範圍はんい查詢,這些すうよりどころ以按あきらぼうたね順序じゅんじょはいじょ特別とくべつ,PostgreSQL查詢ぶんまわし劃器かいざい使用しよう< ≤ = ≥ > 這些運算うんざん進行しんこう比較ひかくわたる及索引列考慮こうりょ使用しよう B-じゅ索引さくいん

< ≤ = ≥ > とうこう於這些運算うんざん(如 BETWEEN IN)組合くみあいてき構造こうぞう也可以用 B-じゅ索引さくいん搜索そうさく實現じつげん。(ただし注意ちゅうい,IS NULL とう於而且不可ふか索引さくいん。):

ざい強制きょうせいただ一性的建立索引執行情況下,らんため NULL值會したがえ索引さくいんちゅう排除はいじょなみ且不かいざい NULLあいだ強制きょうせい執行しっこう唯一ゆいいつせいさいつぎ引用いんよう PostgreSQLぶんけん

とう索引さくいん宣告せんこくただいちはた允許いんきょ具有ぐゆうしょうどう索引さくいん值的ひょうぎょうそら值不ため相等そうとうれつただ一索引只會拒絕所有索引列在兩行中相等的情況。

這種作法さほう符合ふごう SQL:2003-純量じゅんりょうそら比較的ひかくてき規範きはん

索引さくいんそら值的另一種方法涉及按照 SQL:2003定義ていぎてき行為こういはた它們處理しょりため不明ふめいあらわれい如,Microsoft SQL Serverぶん聲明せいめい如下:

ためりょう建立こんりゅう索引さくいん,NULL比較ひかく相等そうとうよし此,如果かぎざいぎょうちゅうため NULL,のり無法むほう創建そうけん唯一ゆいいつ索引さくいんある UNIQUE 約束やくそくとう選擇せんたくただ一索引或唯一約束的列時,選擇せんたく定義ていぎため NOT NULL てきれつ

這兩しゅ索引さくいん策略さくりゃくあずか SQL:2003定義ていぎてき Null行為こうい一致いっちよしため索引さくいん方法ほうほうぼつゆう SQL:2003標準ひょうじゅん明確めいかく定義ていぎ所以ゆえんそら值的索引さくいん策略さくりゃく完全かんぜんよし供應きょうおうしょうらい設計せっけい實現じつげん

そら處理しょり函數かんすう

[编辑]

SQL定義ていぎりょう兩個りゃんこ函數かんすうらいあらわしき處理しょりそら值:NULLIF COALESCE。這兩個りゃんこ函數かんすう CASEひょうたちしきてき縮寫しゅくしゃ

NULLIF

[编辑]

NULLIF 函數かんすう接受せつじゅ兩個りゃんこさんすう。如果だい一個參數等於第二個參數,のり NULLIF かえしかい Null。いやのりかえしかいだいいちまいりすうてき值。

NULLIF(value1, value2)

いん此,NULLIF以下いか CASEひょうたちしきてき縮寫しゅくしゃ

CASE WHEN value1 = value2
     THEN
         NULL
     ELSE
         value1
END

COALESCE

[编辑]

COALESCE 函數かんすう实现りょうそら值结あい运算接受せつじゅさん數列すうれつひょうしたがえれつひょうちゅうかえしかいだいいち Null值:

COALESCE(value1, value2, value3, ...)

COALESCE定義ていぎため以下いかSQL CASEひょうたちしきてき簡寫:

CASE WHEN value1 IS NOT NULL THEN value1
     WHEN value2 IS NOT NULL THEN value2
     WHEN value3 IS NOT NULL THEN value3
     ...
     END

いち些 SQL DBMS 供應きょうおうしょうさく特定とくていてきこうのう類似るいじ COALESCE 函數かんすうぼう系統けいとうれい如 Transact-SQL)じつ作為さくい ISNULL函數かんすうあるものこうのう類似るいじ COALESCE てき其他函數かんすう

NVL

[编辑]

ORACLE NVL函數かんすう接受せつじゅ兩個りゃんこさんすう。它返かいだいいち NULLさんすう,如果所有しょゆうさんすう NULL,のりかえしかい NULL。

COALESCE ひょうたちしき轉換てんかんなりとうこうてき NVLひょうたちしき這樣てき

COALESCE ( val1, ... , val{n} )

變成へんせい

NVL( val1 , NVL( val2 , NVL( val3 ,  , NVL ( val{n-1} , val{n} )  )))

這個函數かんすうてき用例ようれいざい一個表達式中用某一特定值替換 NULL,れいNVL(SALARY, 0)ため'わかたきぎらんかけしょう值,のり以 0 がえかわ它'。ただしゆういちあきらあきら例外れいがいざいだい多數たすうじつ作中さくちゅう COALESCE ただひょう估其さん數列すうれつひょういた逹第いち NULL值,這有いく重要じゅうようてき原因げんいんだいいち NULL さんすうこれてきさんすう可能かのういち函數かんすう,它可能かのうざい計算けいさんなり本上ほんかん很昂とうと無效むこうあるもの可能かのうかいさんせいりょう外的がいてき副作用ふくさようしか而 NVL しょうひょう估參數列すうれつひょう其中てき所有しょゆうさんすう

かずよりどころ類型るいけいためそらかず未知みち

[编辑]

NULL 字面じめんりょうざいSQLちゅう无类がたてき[1]

SQL-92引入りょうCASTまこと许把NULL字面じめんりょう强制きょうせい转为特定とくてい类型てきNull,れい

CAST (NULL AS INTEGER)

表示ひょうじINTEGER类型てき未知みち值。

BOOLEANすうよりどころ類型るいけい

[编辑]

そうろん

[编辑]

常見つねみ錯誤さくご

[编辑]

批評ひひょう

[编辑]

閉環世界せかいてき假設かせつ

[编辑]

参考さんこう文献ぶんけん

[编辑]

延伸えんしん讀物よみもの

[编辑]

外部がいぶ連結れんけつ

[编辑]

まいり

[编辑]