零語義

適用於:檢查標記是的磚的SQL檢查標記是的磚運行時

一個表由一組行,每行包含一組列。列與數據類型和代表一個特定的屬性,一個實體(例如,年齡是一個列的實體叫什麼)。有時,一個列的值特定於一行不知道當時形成的行。在SQL,這樣的值表示為。本節詳細信息的語義值處理各運營商、表情等SQL構造。

下麵說明了模式布局和數據表的命名。數據包含中的值年齡列,這個表是用於各種例子在下麵的章節。

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

比較運算符

磚支持標準的比較運算符等>,> =,=,<< =。這些操作符的結果是未知的或當一個操作數或操作數都是未知的。以比較值平等、磚提供一個空值相等操作符(< = >),它返回當一個操作數並返回真正的當兩個操作數。下麵的表說明了比較運算符的行為,當一個或兩個操作數:

左操作數

右操作數

>

> =

=

<

< =

< = >

任何價值

任何價值

真正的

例子

——正常的比較運算符返回“零”當一個操作數是“零”。>選擇5>作為expression_output;expression_output- - - - - - - - - - - - - - - - - -——正常的比較運算符返回“零”當操作數都是“零”。>選擇=作為expression_output;expression_output- - - - - - - - - - - - - - - - - -——空值等於操作符返回“False”當一個操作數是“空”>選擇5< = >作為expression_output;expression_output- - - - - - - - - - - - - - - - - -——空值相等操作符返回“True”當一個操作數是“空”>選擇< = >;expression_output- - - - - - - - - - - - - - - - - -真正的- - - - - - - - - - - - - - - - - -

邏輯運算符

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

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

左操作數

右操作數

真正的

真正的

真正的

真正的

操作數

例子

——正常的比較運算符返回“零”當一個操作數是“零”。>選擇(真正的)作為expression_output;expression_output- - - - - - - - - - - - - - - - - -真正的——正常的比較運算符返回“零”當操作數都是“零”。>選擇()作為expression_outputexpression_output- - - - - - - - - - - - - - - - - -——空值等於操作符返回“False”當一個操作數是“空”>選擇()作為expression_output;expression_output- - - - - - - - - - - - - - - - - -

表達式

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

  • 零容忍的表情

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

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

零容忍的表情

表達式返回零容忍當一個或多個參數的表達式和大多數的表情落在這一類。

例子

>選擇concat(“約翰。”,)作為expression_output;expression_output- - - - - - - - - - - - - - - - - ->選擇積極的()作為expression_output;expression_output- - - - - - - - - - - - - - - - - ->選擇to_date()作為expression_output;expression_output- - - - - - - - - - - - - - - - - -

表達式可以處理null值操作數

這類表達式是設計來處理值。表達式的結果取決於表達式本身。例如,函數表達式isnull返回一個真正的在零輸入和在非零輸入功能合並返回第一個非價值在其操作數列表。然而,合並返回當所有的操作數。下麵是一個完整的列表的表達這一類。

  • 合並

  • NULLIF

  • IFNULL

  • NVL

  • NVL2

  • ISNAN

  • NANVL

  • ISNULL

  • ISNOTNULL

  • ATLEASTNNONNULLS

例子

>選擇isnull()作為expression_output;expression_output- - - - - - - - - - - - - - - - - -真正的——返回第一次出現的非零值。>選擇合並(,,3,)作為expression_output;expression_output- - - - - - - - - - - - - - - - - -3——返回“零”作為其所有操作數是“零”。>選擇合並(,,,)作為expression_output;expression_output- - - - - - - - - - - - - - - - - ->選擇isnan()作為expression_output;expression_output- - - - - - - - - - - - - - - - - -

內置的聚合表達式

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

  • 值被忽略的處理所有的聚合函數。

    • 唯一的例外是COUNT(*)功能。

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

    • 馬克斯

    • 最小值

    • 總和

    • AVG

    • 每一個

    • 任何

    • 一些

例子

——“count(*)”不跳過“零”的價值觀。>選擇(*);(1)- - - - - - - - - -7——“零”值列“年齡”是跳過的處理。>選擇(年齡);(年齡)- - - - - - - - - - -5——“count(*)”在一個空的輸入設置返回0。這是與其他聚合函數,如“max”,返回NULL。>選擇(*)在哪裏1=0;(1)- - - - - - - - - -0——“零”值的最大值被排除在計算。>選擇馬克斯(年齡);馬克斯(年齡)- - - - - - - - - -50——“max”返回“零”輸入一個空集。>選擇馬克斯(年齡)在哪裏1=0;馬克斯(年齡)- - - - - - - - - -

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

在哪裏,運營商過濾行基於用戶指定的條件。一個加入操作符用於組合來自兩個表的行基於聯接條件。為所有三個運營商,一個條件表達式是一個布爾表達式,可以返回真正的,未知的(空)。他們是“滿意”,如果條件的結果真正的

例子

——人的年齡是未知的(“空”)過濾結果集。>選擇*在哪裏年齡>0;的名字年齡- - - - - - - - - - - -米歇爾30.弗雷德50邁克185030.——“為空”表達式中使用分離選擇人——未知的(“空”)記錄。>選擇*在哪裏年齡>0年齡;的名字年齡- - - - - - - - - - - -艾伯特米歇爾30.弗雷德50邁克1850結婚30.——有未知的人(“零”)年齡都跳過處理。>選擇*集團通過年齡馬克斯(年齡)>18;年齡(1)推薦- - - - - - - - - - - - - - -50230.2——自我加入聯接條件的p1。年齡= p2。年齡和p1。的名字=p2。的名字`.——人未知的年齡(“空”)是連接操作符的過濾掉。>選擇*p1,p2在哪裏p1年齡=p2年齡p1的名字=p2的名字;的名字年齡的名字年齡- - - - - - - - - - - - - - - - - - - - - - - -米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克18505030.30.——年齡列從雙腿的加入而使用空值相等——就是為什麼人未知的年齡(“空”)有資格加入。>選擇*p1,p2在哪裏p1年齡< = >p2年齡p1的名字=p2的名字;的名字年齡的名字年齡- - - - - - - - - - - - - - - - - - - - - - - -艾伯特艾伯特米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克185050結婚結婚30.30.

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

討論了在比較運算符,兩個值不相等。然而,對於分組的目的和不同的處理,兩個或多個值數據被組合到同一個桶。這種行為符合SQL標準和與其他企業數據庫管理係統。

例子

——“零”值放在一桶“集團”處理。>選擇年齡,(*)集團通過年齡;年齡(1)- - - - - - - - - - - -250230.2181——所有的空的年齡被認為是一個截然不同的值在不同的處理。>選擇截然不同的年齡;年齡- - - - -5030.18

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

磚支持零排序規範訂單通過條款。磚處理訂單通過通過將所有的條款根據零值在第一或最後排序規範。默認情況下,所有的值放在第一位。

例子

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

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

值比較空的方式為平等的上下文中設置操作。這意味著當比較行,兩個值與普通被認為是相等的等於(=)算子。

例子

>創建視圖unknown_age作為選擇*在哪裏年齡;——隻有共同行“相交”的兩腿之間——結果集。完成的比較列行——空值的方式。>選擇的名字,年齡相交選擇的名字,年齡unknown_age;的名字年齡- - - - - - - - - - -艾伯特結婚——“零”值的兩條腿”除了“不輸出。基本上,這表明,比較空的方式發生。>選擇年齡,的名字除了選擇年齡unknown_age;年齡的名字推薦- - - - - - - - - - - - - - -30.50弗雷德30.米歇爾18邁克50——執行“聯盟”兩組數據之間的操作。——的對比列行ae中完成——空值的方式。>選擇的名字,年齡聯盟選擇的名字,年齡unknown_age;的名字年齡- - - - - - - - - - - -艾伯特30.米歇爾30.結婚弗雷德50邁克1850

存在存在子查詢

在磚,存在存在在一個表達式是允許的在哪裏條款。這些布爾表達式返回真正的。換句話說,存在是會員條件並返回真正的子查詢時,它指的是返回一個或多個行。類似的,不存在non-membership條件和回報真正的當沒有行或零子查詢返回的行。

這兩個表達式是不受存在零子查詢的結果。他們通常更快,因為他們可以被轉換成semijoins零意識和anti-semijoins沒有特別規定。

例子

——即使子查詢生產行與“零”的價值觀,“存在”的表達式——評估“真正”的子查詢生成一行。>選擇*在哪裏存在(選擇);的名字年齡- - - - - - - - - - - -艾伯特米歇爾30.弗雷德50邁克1850結婚30.——“不存在”表達式返回“FALSE”。它返回“TRUE”隻有當——子查詢生產沒有行。在這種情況下,它會返回一行。>選擇*在哪裏存在(選擇);的名字年齡- - - - - - -——“不存在”表達式返回“TRUE”。>選擇*在哪裏存在(選擇1在哪裏1=0);的名字年齡- - - - - - - - - - - -艾伯特米歇爾30.弗雷德50邁克1850結婚30.

子查詢

在磚,在一個表達式是允許的在哪裏子句的查詢。不像存在表達式,表達式可以返回一個真正的,未知的(空)價值。從概念上講一個表達語義上等價於一套平等條件由分隔符分隔()。例如,c1(1、2、3)語義上等價(C1=1c1=2c1=3)

至於處理值,可以推導出的語義比較運算符的值處理(=)和邏輯運算符()。總而言之,以下是計算的結果的規則表達式。

  • 真正的非空值時返回列表中發現的問題嗎

  • 非空值時返回列表中沒有找到和列表不包含NULL值嗎

  • 未知的返回值是什麼時候沒有找到,或非空值的列表,包含至少一個列表價值

總是返回列表包含未知,無論輸入值。這是因為返回未知的如果該值不包含列表中,因為未知的再一次未知的

例子

——子查詢隻有‘零’值的結果集。因此,——“在”謂詞的結果是未知的。>選擇*在哪裏年齡(選擇);的名字年齡- - - - - - -——子查詢中的“空”值結果集,以及一個有效的——“50”價值。返回行= 50歲。>選擇*在哪裏年齡(選擇年齡(50),()(年齡));的名字年齡- - - - - - -弗雷德5050——子查詢以來“零”價值的結果集,在“不”——謂詞返回未知。因此,沒有行——符合該查詢條件。>選擇*在哪裏年齡(選擇年齡(50),()(年齡));的名字年齡- - - - - - -