零语义
适用于:砖的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值吗未知的
返回值是什么时候零
没有找到,或非空值的列表,包含至少一个列表零
价值
不在
总是返回列表包含未知零
,无论输入值。这是因为在
返回未知的
如果该值不包含列表中零
,因为不未知的
再一次未知的
。