零語義
適用於:磚的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- - - - - - - - - - - - - - - - - -零
表達式
比較運算符和邏輯運算符被視為表達在磚。磚還支持其他形式的表達式,可以大致分為:
零容忍的表情
表達式可以處理
零
值操作數這些表達式的結果取決於表達式本身。
表達式可以處理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邁克18丹50喬30.——“為空”表達式中使用分離選擇人——未知的(“空”)記錄。>選擇*從人在哪裏年齡>0或年齡是零;的名字年齡- - - - - - - - - - - -艾伯特零米歇爾30.弗雷德50邁克18丹50結婚零喬30.——有未知的人(“零”)年齡都跳過處理。>選擇*從人集團通過年齡有馬克斯(年齡)>18;年齡數(1)推薦- - - - - - - - - - - - - - -50230.2——自我加入聯接條件的p1。年齡= p2。年齡和p1。的名字=p2。的名字`.——人未知的年齡(“空”)是連接操作符的過濾掉。>選擇*從人p1,人p2在哪裏p1。年齡=p2。年齡和p1。的名字=p2。的名字;的名字年齡的名字年齡- - - - - - - - - - - - - - - - - - - - - - - -米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克18丹50丹50喬30.喬30.——年齡列從雙腿的加入而使用空值相等——就是為什麼人未知的年齡(“空”)有資格加入。>選擇*從人p1,人p2在哪裏p1。年齡< = >p2。年齡和p1。的名字=p2。的名字;的名字年齡的名字年齡- - - - - - - - - - - - - - - - - - - - - - - -艾伯特零艾伯特零米歇爾30.米歇爾30.弗雷德50弗雷德50邁克18邁克18丹50丹50結婚零結婚零喬30.喬30.
聚合運算符(集團通過
,截然不同的
)
討論了在比較運算符,兩個零
值不相等。然而,對於分組的目的和不同的處理,兩個或多個值零數據
被組合到同一個桶。這種行為符合SQL標準和與其他企業數據庫管理係統。
排序操作符(訂單通過
條款)
磚支持零排序規範訂單通過
條款。磚處理訂單通過
通過將所有的條款零
根據零值在第一或最後排序規範。默認情況下,所有的零
值放在第一位。
例子
——“零”值顯示在其他值——按升序排序。>選擇年齡,的名字從人訂單通過年齡;年齡的名字- - - - - - - - - - - -零結婚零艾伯特18邁克30.米歇爾30.喬50弗雷德50丹——“零”以外的列值按升序排序——方法和“零”值顯示在最後。>選擇年齡,的名字從人訂單通過年齡零位去年;年齡的名字- - - - - - - - - - - -18邁克30.米歇爾30.喬50丹50弗雷德零結婚零艾伯特——列以外的“零”值降序排序——“零”值顯示在最後。>選擇年齡,的名字從人訂單通過年齡DESC零位去年;年齡的名字- - - - - - - - - - - -50弗雷德50丹30.米歇爾30.喬18邁克零結婚零艾伯特
集合操作符(聯盟
,相交
,除了
)
零
值比較空的方式為平等的上下文中設置操作。這意味著當比較行,兩個零
值與普通被認為是相等的等於
(=
)算子。
例子
>創建視圖unknown_age作為選擇*從人在哪裏年齡是零;——隻有共同行“相交”的兩腿之間——結果集。完成的比較列行——空值的方式。>選擇的名字,年齡從人相交選擇的名字,年齡從unknown_age;的名字年齡- - - - - - - - - - -艾伯特零結婚零——“零”值的兩條腿”除了“不輸出。基本上,這表明,比較空的方式發生。>選擇年齡,的名字從人除了選擇年齡從unknown_age;年齡的名字推薦- - - - - - - - - - - - - - -30.喬50弗雷德30.米歇爾18邁克50丹——執行“聯盟”兩組數據之間的操作。——的對比列行ae中完成——空值的方式。>選擇的名字,年齡從人聯盟選擇的名字,年齡從unknown_age;的名字年齡- - - - - - - - - - - -艾伯特零喬30.米歇爾30.結婚零弗雷德50邁克18丹50
存在
和不存在
子查詢
在磚,存在
和不存在
在一個表達式是允許的在哪裏
條款。這些布爾表達式返回真正的
或假
。換句話說,存在
是會員條件並返回真正的
子查詢時,它指的是返回一個或多個行。類似的,不存在non-membership條件和回報真正的
當沒有行或零子查詢返回的行。
這兩個表達式是不受存在零子查詢的結果。他們通常更快,因為他們可以被轉換成semijoins零意識和anti-semijoins沒有特別規定。
例子
——即使子查詢生產行與“零”的價值觀,“存在”的表達式——評估“真正”的子查詢生成一行。>選擇*從人在哪裏存在(選擇零);的名字年齡- - - - - - - - - - - -艾伯特零米歇爾30.弗雷德50邁克18丹50結婚零喬30.——“不存在”表達式返回“FALSE”。它返回“TRUE”隻有當——子查詢生產沒有行。在這種情況下,它會返回一行。>選擇*從人在哪裏不存在(選擇零);的名字年齡- - - - - - -——“不存在”表達式返回“TRUE”。>選擇*從人在哪裏不存在(選擇1在哪裏1=0);的名字年齡- - - - - - - - - - - -艾伯特零米歇爾30.弗雷德50邁克18丹50結婚零喬30.
在
和不在
子查詢
在磚,在
和不在
在一個表達式是允許的在哪裏
子句的查詢。不像存在
表達式,在
表達式可以返回一個真正的
,假
或未知的(空)
價值。從概念上講一個在
表達語義上等價於一套平等條件由分隔符分隔(或
)。例如,c1(1、2、3)語義上等價(C1=1或c1=2或c1=3)
。
至於處理零
值,可以推導出的語義零
比較運算符的值處理(=
)和邏輯運算符(或
)。總而言之,以下是計算的結果的規則在
表達式。
真正的
非空值時返回列表中發現的問題嗎假
非空值時返回列表中沒有找到和列表不包含NULL值嗎未知的
返回值是什麼時候零
沒有找到,或非空值的列表,包含至少一個列表零
價值
不在
總是返回列表包含未知零
,無論輸入值。這是因為在
返回未知的
如果該值不包含列表中零
,因為不未知的
再一次未知的
。