5. 操作符
操作符操作数据项并返回结果。从语法上讲,操作符出现在操作数之前或之后或两个操作数之间。
本章包含以下部分:
本章讨论非逻辑(非布尔)操作符。这些操作符本身不能用作查询或子查询中的 WHERE 或者 HAVING 子句的条件。
5.1. SQL 相关操作符
操作符操纵的独立数据称为操作数或参数。操作符由特殊字符或关键字组成。例如,乘法操作符由星号 (*) 表示。
-
一元和二元操作符
两种通用类型的操作符是:
unary:一元操作符仅对一个操作数进行操作。一元操作符通常以下列格式与其操作数一起出现:
operator operand
binary:二元操作符对两个操作数进行操作。二元操作符及其操作数以这种格式出现:
operand1 operator operand2
其他具有特殊格式的操作符接受两个以上的操作数。如果给操作符一个空操作数,则结果始终为空。唯一不遵循此规则的操作符是连接 (||)。
-
操作符优先级
优先级是 Kingbase 数据库在同一表达式中计算不同操作符的顺序。在计算包含多个操作符的表达式时,Kingbase 在计算优先级较低的操作符之前先计算优先级较高的操作符。Kingbase 在表达式中从左到右计算具有相同优先级的操作符。 以下列出了 SQL 操作符的优先级从高到低。列在同一行的操作符具有相同的优先级。
-
操作符:+, -, (作为一元操作符), PRIOR, CONNECT_BY_ROOT,COLLATE 身份、否定、层次结构中的位置
-
操作符:*, /, 乘法、除法
-
操作符:+, -, (作为二元操作符), || 加法、减法、连接
在下面的表达式中,乘法的优先级高于加法,因此 Kingbase 先计算 2 乘以 3,然后将结果加 1。
1+2*3
您可以在表达式中使用括号来覆盖操作符优先级。Kingbase 在计算括号外的表达式之前先计算括号内的表达式。
SQL 还支持集合操作符(UNION、UNION ALL、INTERSECT 和 MINUS),它们组合查询返回的行集合,而不是单个数据项。所有集合操作符具有相同的优先级。
-
5.2. 算术操作符
您可以使用带有一个或两个参数的算术操作符来对数值进行求反、加法、减法、乘法和除法。其中一些操作符也用于时间日期和时间间隔类型的计算。操作符的参数必须解析为数字数据类型或任何可以隐式转换为数字数据类型的数据类型。
一元算术操作符返回与参数的数值数据类型相同的数据类型。对于二元算术操作符,Kingbase 确定具有最高数值优先级的参数,将其余参数隐式转换为该数据类型,并返回该数据类型。
以下列出了算出操作符
操作符:+,-, 当这些表示正或负表达式时,它们是一元操作符。
示例:
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 studens where -score < 0 ORDER BY student_id;
操作符:+,-, 当它们加或减时,它们是二元操作符。
示例:
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 entrance_date FROM students WHERE SYSDATE - entrance_date > 365 ORDER BY entrance_date;
操作符:*,/ 乘,除。 这些是二元操作符。
示例:Update students SET score = score * 1.1;
5.3. 排序规则操作符
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.4. 连接操作符
连接操作符操作字符类数据和 clob 数据。
操作符:||
目的:连接字符串或 CLOB 数据。
示例:
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,在字符串末尾都是通过空格来间隔,并且串联保存。
尽管 Kingbase 将零长度字符串视为空值,但将零长度字符串与另一个操作数连接总是会产生另一个操作数,因此 null 只能来自两个空字符串的连接。
5.5. 层次查询操作符
两个操作符 PRIOR 和 CONNECT_BY_ROOT 仅在层次查询中有效。
PRIOR
在层次查询中,CONNECT BY condition 必须由 PRIOR 操作符限定一个表达式。如果 CONNECT BY condition 是复合的,那么只有一个条件需要 PRIOR 操作符,尽管您可以有多个 PRIOR 条件。PRIOR 计算层次查询中当前行的父行的紧随其后的表达式。PRIOR 在使用相等操作符比较列值时最常使用。(PRIOR 关键字可以在操作符的任一侧。)PRIOR 使 Kingbase 使用列中父行的值。等号 (=) 以外的操作符理论上可以在 CONNECT BY 子句中使用。但是,这些其他操作符创建的条件可能会导致通过可能的组合的无限循环。在这种情况下,Kingbase 在运行时检测到循环并返回错误。
CONNECT_BY_ROOT
CONNECT_BY_ROOT 是一元操作符,仅在层次查询中有效。当您使用此操作符限定列时,Kingbase 使用根行中的数据返回列值。此操作符扩展了层次查询 的 CONNECT BY [PRIOR] 的功能。您不能在 START WITH 条件或 CONNECT BY 条件中指定此操作符。
5.6. 集合操作符
集合操作符将两个组件查询的结果组合成一个结果。包含集合操作符的查询称为复合查询。
以下为集合操作符相关内容
5.7. 自定义操作符
与内置操作符一样,用户定义的操作符将一组操作数作为输入并返回结果。但是,您使用 CREATE OPERATOR 语句创建它们,并且它们由用户定义的名称标识。 定义新操作符后,您可以像使用任何其他内置操作符一样在 SQL 语句中使用它。例如,您可以在 SELECT 语句的目标列表、子句的条件 WHERE 或 ORDER BY 子句和 GROUP BY 子句中使用用户定义的操作符。