NULL語義(數據庫SQL)
表由一組行組成,每一行包含一組列。列與數據類型關聯,並表示實體的特定屬性(例如,年齡
實體的列是否稱為人
).有時,特定於一行的列的值在行出現時並不知道。在SQL
,這些值表示為零
.的語義詳細說明零
在各種操作符、表達式等中的值處理SQL
構造。
下麵演示了一個名為人
.數據包含零
中的值年齡
列和此表將在下麵的各個小節的示例中使用。
Id的名字年齡---------------One hundred.喬30.200結婚零300邁克18400弗雷德50500艾伯特零600米歇爾30.700丹50
比較運算符
Databricks SQL支持標準的比較操作符,例如>
,> =
,=
,<
而且< =
.這些運算符的結果是未知的或零
當其中一個操作數或兩個操作數都未知時零
.為了比較零
Databricks SQL提供了一個空安全的等運算符(< = >
),它返回假
當其中一個操作數是零
並返回真正的
當兩個操作數都是零
.下表說明了當一個或兩個操作數為時比較操作符的行為零
:
左操作數 |
右操作數 |
|
|
|
|
|
|
---|---|---|---|---|---|---|---|
零 |
任何價值 |
零 |
零 |
零 |
零 |
零 |
假 |
任何價值 |
零 |
零 |
零 |
零 |
零 |
零 |
假 |
零 |
零 |
零 |
零 |
零 |
零 |
零 |
真正的 |
例子
——當其中一個操作數為' NULL '時,普通比較操作符返回' NULL '。>選擇5>零作為expression_output;expression_output-----------------零——當兩個操作數都為' NULL '時,普通比較操作符返回' NULL '。>選擇零=零作為expression_output;expression_output-----------------零——空安全的相等操作符,當其中一個操作數為NULL時返回' False '>選擇5< = >零作為expression_output;expression_output-----------------假——空安全的相等操作符,當其中一個操作數為NULL時返回' True '>選擇零< = >零;expression_output-----------------真正的-----------------
邏輯運算符
Databricks SQL支持標準的邏輯運算符,例如和
,或
而且不
.這些操作符將布爾
表達式作為參數,並返回一個布爾
價值。
下表說明了一個或兩個操作數為時邏輯運算符的行為零
.
左操作數 |
右操作數 |
或 |
和 |
---|---|---|---|
真正的 |
零 |
真正的 |
零 |
假 |
零 |
零 |
假 |
零 |
真正的 |
真正的 |
零 |
零 |
假 |
零 |
假 |
零 |
零 |
零 |
零 |
操作數 |
不 |
---|---|
零 |
零 |
例子
——當其中一個操作數為' NULL '時,普通比較操作符返回' NULL '。>選擇(真正的或零)作為expression_output;expression_output-----------------真正的——當兩個操作數都為' NULL '時,普通比較操作符返回' NULL '。>選擇(零或假)作為expression_outputexpression_output-----------------零當一個操作數為NULL時,空安全的相等操作符返回' False '>選擇不(零)作為expression_output;expression_output-----------------零
表達式
比較運算符和邏輯運算符在Databricks SQL中被視為表達式。Databricks SQL還支持其他形式的表達式,可以大致分為:
零容忍的表情
可以處理的表達式
零
值操作數這些表達式的結果取決於表達式本身。
可以處理空值操作數的表達式
這類表達式被設計用來處理零
值。表達式的結果取決於表達式本身。例如,函數表達式isnull
返回一個真正的
在空輸入和假
在非空輸入中,作為函數合並
返回第一個非零
值在其操作數列表中。然而,合並
返回零
當它的所有操作數為零
.下麵是這個類別的表達式的不完整列表。
合並
NULLIF
IFNULL
NVL
NVL2
ISNAN
NANVL
ISNULL
ISNOTNULL
ATLEASTNNONNULLS
在
例子
>選擇isnull(零)作為expression_output;expression_output-----------------真正的——返回第一個出現的非“NULL”值。>選擇合並(零,零,3.,零)作為expression_output;expression_output-----------------3.——返回' NULL ',因為它的所有操作數都是' NULL '。>選擇合並(零,零,零,零)作為expression_output;expression_output-----------------零>選擇isnan(零)作為expression_output;expression_output-----------------假
內置的聚合表達式
聚合函數通過處理一組輸入行計算單個結果。下麵是如何做的規則零
值由聚合函數處理。
零
所有聚合函數在處理過程中都會忽略值。唯一的例外是COUNT(*)函數。
一些聚合函數返回
零
當所有輸入值為零
或者輸入數據集為空。這些函數的列表如下:馬克斯
最小值
總和
AVG
每一個
任何
一些
例子
——' count(*) '不跳過' NULL '值。>選擇數(*)從人;數(1)--------7——' NULL '列' age '中的值將從處理中跳過。>選擇數(年齡)從人;數(年齡)----------5——' count(*) '在空輸入集上返回0。這個不同於另一個——聚合函數,例如' max ',返回' NULL '。>選擇數(*)從人在哪裏1=0;數(1)--------0——' NULL '值被排除在最大值的計算之外。>選擇馬克斯(年齡)從人;馬克斯(年齡)--------50——' max '在空輸入集上返回' NULL '。>選擇馬克斯(年齡)從人在哪裏1=0;馬克斯(年齡)--------零
條件表達式在哪裏
,有
,加入
條款
在哪裏
,有
操作符根據用戶指定的條件篩選行。一個加入
運算符用於根據連接條件組合來自兩個表的行。對於所有這三個操作符,條件表達式是一個布爾表達式,可以返回真正的
,假
或未知的(空)
.如果條件的結果是,他們就“滿意”了真正的
.
例子
—從結果集中過濾出年齡未知(' NULL ')的人員。>選擇*從人在哪裏年齡>0;的名字年齡-------- ---米歇爾30.弗雷德50邁克18丹50喬30.——' IS NULL '表達式用於在分離中選擇人員——使用未知(' NULL ')記錄。>選擇*從人在哪裏年齡>0或年齡是零;的名字年齡-------- ----艾伯特零米歇爾30.弗雷德50邁克18丹50結婚零喬30.—年齡未知(' NULL ')的人將從處理中跳過。>選擇*從人集團通過年齡有馬克斯(年齡)>18;年齡數(1)--- --------50230.2—一個自連接的情況,連接條件是' p1。年齡= p2。年齡和p1.的名字=p2.的名字`.——年齡未知的人(' NULL ')被join操作符過濾掉。>選擇*從人p1,人p2在哪裏p1.年齡=p2.年齡和p1.的名字=p2.的名字;的名字年齡的名字年齡-------- --- -------- ---米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克18丹50丹50喬30.喬30.——連接的兩條腿的年齡列使用null-safe equal進行比較——是為什麼年齡未知的人(' NULL ')被join限定。>選擇*從人p1,人p2在哪裏p1.年齡< = >p2.年齡和p1.的名字=p2.的名字;的名字年齡的名字年齡-------- ---- -------- ----艾伯特零艾伯特零米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克18丹50丹50結婚零結婚零喬30.喬30.
聚合運算符(集團通過
,截然不同的
)
討論了在比較運算符,兩個零
價值觀是不平等的。但是,為了分組和區別處理,將兩個或多個值同零數據
都被分組到同一個桶中。這種行為符合SQL標準和其他企業數據庫管理係統。
排序操作符(訂單通過
條款)
Databricks SQL支持空排序規範訂單通過
條款。Databricks SQL處理訂單通過
子句通過放置所有的零
第一個或最後一個值取決於空順序規範。默認情況下,所有的零
值放在第一位。
例子
——' NULL '值首先顯示,其他值則顯示——按升序排序。>選擇年齡,的名字從人訂單通過年齡;年齡的名字---- --------零結婚零艾伯特18邁克30.米歇爾30.喬50弗雷德50丹——除' NULL '外的列值按升序排序——way和' NULL '值顯示在最後。>選擇年齡,的名字從人訂單通過年齡零位最後的;年齡的名字---- --------18邁克30.米歇爾30.喬50丹50弗雷德零結婚零艾伯特——除' NULL '值外的列按降序排序——和' NULL '值顯示在最後。>選擇年齡,的名字從人訂單通過年齡DESC零位最後的;年齡的名字---- --------50弗雷德50丹30.米歇爾30.喬18邁克零結婚零艾伯特
集合操作符(聯盟
,相交
,除了
)
零
在集合操作上下文中,值以空安全的方式進行比較,以便相等。這意味著當比較行時,是2零
不同於常規值,值被認為是相等的等於
(=
)算子。
例子
>創建視圖unknown_age選擇*從人在哪裏年齡是零;-隻有“INTERSECT”的兩條腿之間的公共行是在——結果集。行各列之間的比較已經完成——以空安全的方式。>選擇的名字,年齡從人相交選擇的名字,年齡從unknown_age;的名字年齡------ ----艾伯特零結婚零——' NULL '來自' EXCEPT '的兩個分支的值不會輸出。——這基本上表明比較以空安全的方式進行。>選擇年齡,的名字從人除了選擇年齡從unknown_age;年齡的名字--- --------30.喬50弗雷德30.米歇爾18邁克50丹—在兩組數據之間執行“UNION”操作。行中各列之間的比較已經完成——空值的方式。>選擇的名字,年齡從人聯盟選擇的名字,年齡從unknown_age;的名字年齡-------- ----艾伯特零喬30.米歇爾30.結婚零弗雷德50邁克18丹50
存在
而且不存在
子查詢
在SQL數據磚,存在
而且不存在
對象中允許使用表達式在哪裏
條款。這是返回任意一個的布爾表達式真正的
或假
.換句話說,存在
是會員條件和返回真正的
當它引用的子查詢返回一行或多行。類似地,NOT EXISTS是一個非成員條件並返回真正的
當從子查詢返回無行或零行時。
這兩個表達式不受子查詢結果中NULL的影響。它們通常更快,因為它們可以轉換為半連接和反猶太連接,而無需為空感知提供特殊的規定。
例子
——即使子查詢產生的行值為' NULL ', ' EXISTS '表達式——當子查詢產生一行時,求值為' TRUE '。>選擇*從人在哪裏存在(選擇零);的名字年齡-------- ----艾伯特零米歇爾30.弗雷德50邁克18丹50結婚零喬30.——' NOT EXISTS '表達式返回' FALSE '。它隻在——subquery不生成行。在本例中,它返回1行。>選擇*從人在哪裏不存在(選擇零);的名字年齡---- ---——' NOT EXISTS '表達式返回' TRUE '。>選擇*從人在哪裏不存在(選擇1在哪裏1=0);的名字年齡-------- ----艾伯特零米歇爾30.弗雷德50邁克18丹50結婚零喬30.
在
而且不在
子查詢
在SQL數據磚,在
而且不在
對象中允許使用表達式在哪裏
查詢的子句。不像存在
表達式,在
表達式可以返回真正的
,假
或未知的(空)
價值。從概念上講一個在
表達式在語義上相當於一組由析取運算符(或
).例如,c1 IN(1,2,3)在語義上等價於(C1=1或c1=2或c1=3)
.
至於處理零
值的關係,語義可以從零
比較運算符中的值處理(=
)和邏輯運算符(或
).的計算結果的規則如下所示在
表達式。
真正的
當在列表中找到有問題的非null值時返回假
當列表中沒有找到非NULL值且列表中不包含NULL值時返回未知的
當值為零
,或者在列表中找不到非null值,且列表至少包含一個零
價值
不在
當列表包含時,總是返回UNKNOWN零
,不管輸入值是什麼。這是因為在
返回未知的
如果該值不在包含零
,因為不未知的
再一次未知的
.
例子
子查詢的結果集中隻有' NULL '值。因此,——' IN '謂詞的結果是UNKNOWN。>選擇*從人在哪裏年齡在(選擇零);的名字年齡---- ---——子查詢在結果集中有' NULL '值以及一個有效的——“50”價值。返回age = 50的行。>選擇*從人在哪裏年齡在(選擇年齡從值(50),(零)子(年齡));的名字年齡---- ---弗雷德50丹50——因為子查詢在結果集中有' NULL '值,' NOT in '——predicate將返回UNKNOWN。因此,沒有行——符合此查詢條件。>選擇*從人在哪裏年齡不在(選擇年齡從值(50),(零)子(年齡));的名字年齡---- ---