5. 操作符 您所在的位置:网站首页 mod操作符 5. 操作符

5. 操作符

2023-07-03 14:10| 来源: 网络整理| 查看: 265

5. 操作符 ¶

操作符操作数据项并返回结果。从语法上讲,操作符出现在操作数之前或之后或两个操作数之间。

本章包含以下部分:

SQL相关操作符

算术操作符

逻辑操作符

比较操作符

排序规则操作符

连接操作符

位串操作符

文本匹配操作符

层次查询操作符

集合操作符

自定义操作符

其中,非逻辑(非布尔)操作符本身不能用作查询或子查询中的WHERE或者HAVING子句的条件。

5.1. SQL相关操作符 ¶

操作符操纵的独立数据称为操作数或参数。操作符由特殊字符或关键字组成。例如,乘法操作符由星号 (*) 表示。

一元和二元操作符

两种通用类型的操作符是:

unary:一元操作符仅对一个操作数进行操作。一元操作符通常以下列格式与其操作数一起出现:

operator operand

binary:二元操作符对两个操作数进行操作。二元操作符及其操作数以这种格式出现:

operand1 operator operand2

其他具有特殊格式的操作符接受两个以上的操作数。如果给操作符一个空操作数,则结果始终为空。唯一不遵循此规则的操作符是连接 (||)。

操作符优先级

优先级是 KingbaseES 数据库在同一表达式中计算不同操作符的顺序。在计算包含多个操作符的表达式时,Kingbase在计算优先级较低的操作符之前先计算优先级较高的操作符。Kingbase在表达式中从左到右计算具有相同优先级的操作符。 以下列出了 SQL 操作符的优先级从高到低。列在同一行的操作符具有相同的优先级。

操作符:+, -, (作为一元操作符), PRIOR, CONNECT_BY_ROOT,COLLATE 身份、否定、层次结构中的位置

操作符:*, /, 乘法、除法

操作符:+, -, (作为二元操作符), || 加法、减法、连接

在下面的表达式中,乘法的优先级高于加法,因此KingbaseES先计算2 乘以 3,然后将结果加1。

1+2*3

您可以在表达式中使用括号来覆盖操作符优先级。KingbaseES在计算括号外的表达式之前先计算括号内的表达式。

SQL 还支持集合操作符(UNION、UNION ALL、INTERSECT和MINUS),它们组合查询返回的行集合,而不是单个数据项。所有集合操作符具有相同的优先级。

5.2. 算术操作符 ¶

您可以使用带有一个或两个参数的算术操作符来对数值进行求反、加法、减法、乘法和除法等。其中一些操作符也用于时间日期和时间间隔类型的计算。操作符的参数必须解析为数字数据类型或任何可以隐式转换为数字数据类型的数据类型。

一元算术操作符返回与参数的数值数据类型相同的数据类型。对于二元算术操作符,KingbaseES确定具有最高数值优先级的参数,将其余参数隐式转换为该数据类型,并返回该数据类型。

下表展示了所有可用的算术操作符。

表 5.2.4 算术操作符 ¶

操作符

描述

例子

结果

+

2 + 3

5

-

2 - 3

-1

*

2 * 3

6

/

除(整数除法截断结果)

4 / 2

2

%

模(取余)

5 % 4

1

^

指数(从左至右结合)

2.0 ^ 3.0

8

|/

平方根

|/ 25.0

5

||/

立方根

||/ 27.0

3

!

阶乘

5 !

120

!!

阶乘(前缀操作符)

!! 5

120

@

绝对值

@ -5.0

5

&

按位与

91 & 15

11

|

按位或

32 | 3

35

#

按位异或

17 # 5

20

~

按位求反

~1

-2

按位右移

8 >> 2

2

DIV

整除(兼容MySQL操作符)

4 DIV 2

2

MOD

取余(兼容MySQL操作符)

5 MOD 4

1

注意

使用兼容MySQL操作符DIV和MOD时,若操作数为NULL,需保持参数ora_input_emptystr_isnull为off状态。

操作符:+,-, 当这些表示正或负表达式时,它们是一元操作符。

示例:

CREATE TABLE students( student_id int, first_name varchar(20), last_name varchar(25) CONSTRAINT stu_last_name_nn NOT NULL, email varchar(25) CONSTRAINT stu_email_nn NOT NULL, phone_number varchar(20), entrance_date Date DEFAULT SYSDATE CONSTRAINT stu_entrance_data_NN NOT NULL, major_id varchar(10) CONSTRAINT stu_major_nn NOT NULL, score int CONSTRAINT stu_sco_nn NOT NULL, monitor_id int, class_id int ); SELECT * FROM students where -score < 0 ORDER BY student_id;

操作符:+,-, 当它们加或减时,它们是二元操作符。

示例:

SELECT entrance_date FROM students WHERE SYSDATE - entrance_date > 365 ORDER BY entrance_date;

操作符:*, / (乘,除)。 这些是二元操作符。

示例:

Update students SET score = score * 1.1; 5.3. 逻辑操作符 ¶

常用的逻辑操作符有:

AND

OR

NOT

SQL使用三值的逻辑系统,包括真、假和 null , null 表示“未知”。如下面的真值表所示:

表 5.3.3 真值表(AND和OR) ¶

``a``

``b``

``a`` AND ``b``

``a`` OR ``b``

TRUE

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

TRUE

TRUE

NULL

NULL

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE

NULL

FALSE

NULL

NULL

NULL

NULL

NULL

表 5.3.4 真值表(NOT) ¶

``a``

NOT ``a``

TRUE

FALSE

FALSE

TRUE

NULL

NULL

操作符 AND 和 OR 是可交换的,即交换左右操作数而不影响结果。

KingbaseES MySQL模式下兼容如下逻辑操作符:

表 5.3.5 兼容MySQL操作符 ¶

操作符

描述

XOR

逻辑异或

&&

逻辑与

||

逻辑或

!

逻辑非

需要注意的是,若操作数为NULL,需保持参数ora_input_emptystr_isnull为off状态。

5.4. 比较操作符 ¶

常见的比较操作符都可用,如下表所示。

表 5.4.2 比较操作符 ¶

操作符

描述

<

小于

>

大于

=

大于等于

= or

等于

or != or ^=

不等于

注意

!= 操作符在分析器阶段被转换成 。

操作符兼容MySQL比较操作符,其基本功能与 = 操作符相同。需要注意的是,操作数为NULL时,需保持参数ora_input_emptystr_isnull的关闭状态。

对于 = , , != , ^= 这几个操作符,支持两个字符之间输入若干空格或者换行的字符,效果和不加空格或换行一致。

比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,它们返回 boolean 类型;类似于 1 < 2 < 3 的表达式是非法的(因为没有 < 操作符可以比较一个布尔值和 3 )。

如下表所示,也有一些比较谓词。它们的行为和操作符相似,但是具有 SQL 标准所要求的特殊语法。

表 5.4.3 比较谓词 ¶

谓词

描述

``a`` BETWEEN ``x`` AND ``y``

在 ``x`` 和 ``y`` 之间

``a`` NOT BETWEEN ``x`` AND ``y``

不在 ``x`` 和 ``y`` 之间

``a`` BETWEEN SYMMETRIC ``x`` AND ``y``

在对比较值排序后 位于 ``x`` 和 ``y`` 之间

``a`` NOT BETWEEN SYMMETRIC ``x`` AND ``y``

在对比较值排序后不 位于 ``x`` 和 ``y`` 之间

``a`` IS DISTINCT FROM ``b``

不等于,空值被当做一个普通值

``a`` IS NOT DISTINCT FROM ``b``

等于,空值被当做一个普通值

``expression`` IS NULL

是空值

``expression`` IS NOT NULL

不是空值

``expression`` ISNULL

是空值(非标准语法)

IS INFINITE

是NAN

IS NOT NAN

不是NAN

IS INFINITE

是无限值

IS NOT INFINITE

不是无限值

``expression`` NOTNULL

不是空值(非标准语法)

``boolean_expression`` IS TRUE

为真

``boolean_expression`` IS NOT TRUE

为假或未知

``boolean_expression`` IS FALSE

为假

``boolean_expression`` IS NOT FALSE

为真或者未知

``boolean_expression`` IS UNKNOWN

值为未知

``boolean_expression`` IS NOT UNKNOWN

为真或者为假

BETWEEN 谓词可以简化范围测试:

a BETWEEN x AND y

等效于

a >= x AND a y

BETWEEN SYMMETRIC 和 BETWEEN 相似,不过 BETWEEN SYMMETRIC 不要求 AND 左边的参数小于或等于右边的参数。如果左参数不是小于等于右参数,这两个参数会自动被交换,这样总是会应用一个非空范围。

当有一个输入为空时,普通的比较操作符会得到空(表示“未知”)。例如, 7 = NULL 得到空, 7 NULL 也一样。如果这种行为不合适,可以使用 IS [ NOT ] DISTINCT FROM 谓词:

a IS DISTINCT FROM b a IS NOT DISTINCT FROM b

对于非空输入, IS DISTINCT FROM 和 操作符一样。不过,如果两个输入都为空,它会返回假。而如果只有一个输入为空,它会返回真。类似地, IS NOT DISTINCT FROM 对于非空输入的行为与 = 相同,但是当两个输入都为空时它返回真,并且当只有一个输入为空时返回假。因此,这些谓词实际上把空值当作一种普通数据值而不是“unknown”。

要检查一个值是否为空,使用下面的谓词:

expression IS NULL expression IS NOT NULL

或者等效,但并不标准的谓词:

expression ISNULL expression NOTNULL

不要写 expression = NULL ,因为 NULL 是不等于 NULL 的(控制代表一个未知的值,因此我们无法知道两个未知的数值是否相等)。

提示

有些应用可能要求表达式 expression = NULL 在 expression 得出空值时返回真。我们强烈建议这样的应用修改成遵循 SQL标准。但是,如果这样修改不可能完成,那么我们可以使用配置变量 transform_null_equals 。如果打开它,KingbaseES将把 x = NULL 子句转换成 x IS NULL 。

如果 expression 是行值,那么当行表达式本身为非空值或者行的所有域为非空时 IS NULL 为真。由于这种行为, IS NULL 和 IS NOT NULL 并不总是为行值表达式返回反转的结果,特别是,一个同时包含 NULL 和非空值的域将会对两种测试都返回假。在某些情况下,写成 row IS DISTINCT FROM NULL 或者 row IS NOT DISTINCT FROM NULL 会更好,它们只会检查整个行值是否为空而不需要在行的域上做额外的测试。

布尔值也可以使用下列谓词进行测试:

boolean_expression IS TRUE boolean_expression IS NOT TRUE boolean_expression IS FALSE boolean_expression IS NOT FALSE boolean_expression IS UNKNOWN boolean_expression IS NOT UNKNOWN

这些谓词将总是返回真或假,从来不返回空值,即使操作数是空也如此。空值输入被当做逻辑值“未知”。 请注意实际上 IS UNKNOWN 和 IS NOT UNKNOWN 分别与 IS NULL 和 IS NOT NULL 相同,只是输入表达式必须是布尔类型。

5.5. 排序规则操作符 ¶

collate操作符确定表达式的排序规则。

此操作符使您能够覆盖数据库使用标准排序规则派生规则为表达式派生的排序规则。

collate是后缀一元操作符。它与其他一元操作符具有相同的优先级,但在对所有前缀一元操作符求值后进行求值。 您可以将此操作符应用于CHAR、VARCHAR、VARCHAR2、TEXT。

collate的操作符是一个参数 ,参数以collation_name来代指。您可以为其指定命名排序规则。

以下描述了collate操作符:

操作符:COLLATE collation_name

目的:确定表达式的排序规则

例子:

CREATE TABLE students (student_id int ,first_name varchar(20) ,last_name varchar(25) CONSTRAINT stu_last_name_nn NOT NULL ,email varchar(25) CONSTRAINT stu_email_nn NOT NULL ,phone_number varchar(20) ,entrance_date Date DEFAULT SYSDATE CONSTRAINT stu_entrance_data_NN NOT NULL ,major_id varchar(10) CONSTRAINT stu_major_nn NOT NULL ,score int CONSTRAINT stu_sco_nn NOT NULL ,monitor_id int ,class_id int ); Select last_name from students ORDER BY last_name COLLATE "C"; 5.6. 连接操作符 ¶

连接操作符操作字符类数据、clob数据和raw数据。

操作符:||

目的:连接字符串、CLOB数据和raw数据。

示例:

CREATE TABLE students (student_id int ,first_name varchar(20) ,last_name varchar(25) CONSTRAINT stu_last_name_nn NOT NULL ,email varchar(25) CONSTRAINT stu_email_nn NOT NULL ,phone_number varchar(20) ,entrance_date Date DEFAULT SYSDATE CONSTRAINT stu_entrance_data_NN NOT NULL ,major_id varchar(10) CONSTRAINT stu_major_nn NOT NULL ,score int CONSTRAINT stu_sco_nn NOT NULL ,monitor_id int ,class_id int ); SELECT 'Name is' || last_name from students Order by last_name;

连接两个字符串的结果是另一个字符串。如果两个字符串都是CHAR类型,则结果只有CHAR类型。如果任一字符串是数据类型VARCHAR2,则结果是数据类型VARCHAR2。无论类型是字符串或者CLOB,在字符串末尾都是通过空格来间隔,并且串联保存。

尽管 KingbaseES 将零长度字符串视为空值,但将零长度字符串与另一个操作数连接总是会产生另一个操作数,因此 null 只能来自两个空字符串的连接。

5.7. 位串操作符 ¶

KingbaseES 提供操作类型为 bit 和 bit varying 值的操作符。除了常用的比较操作符之外,还可以使用下表所示的操作符。 & 、 | 和 # 的位串操作数必须等长。在移位的时候,保留原始的位串的的长度,如例子所示。

表 5.7.1 位串操作符 ¶

操作符

描述

例子

结果

||

连接

B'10001' || B'011'

10001011

&

按位与

B'10001' & B'01101'

00001

|

按位或

B'10001' | B'01101'

11101

#

按位异或

B'10001' # B'01101'

11100

~

按位求反

~ B'10001'

01110

按位右移

B'10001' >> 2

00100

5.8. 文本匹配操作符 ¶

KingbaseES提供了 LIKE 操作符进行文本匹配。特别的,还可以使用 ~~ 、 ~~* 等操作符。操作符 ~~ 等效于 LIKE , 而 ~~* 对应 ILIKE 。 还有 !~~ 和 !~~* 操作符分别代表 NOT LIKE 和 NOT ILIKE 。这些操作符都是KingbaseES特有的。

LIKE 操作符的语法如下:

string LIKE pattern [ESCAPE escape-character] string NOT LIKE pattern [ESCAPE escape-character]

如果该 ``string`` 匹配了提供的 ``pattern`` ,那么 LIKE 表达式返回真(和预期的一样,如果 LIKE 返回真,那么 NOT LIKE 表达式返回假, 反之亦然。一个等效的表达式是 NOT (string LIKE pattern ) 。

如果 ``pattern`` 不包含百分号或者下划线,那么该模式只代表它本身的串;这时候 LIKE 的行为就象等号操作符。在 ``pattern`` 里的下划线 ( _ )代表(匹配)任何单个字符; 而一个百分号( % )匹配任何零或更多个字符的序列。

一些例子:

'abc' LIKE 'abc' true 'abc' LIKE 'a%' true 'abc' LIKE '_b_' true 'abc' LIKE 'c' false

LIKE 匹配文本总是覆盖整个串。因此,要匹配在串内任何位置的序列,必须以百分号开头和结尾。

要匹配文本的下划线或者百分号,而不是匹配其它字符,在 ``pattern`` 里相应的字符必须前导转义字符。缺省的转义字符是反斜线,但是你可以用 ESCAPE 子句指定一个不同的转义字符。 要匹配转义字符本身,写两个转义字符。

注意

如果关掉了参数standard_conforming_strings ,在字符串常量中写的任何反斜线都需要被双写。

请注意反斜线在串文本里已经有特殊含义了,所以如果 包含反斜线的字符,需要在 SQL 语句里写两个反斜线。 因此,匹配单个反斜线的字符实际上要在语句里写四个反斜线。 可以通过用 ESCAPE 选择一个不同的转义字符 来避免这样;这样反斜线就不再是 LIKE 的特殊字符了。 但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜线。 我们也可以通过写 ESCAPE '' 的方式不选择转义字符,这样可以有效地禁用转义机制。

关键字 ILIKE 可以用于替换 LIKE , 它匹配文本时,字符大小写无关。这个不属于SQL标准而是一个KingbaseES扩展。

在仅需要从字符串的开始部分搜索的情况,还有前缀操作符 ^@ 和相应的 starts_with 函数可以使用。

5.9. 层次查询操作符 ¶

两个操作符PRIOR和CONNECT_BY_ROOT仅在层次查询中有效。

PRIOR

在层次查询中,CONNECT BY condition必须由PRIOR操作符限定一个表达式。如果CONNECT BY condition是复合的,那么只有一个条件需要PRIOR操作符,尽管您可以有多个PRIOR条件。PRIOR计算层次查询中当前行的父行的紧随其后的表达式。PRIOR在使用相等操作符比较列值时最常使用。(PRIOR关键字可以在操作符的任一侧。)PRIOR使KingbaseES使用列中父行的值。等号 (=) 以外的操作符理论上可以在CONNECT BY子句中使用。但是,这些其他操作符创建的条件可能会导致通过可能的组合的无限循环。在这种情况下,KingbaseES在运行时检测到循环并返回错误。

CONNECT_BY_ROOT

CONNECT_BY_ROOT是一元操作符,仅在层次查询中有效。当您使用此操作符限定列时,KingbaseES 使用根行中的数据返回列值。此操作符扩展了层次查询 的CONNECT BY[PRIOR ] 的功能。您不能在START WITH条件或CONNECT BY条件中指定此操作符。

5.10. 集合操作符 ¶

集合操作符将两个组件查询的结果组合成一个结果。包含集合操作符的查询称为复合查询。

下表为集合操作符相关内容:

表 5.10.1 集合操作符 ¶

操作符

返回的结果集

UNION

任一查询选择的所有不同行

UNION ALL

任一查询选择的所有行,包括所有重复项

INTERSECT

由两个查询都选择的行,重复的行出现一次

INTERSECT ALL

由两个查询都选择有行,重复的行出现一次

MINUS

由第一个查询而不是第二个查询选择的所有不同的行

MINUS ALL

第一个查询而不是第二个查询选择的所有行,包括重复的行

EXCEPT

由第一个查询而不是第二个查询选择的所有不同的行

EXCEPT ALL

由第一个查询而不是第二个查询选择的所有不同的行,包括重复的行

5.11. 自定义操作符 ¶

与内置操作符一样,用户定义的操作符将一组操作数作为输入并返回结果。您可以使用 CREATE OPERATOR 语句创建它们,并且它们由用户定义的名称标识。 定义新操作符后,您可以像使用任何其他内置操作符一样在 SQL 语句中使用它。例如,您可以在SELECT语句的目标列表、子句的条件WHERE或ORDER BY子句和GROUP BY子句中使用用户定义的操作符。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有