零语义

适用于:检查标记是的砖的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),()(年龄));的名字年龄- - - - - - -