NULL語義(數據庫SQL)

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

下麵演示了一個名為.數據包含中的值年齡列和此表將在下麵的各個小節的示例中使用。

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

比較運算符

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

左操作數

右操作數

>

> =

<

< =

< = >

任何價值

任何價值

真正的

例子

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

邏輯運算符

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

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

左操作數

右操作數

真正的

真正的

真正的

真正的

操作數

例子

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

表達式

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

  • 零容忍的表情

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

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

零容忍的表情

空不允許表達式返回當表達式的一個或多個參數大多數的表達都屬於這一類。

例子

>選擇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——' NULL '列' age '中的值將從處理中跳過。>選擇年齡年齡----------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 equal進行比較——是為什麼年齡未知的人(' NULL ')被join限定。>選擇p1p2在哪裏p1年齡< = >p2年齡p1的名字p2的名字的名字年齡的名字年齡-------- ---- -------- ----艾伯特艾伯特米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克185050結婚結婚30.30.

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

討論了在比較運算符,兩個價值觀是不平等的。但是,為了分組和區別處理,將兩個或多個值同數據都被分組到同一個桶中。這種行為符合SQL標準和其他企業數據庫管理係統。

例子

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

排序操作符(訂單通過條款)

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

例子

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

集合操作符(聯盟相交除了

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

例子

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

存在而且存在子查詢

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

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

例子

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

而且子查詢

在SQL數據磚,而且對象中允許使用表達式在哪裏查詢的子句。不像存在表達式,表達式可以返回真正的未知的(空)價值。從概念上講一個表達式在語義上相當於一組由析取運算符().例如,c1 IN(1,2,3)在語義上等價於(C11c12c13)

至於處理值的關係,語義可以從比較運算符中的值處理()和邏輯運算符().的計算結果的規則如下所示表達式。

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

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

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

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

例子

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