零語義

適用於:勾選“是”磚的SQL勾選“是”磚運行時

表由一組行組成,每行包含一組列。列與數據類型相關聯,並表示實體的特定屬性(例如,年齡實體的列是否被稱為).有時,特定於行的列的值在行出現時還不知道。在SQL,這些值表示為.的語義在各種操作符、表達式和其他中的值處理SQL構造。

下麵說明了名為的表的模式布局和數據.數據包含中的值年齡列和此表將在下麵的小節中的各種示例中使用。

Id名字年齡---------------One hundred.30.200結婚300邁克18400弗雷德50500艾伯特600米歇爾30.70050

比較運算符

Databricks支持標準比較運算符,例如>> =<而且< =.這些操作符的結果未知或當一個操作數或兩個操作數未知或.為了比較, Databricks提供了一個空安全的相等操作符(< = >),返回當其中一個操作數為並返回真正的當兩個操作數都是.下表說明了當一個或兩個操作數為時比較操作符的行為

左操作數

右操作數

>

> =

<

< =

< = >

任何價值

任何價值

真正的

例子

—當其中一個操作數為' NULL '時,普通比較操作符返回' NULL '。>選擇5>作為expression_outputexpression_output-----------------——當兩個操作數都為' NULL '時,普通比較操作符返回' NULL '。>選擇作為expression_outputexpression_output-----------------當其中一個操作數為“NULL”時,返回“False”>選擇5< = >作為expression_outputexpression_output-----------------當其中一個操作數為“NULL”時,返回“True”>選擇< = >expression_output-----------------真正的-----------------

邏輯運算符

Databricks支持標準邏輯運算符,例如而且.這些運算符取布爾表達式作為參數,並返回a布爾價值。

下表說明了當一個或兩個操作數為時邏輯運算符的行為

左操作數

右操作數

真正的

真正的

真正的

真正的

操作數

例子

—當其中一個操作數為' NULL '時,普通比較操作符返回' NULL '。>選擇真正的作為expression_outputexpression_output-----------------真正的——當兩個操作數都為' NULL '時,普通比較操作符返回' NULL '。>選擇作為expression_outputexpression_output-----------------——當其中一個操作數為“NULL”時,空安全的相等運算符返回“False”>選擇作為expression_outputexpression_output-----------------

表達式

比較運算符和邏輯運算符在Databricks中被視為表達式。Databricks還支持其他形式的表達式,可以大致分為:

  • 零不容忍表達式

  • 可以處理的表達式值操作數

    • 這些表達式的結果取決於表達式本身。

零不容忍表達式

Null不容忍表達式返回當表達的一個或多個參數大多數短語都屬於這一類。

例子

>選擇concat“約翰。”作為expression_outputexpression_output----------------->選擇積極的作為expression_outputexpression_output----------------->選擇to_date作為expression_outputexpression_output-----------------

可以處理空值操作數的表達式

這類表達式被設計用來處理值。表達式的結果取決於表達式本身。以函數表達式為例isnull返回一個真正的在空輸入和對於非空輸入,其中作為函數合並返回第一個非值在操作數列表中的值。然而,合並返回當它的所有操作數為.下麵是這類表達式的不完整列表。

  • 合並

  • NULLIF

  • IFNULL

  • NVL

  • NVL2

  • ISNAN

  • NANVL

  • ISNULL

  • ISNOTNULL

  • ATLEASTNNONNULLS

例子

>選擇isnull作為expression_outputexpression_output-----------------真正的——返回第一次出現的非“NULL”值。>選擇合並3.作為expression_outputexpression_output-----------------3.——返回' NULL ',因為它所有的操作數都是' NULL '。>選擇合並作為expression_outputexpression_output----------------->選擇isnan作為expression_outputexpression_output-----------------

內置聚合表達式

聚合函數通過處理一組輸入行來計算單個結果。下麵是如何做的規則值由聚合函數處理。

  • 所有聚合函數在處理過程中都會忽略值。

    • 該規則的唯一例外是COUNT(*)函數。

  • 一些聚合函數返回當所有輸入值為或者輸入數據集為空。這些函數的列表是:

    • 馬克斯

    • 最小值

    • 總和

    • AVG

    • 每一個

    • 任何

    • 一些

例子

——' count(*) '不跳過' NULL '值。>選擇1--------7——列' age '中的' NULL '值將從處理中跳過。>選擇年齡年齡----------5——' count(*) '在空輸入集上返回0。這是不一樣的——聚合函數,如' max ',返回' NULL '。>選擇在哪裏101--------0—“NULL”值不包括在最大值的計算中。>選擇馬克斯年齡馬克斯年齡--------50——' max '在空輸入集上返回' NULL '。>選擇馬克斯年齡在哪裏10馬克斯年齡--------

中的條件表達式在哪裏,加入條款

在哪裏操作符根據用戶指定的條件篩選行。一個加入運算符用於根據連接條件組合來自兩個表的行。對於這三個操作符,條件表達式是一個布爾表達式,可以返回真正的未知的(空).如果條件的結果是“滿意的”真正的

例子

年齡未知(' NULL ')的人從結果集中過濾出來。>選擇在哪裏年齡>0名字年齡-------- ---米歇爾30.弗雷德50邁克185030.——“IS NULL”表達式在析取中用於選擇人物—未知(' NULL ')記錄。>選擇在哪裏年齡>0年齡名字年齡-------- ----艾伯特米歇爾30.弗雷德50邁克1850結婚30.年齡未知(“NULL”)的人員將跳過處理。>選擇集團通過年齡馬克斯年齡>18年齡1--- --------50230.2——一個連接條件為' p1 '的自連接案例。年齡= p2。年齡和p1.名字=p2.名字`.年齡未知(' NULL ')的人被join操作符過濾掉。>選擇p1p2在哪裏p1年齡p2年齡p1名字p2名字名字年齡名字年齡-------- --- -------- ---米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克18505030.30.——使用null-safe equals來比較來自join的兩個分支的age列——這就是為什麼年齡未知(' NULL ')的人被join限定的原因。>選擇p1p2在哪裏p1年齡< = >p2年齡p1名字p2名字名字年齡名字年齡-------- ---- -------- ----艾伯特艾伯特米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克185050結婚結婚30.30.

聚合運算符(集團通過截然不同的

如在比較運算符,兩個價值觀是不相等的。但是,出於分組和區別處理的目的,兩個或多個值配合數據都被分組到同一個桶中。此行為符合SQL標準和其他企業數據庫管理係統。

例子

在“GROUP BY”處理中,“NULL”值被放在一個桶中。>選擇年齡集團通過年齡年齡1---- --------250230.2181在“distinct”處理中,所有“NULL”年齡都被認為是一個不同的值。>選擇截然不同的年齡年齡----5030.18

排序運算符(訂單通過條款)

Databricks支持空排序規範訂單通過條款。Databricks處理訂單通過子句通過放置所有的值的初始值或最後值,具體取決於空排序規範。默認情況下,所有的價值觀放在第一位。

例子

首先顯示“NULL”值和其他值——按升序排序。>選擇年齡名字訂單通過年齡年齡名字---- --------結婚艾伯特18邁克30.米歇爾30.50弗雷德50——除' NULL '以外的列值按升序排序——way和' NULL '值顯示在最後。>選擇年齡名字訂單通過年齡零位最後的年齡名字---- --------18邁克30.米歇爾30.5050弗雷德結婚艾伯特——除' NULL '值外的列按降序排序-和' NULL '值顯示在最後。>選擇年齡名字訂單通過年齡DESC零位最後的年齡名字---- --------50弗雷德5030.米歇爾30.18邁克結婚艾伯特

集合運算符(聯盟相交除了

在set操作的上下文中,以空安全的方式比較值是否相等。這意味著當比較行時,是2不同於常規的值被認為是相等的等於)算子。

例子

>創建視圖unknown_age作為選擇在哪裏年齡-隻有“機密數據庫”兩段之間的普通行在——結果集。行中的列之間的比較已經完成—以零安全的方式。>選擇名字年齡相交選擇名字年齡unknown_age名字年齡------ ----艾伯特結婚——來自' EXCEPT '的兩個分支的' NULL '值不在輸出中。這基本上表明比較是以零安全的方式進行的。>選擇年齡名字除了選擇年齡unknown_age年齡名字--- --------30.50弗雷德30.米歇爾18邁克50——在兩組數據之間執行“UNION”操作。行中各列之間的比較已完成——零安全方式。>選擇名字年齡聯盟選擇名字年齡unknown_age名字年齡-------- ----艾伯特30.米歇爾30.結婚弗雷德50邁克1850

存在而且存在子查詢

在磚,存在而且存在表達式被允許在在哪裏條款。這些是返回任意一個的布爾表達式真正的.換句話說,存在是會員條件和回報嗎真正的當它引用的子查詢返回一行或多行。類似地,NOT EXISTS是非成員條件並返回真正的當子查詢不返回行或零返回行時。

這兩個表達式不受子查詢結果中NULL的影響。它們通常更快,因為它們可以轉換為半連接和反猶太連接,而不需要為空感知提供特殊規定。

例子

—即使子查詢生成了帶有' NULL '值的行,' EXISTS '表達式——當子查詢生成1行時,求值為' TRUE '。>選擇在哪裏存在選擇);名字年齡-------- ----艾伯特米歇爾30.弗雷德50邁克1850結婚30.——“NOT EXISTS”表達式返回“FALSE”。它隻在——subquery不生成任何行。在本例中,它返回1行。>選擇在哪裏存在選擇);名字年齡---- ---——“NOT EXISTS”表達式返回“TRUE”。>選擇在哪裏存在選擇1在哪裏10);名字年齡-------- ----艾伯特米歇爾30.弗雷德50邁克1850結婚30.

而且子查詢

在磚,而且表達式被允許在在哪裏子句。不像存在表達式,表達式可以返回真正的未知的(空)價值。從概念上講一個表達式在語義上等價於一組由析取操作符().例如,c1 IN(1,2,3)在語義上等價於(C11c12c13)

至於處理值是有關的,語義可以從比較運算符中的值處理()和邏輯運算符().總之,下麵是計算an結果的規則表達式。

  • 真正的當在列表中找到非null值時返回

  • 當列表中沒有非NULL值且列表不包含NULL值時返回

  • 未知的當值為,或者在列表中找不到非null值,且列表中至少包含一個價值

當列表包含時總是返回UNKNOWN,與輸入值無關。這是因為返回未知的如果該值不在包含,因為未知的再一次未知的

例子

—子查詢在結果集中隻有' NULL '值。因此,——' IN '謂詞的結果是UNKNOWN。>選擇在哪裏年齡選擇);名字年齡---- ---——子查詢在結果集中有' NULL '值以及一個有效的——值“50”。返回年齡= 50的行。>選擇在哪裏年齡選擇年齡50),年齡));名字年齡---- ---弗雷德5050——由於子查詢在結果集中有' NULL '值,' NOT in '——predicate將返回UNKNOWN。因此,沒有行——符合此查詢的條件。>選擇在哪裏年齡選擇年齡50),年齡));名字年齡---- ---