SQL操作符

SQL操作符是一系列用于比较的函数,这些操作符广泛的用于select 语句的where从句中。

算数操作符

算术操作符通常出现在包含左操作数,操作符,(大部分情况下)右操作数组成的表达式中。

  • +和-:可以作为单元或2元操作符。当其作为单元操作符时,如+1, -2.5 或者-col_name, 表达的意思是该值乘以+1或者-1。因此单元操作符+返回的是未发生变化的值,单元操作符-改变了该值的符号位。用户可以将两个单元操作符叠加起来,比如++5(返回的是正值),-+2 或者+-2(这两种情况返回的是负值),但是用户不能使用连续的两个-号,因为--被解释为后面的语句是注释(用户在是可以使用两个-号的,此时需要在两个-号之间加上空格或圆括号,如-(-2)或者- -2,这两个数实际表达的结果是+2)。+或者-作为2元操作符时,例如2+2,3+1.5 或者col1 + col2,表达的含义是左值相应的加或者减去右值。左值和右值必须都是数字类型。

  • *和/: 分别代表着乘法和除法。两侧的操作数必须都是数据类型。当两个数相乘时,类型较小的操作数在需要的情况下类型可能会提升(比如SMALLINT提升到INT或者BIGINT 等),表达式的结果被提升到下一个较大的类型,比如TINYINT 乘以INT 产生的结果的类型会是BIGINT)。当两个数相乘时,为了避免精度丢失,操作数和表达式结果都会被解释成DOUBLE 类型。如果用户想把表达式结果转换成其他类型,需要用CAST 函数转换。

  • %:取模操作符。返回左操作数除以右操作数的余数。左操作数和右操作数都必须是整型。

  • &, |和^:按位操作符返回对两个操作数进行按位与,按位或,按位异或操作的结果。两个操作数都要求是一种整型类型。如果按位操作符的两个操作数的类型不一致,则类型小的操作数会被提升到类型较大的操作数,然后再做相应的按位操作。在1个表达式中可以出现多个算术操作符,用户可以用小括号将相应的算术表达式括起来。算术操作符通常没有对应的数学函数来表达和算术操作符相同的功能。比如我们没有MOD()函数来表示%操作符的功能。反过来,数学函数也没有对应的算术操作符。比如幂函数POW()并没有相应的 **求幂操作符。用户可以通过数学函数章节了解我们支持哪些算术函数。

Between操作符

在where从句中,表达式可能同时和上界和下界比较。如果表达式大于等于下界,同时小于等于上界的话,比较的结果是true。

语法:

expression BETWEEN lower_bound AND upper_bound

数据类型:通常expression的计算结果都是数字类型,该操作符也支持其他数据类型。如果必须要确保下界和上界都是可比较的字符,可以使用cast()函数。

使用说明:如果操作数是string类型时使用时,应该小心些。起始部分为上界的长字符串将不会匹配上界,该字符串比上界要大。between 'A' and 'M'不会匹配‘MJ’。如果需要确保表达式能够正常work,可以使用一些函数,如upper(), lower(), substr(), trim()。

举例:

mysql> select c1 from t1 where month between 1 and 6;

比较操作符

比较操作符用来判断列和列是否相等或者对列进行排序。=, !=, <>, <, <=, >, >=可以适用所有数据类型。其中<>符号是不等于的意思,和!=的功能是一样的。IN和BETWEEN操作符提供更简短的表达来描述相等、小于、大小等关系的比较。

In操作符

in操作符会和VALUE集合进行比较,如果可以匹配该集合中任何一元素,则返回TRUE。参数和VALUE集合必须是可比较的。所有使用in操作符的表达式都可以写成用OR连接的等值比较,但是IN的语法更简单些,更精准,更容易让Palo进行优化。

举例:

mysql> select * from small_table where tiny_column in (1,2);

Like操作符

该操作符用于和字符串进行比较。_用来匹配单个字符,%用来匹配多个字符。参数必须要匹配完整的字符串。通常,把%放在字符串的尾部更加符合实际用法。

举例:

mysql> select varchar_column from small_table where varchar_column like 'm%';
 +----------------+
 | varchar_column |
 +----------------+
 | milan          |
 +----------------+
 1 row in set (0.02 sec)

 mysql> select varchar_column from small_table where varchar_column like 'm____';
 +----------------+
 | varchar_column |
 +----------------+
 | milan          |
 +----------------+
 1 row in set (0.01 sec)

逻辑操作符

逻辑操作符返回一个BOOL值,逻辑操作符包括单元操作符和多元操作符,每个操作符处理的参数都是返回值为BOOL值的表达式。支持的操作符有:

  • AND: 2元操作符,如果左侧和右侧的参数的计算结果都是TRUE,则AND操作符返回TRUE。

  • OR: 2元操作符,如果左侧和右侧的参数的计算结果有一个为TRUE,则OR操作符返回TRUE。如果两个参数都是FALSE,则OR操作符返回FALSE。

  • NOT:单元操作符,反转表达式的结果。如果参数为TRUE,则该操作符返回FALSE;如果参数为FALSE,则该操作符返回TRUE。

举例:

mysql> select true and true;
 +-------------------+
 | (TRUE) AND (TRUE) |
 +-------------------+
 |                 1 |
 +-------------------+
 1 row in set (0.00 sec)

 mysql> select true and false;
 +--------------------+
 | (TRUE) AND (FALSE) |
 +--------------------+
 |                  0 |
 +--------------------+
 1 row in set (0.01 sec)

 mysql> select true or false;
 +-------------------+
 | (TRUE) OR (FALSE) |
 +-------------------+
 |                 1 |
 +-------------------+
 1 row in set (0.01 sec)

 mysql> select not true;
 +----------+
 | NOT TRUE |
 +----------+
 |        0 |
 +----------+
 1 row in set (0.01 sec)

正则表达式操作符

判断是否匹配正则表达式。使用POSIX标准的正则表达式,^用来匹配字符串的首部,$用来匹配字符串的尾部,.匹配任何一个单字符,*匹配0个或多个选项,+匹配1个多个选项,?表示分贪婪表示等等。正则表达式需要匹配完整的值,并不是仅仅匹配字符串的部分内容。如果想匹配中间的部分,正则表达式的前面部分可以写成^.* 或者 .*。 ^和$通常是可以省略的。RLKIE操作符和REGEXP操作符是同义词。|操作符是个可选操作符,|两侧的正则表达式只需满足1侧条件即可,|操作符和两侧的正则表达式通常需要用()括起来。

举例:

mysql> select varchar_column from small_table where varchar_column regexp '(mi|MI).*';
 +----------------+
 | varchar_column |
 +----------------+
 | milan          |
 +----------------+
 1 row in set (0.01 sec)

 mysql> select varchar_column from small_table where varchar_column regexp 'm.*';
 +----------------+
 | varchar_column |
 +----------------+
 | milan          |
 +----------------+
 1 row in set (0.01 sec)