[关闭]
@liyuj 2018-01-04T16:04:05.000000Z 字数 30496 阅读 10726

Apache-Ignite-2.3.0-中文开发手册

2.SQL参考

2.1.摘要

本文档描述了Apache Ignite支持的SQL语法,其中包括:

2.2.数据定义语言(DDL)

2.2.1.ALTER TABLE

修改已有表的结构:

  1. ALTER TABLE [IF EXISTS] tableName
  2. ADD [COLUMN] {[IF NOT EXISTS] tableColumn | (tableColumn [,...])}
  3. tableColumn := columnName columnType [PRIMARY KEY]

ALTER TABLE的范围
目前,Ignite只支持增加新的列,在即将发布的版本中,命令的语法和功能将进一步扩展。

参数

描述
ALTER TABLE为之前创建的表增加一个或者多个列,列添加了之后,就可以在DML语句中进行访问,并且在CREATE INDEX语句中增加索引。
Ignite以键值对的形式存储数据,所有新增的列都属于值,键(PRIMARY KEY)所属的列是无法修改的。
ALTER TABLE语句在执行过程中,相同表的DDL和DML语句都会被阻塞一小段时间。
如果开启了Ignite的持久化,这个命令对应的模式改变也会被持久化到磁盘,因此即使整个集群重启也不会受到影响。
示例
给表增加一列:

  1. ALTER TABLE Person ADD COLUMN city varchar;

只有没有同名列时才会为表增加新列:

  1. ALTER TABLE City ADD COLUMN IF NOT EXISTS population int;

只有表存在时才会增加新列:

  1. ALTER TABLE IF EXISTS Missing ADD number long;

一次为表增加多个列:

  1. ALTER TABLE Region ADD COLUMN (code varchar, gdp double);

2.2.2.CREATE INDEX

为表创建索引。

  1. CREATE [SPATIAL] INDEX [[IF NOT EXISTS] indexName] ON tableName
  2. (columnName [ASC|DESC] [,...])

参数

描述
CREATE INDEX为指定的表创建一个新的索引,常规的索引存储于内部的B+树数据结构中,该B+树和实际的数据一样,在集群内进行分布,一个集群节点会存储其所属的数据对应的索引的一部分。
如果CREATE INDEX在运行时执行,那么数据库会在指定的索引列上同步地迭代,同一个表的其他DDL命令会被阻塞,直到CREATE INDEX执行完毕,但是DML语句的执行不受影响,还是并行地执行。
如果开启了Ignite的持久化,这个命令对应的模式改变也会被持久化到磁盘,因此即使整个集群重启也不会受到影响。
空间索引由JTS拓扑套件维护,具体可以参照相关的文档。
索引的权衡
为应用选择索引时,需要考虑很多事情。

索引每个字段是错误的!

有序索引示例
| A | B | C |
| 1 | 2 | 3 |
| 1 | 4 | 2 |
| 1 | 4 | 4 |
| 2 | 3 | 5 |
| 2 | 4 | 4 |
| 2 | 4 | 5 |
任意条件,比如a = 1 and b > 3,都会被视为有界范围,在log(N)时间内两个边界在索引中可以被快速检索到,然后结果就是两者之间的任何数据。
下面的条件会使用索引:
a = ?
a = ? and b = ?
a = ? and b = ? and c = ?
从索引的角度,条件a = ?c = ?不会好于a = ?
明显地,半界范围a > ?可以工作得很好。

示例
创建常规索引:

  1. CREATE INDEX title_idx ON books (title);

只有在不存在时创建倒序索引:

  1. CREATE INDEX IF NOT EXISTS name_idx ON persons (firstName DESC);

创建组合索引:

  1. CREATE INDEX city_idx ON sales (country, city);

创建空间索引:

  1. CREATE SPATIAL INDEX idx_person_address ON Person (address);

2.2.3.CREATE TABLE

创建一个新表及其底层的缓存。

  1. CREATE TABLE [IF NOT EXISTS] tableName (tableColumn [, tableColumn]...
  2. [, PRIMARY KEY (columnName [,columnName]...)])
  3. [WITH "paramName=paramValue [,paramName=paramValue]..."]
  4. tableColumn := columnName columnType [PRIMARY KEY]

参数

描述
CREATE TABLE会创建一个新的缓存,然后在其上定义一个新的SQL表,缓存以键-值对的形式存储数据,并且该表允许在数据上执行SQL查询。
表会驻留在PUBLIC模式中。
注意CREATE TABLE操作是同步的,在CREATE TABLE执行过程中会阻塞其他DDL命令的执行,DML命令的执行不受影响,还会以并行的方式执行。
如果希望使用键-值API访问数据,那么设置CACHE_NAME, KEY_TYPEVALUE_TYPE参数会比较有用,因为:

示例
创建Person表:

  1. CREATE TABLE IF NOT EXISTS Person (
  2. age int, id int, city_id int, name varchar, company varchar,
  3. PRIMARY KEY (name, id))
  4. WITH "template=partitioned,backups=1,affinitykey=city_id, key_type=PersonKey, value_type=MyPerson";

该命令执行后,做了如下事情:

下面的示例显示了如何通过指定的PRIMARY KEY来创建相同的表,然后覆写了和缓存有关的部分参数:

  1. CREATE TABLE Person (
  2. age int, id int PRIMARY KEY, city_id int, name varchar, company varchar)
  3. WITH "atomicity=transactional,cachegroup=somegroup";

2.2.4.DROP INDEX

删除表的一个索引。

  1. DROP INDEX [IF EXISTS] indexName

参数

描述
DROP INDEX命令会删除之前创建的一个索引。
相同表的其他DDL命令会被阻塞,直到DROP INDEX执行完成,DML命令的执行不受影响,仍然会以并行的方式执行。
如果开启了Ignite的持久化,这个命令对应的模式改变也会被持久化到磁盘,因此即使整个集群重启也不会受到影响。
示例
删除一个索引:

  1. DROP INDEX idx_person_name;

2.2.5.DROP TABLE

删除指定的表及其底层的索引。

  1. DROP TABLE [IF EXISTS] tableName

参数

描述
DROP TABLE命令会删除之前创建的一个表,底层的分布式缓存及其保存的数据也会被删除。
DROP TABLE命令执行过程中,相同表的其他DDL和DML命令都会被阻塞,,在表删除后,所有挂起的命令都会报错。
如果开启了Ignite的持久化,这个命令对应的模式改变也会被持久化到磁盘,因此即使整个集群重启也不会受到影响。
示例
如果Person表存在,将其删除:

  1. DROP TABLE IF EXISTS "Person";

2.3.数据操作语言(DML)

2.3.1.SELECT

从一张表或者多张表中获得数据。

  1. SELECT
  2. [TOP term] [DISTINCT | ALL] selectExpression [,...]
  3. FROM tableExpression [,...] [WHERE expression]
  4. [GROUP BY expression [,...]] [HAVING expression]
  5. [{UNION [ALL] | MINUS | EXCEPT | INTERSECT} select]
  6. [ORDER BY order [,...]]
  7. [{ LIMIT expression [OFFSET expression]
  8. [SAMPLE_SIZE rowCountInt]} | {[OFFSET expression {ROW | ROWS}]
  9. [{FETCH {FIRST | NEXT} expression {ROW | ROWS} ONLY}]}]

参数

描述
SELECT查询可以在分区复制模式的数据上执行。
当在全复制的数据上执行的时候,Ignite会将查询发送到某一个节点上,然后在其本地数据上执行。
另外,如果查询在分区数据上执行,那么执行流程如下:

关联
Ignite支持并置以及非并置的分布式SQL关联。
在分区和复制模式的数据集上进行关联也没有任何的限制。
但是,如果关联了分区模式的数据,那么要注意,要么将关联的键并置在一起,要么为查询开启非并置关联参数。
分组和排序优化
带有ORDER BY子句的SQL查询不需要将整个结果集加载到查询发起节点来进行完整的排序,而是查询映射的每个节点先对各自的结果集进行排序,然后汇总过程会以流式进行合并处理。
对于有序的GROUP BY查询也实现了部分优化,不需要将整个结果集加载到发起节点来进行分组,在Ignite中,每个节点的部分结果集可以流化、合并、聚合,然后逐步返回给应用。
示例
获取Person表的所有数据:

  1. SELECT * FROM Person;

获取所有数据,按照字典顺序排序:

  1. SELECT * FROM Person ORDER BY name;

计算某个城市的人口数量:

  1. SELECT city_id, COUNT(*) FROM Person GROUP BY city_id;

关联PersonCity表的数据:

  1. SELECT p.name, c.name
  2. FROM Person p, City c
  3. WHERE p.city_id = c.id;

2.3.2.INSERT

往表中插入数据。

  1. INSERT INTO tableName
  2. {[( columnName [,...])]
  3. {VALUES {({DEFAULT | expression} [,...])} [,...] | [DIRECT] [SORTED] select}}
  4. | {SET {columnName = {DEFAULT | expression}} [,...]}

参数

描述
INSERT命令在表中新增了一个条目。
因为Ignite是以键-值对的形式存储数据的,因此所有的INSERT语句最后都会被转换成键-值操作的集合。
如果单个键-值对正在加入缓存,那么最后INSERT语句会被转换成cache.putIfAbsent(...)操作,还有,如果插入多个键-值对,那么DML引擎会为每组数据创建一个EntryProcessor,然后使用cache.invokeAll(...)将数据注入缓存。
关于SQL引擎如何处理并发问题,可以看这里
示例
在表中插入一个新的Person

  1. INSERT INTO Person (id, name, city_id) VALUES (1, 'John Doe', 3);

Account表的数据注入Person表:

  1. INSERT INTO Person(id, name, city_id)
  2. (SELECT a.id + 1000, concat(a.firstName, a.secondName), a.city_id
  3. FROM Account a WHERE a.id > 100 AND a.id < 1000);

2.3.3.UPDATE

修改表中的数据。

  1. UPDATE tableName [[AS] newTableAlias]
  2. SET {{columnName = {DEFAULT | expression}} [,...]} |
  3. {(columnName [,...]) = (select)}
  4. [WHERE expression] [ORDER BY order [,...]] [LIMIT expression]

参数

描述
UPDATE命令会修改表中的已有数据。
因为Ignite以键-值对的形式存储数据,因此所有的UPDATE语句最后都会被转换成一组键-值操作。
开始时,SQL引擎会根据UPDATE语句的WHERE子句生成并且执行一个SELECT查询,然后只会修改该结果集范围内的数据。
修改是通过cache.invokeAll(...)执行的,这基本上意味着SELECT查询完成后,SQL引擎就会准备一定量的EntryProcessors,然后使用cache.invokeAll(...)进行执行。EntryProcessors修改完数据后,会进行额外的检查,确保在查询和执行实际的更新之间没有受到干扰。
关于SQL引擎如何处理并发问题,可以看这里

主键更新
Ignite不允许更新主键,因为主键和分区的映射关系是静态的。虽然分区及其数据可以修改所有者,但是键会一直属于一个固定的分区,该分区是根据主键使用一个哈希函数计算的。
因此,如果主键需要更新,那么这条数据应该先删除,更新后再插入。

示例
更新数据的name列:

  1. UPDATE Person SET name = 'John Black' WHERE id = 2;

根据Account表的数据更新Person表:

  1. UPDATE Person p SET name = (SELECT a.first_name FROM Account a WHERE a.id = p.id)

2.3.4.MERGE

将数据合并后入表。

  1. MERGE INTO tableName [(columnName [,...])]
  2. [KEY (columnName [,...])]
  3. {VALUES {({ DEFAULT | expression } [,...])} [,...] | select}

参数

MERGE命令会更新已有的条目,如果不存在会插入一个新的条目。
因为Ignite是以键-值对的形式存储数据的,因此所有的MERGE语句最后都会被转换成键-值操作的集合。
MERGE是非常明确的操作,它会根据要被插入和更新的数据行数翻译成对应的cache.put(...)cache.putAll(...)操作。
关于SQL引擎如何处理并发问题,可以看这里
示例
合并一组数据进Person表:

  1. MERGE INTO Person(id, name, city_id) VALUES
  2. (1, 'John Smith', 5),
  3. (2, 'Mary Jones', 5);

Account表获得数据,然后注入Person表:

  1. MERGE INTO Person(id, name, city_id)
  2. (SELECT a.id + 1000, concat(a.firstName, a.secondName), a.city_id
  3. FROM Account a WHERE a.id > 100 AND a.id < 1000);

2.3.5.DELETE

从表中删除数据。

  1. DELETE
  2. [TOP term] FROM tableName
  3. [WHERE expression]
  4. [LIMIT term]

参数

描述
DETELE命令会从一个表中删除数据。
因为Ignite以键-值对的形式存储数据,因此所有的DELETE语句最后都会被转换成一组键-值操作。
DELETE语句的执行会被拆分为两个阶段,和UPDATE语句的执行过程类似。
首先,使用一个SQL查询,SQL引擎会收集符合DELTE语句中WHERE子句的键,下一步,持有这些键之后,会创建一组EntryProcessors,调用cache.invokeAll(...)执行,在数据被删除之后,会进行额外的检查,确保在查询和执行实际的删除之间没有受到干扰。
关于SQL引擎如何处理并发问题,可以看这里
示例
Persons表中删除指定name的数据:

  1. DELETE FROM Person WHERE name = 'John Doe';

2.4.聚合函数

2.4.1.AVG

  1. AVG ([DISTINCT] expression)

参数

描述
取平均值,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效,返回值类型与参数值类型相同。

示例
计算玩家的平均年龄:

  1. SELECT AVG(age) "AverageAge" FROM Players;

2.4.2.BIT_AND

  1. BIT_AND (expression)

描述
所有非空值的按位与操作,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
对长度相等的两个二进制表达式的每一对对应的位执行逻辑与操作。
对于每个对,如果第一个为1且第二个也为1,则返回值为1,否则返回0。

2.4.3.BIT_OR

  1. BIT_OR (expression)

描述
所有非空值的按位或操作,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
对长度相等的两个二进制表达式的每一对对应的位执行逻辑或操作。
对于每个对,如果第一个为1或者第二个为1或者两者都为1,则返回值为1,否则返回0。

2.4.4.BOOL_AND

  1. BOOL_AND (boolean)

描述
如果所有的表达式都为true,则返回true,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
示例

  1. SELECT item, BOOL_AND(price > 10) FROM Items GROUP BY item;

2.4.5.BOOL_OR

  1. BOOL_OR (boolean)

描述
如果任意表达式为true,则返回true,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
示例

  1. SELECT BOOL_OR(CITY LIKE 'W%') FROM Users;

2.4.6.COUNT

  1. COUNT (* | [DISTINCT] expression)

描述
所有条目或者非空值的数量,该方法返回long型值,如果没有命中记录,返回值为0,该函数只对SELECT语句有效。
示例
计算每个城市玩家的数量:

  1. SELECT city_id, COUNT(*) FROM Players GROUP BY city_id;

2.4.7.MAX

  1. MAX (expression)

参数

描述
返回最大值,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效,返回值类型与参数值类型相同。
示例
获得最高的玩家:

  1. SELECT MAX(height) FROM Players;

2.4.8.MIN

  1. MIN (expression)

参数

描述
返回最小值,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效,返回值类型与参数值类型相同。
示例
获得最年轻的玩家:

  1. SELECT MIN(age) FROM Players;

2.4.9.SUM

  1. SUM ([DISTINCT] expression)

参数

描述
返回所有值的总和,如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效,返回值类型与参数值类型相同。
示例
获得所有玩家的总得分:

  1. SELECT SUM(goal) FROM Players;

2.4.10.SELECTIVITY

  1. SELECTIVITY (expression)

参数

描述
估算性能优化选择(0-100)。这个值被定义为(100 * distinctCount / rowCount)。0行的优化选择为0(未知)。该函数只对SELECT语句有效。
示例
计算first_namesecond_name列的选择性:

  1. SELECT SELECTIVITY(first_name), SELECTIVITY(second_name) FROM Player
  2. WHERE ROWNUM() < 20000;

2.4.11.STDDEV_POP

  1. STDDEV_POP ([DISTINCT] expression)

参数

描述
返回总体标准差。此方法返回一个double型值。如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
示例
计算玩家年龄的标准差:

  1. SELECT STDDEV_POP(age) from Players;

2.4.12.STDDEV_SAMP

  1. STDDEV_SAMP ([DISTINCT] expression)

参数

描述
返回样本标准差。此方法返回一个double型值。如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
示例
计算玩家年龄的样本标准差:

  1. SELECT STDDEV_SAMP(age) from Players;

2.4.13.VAR_POP

  1. VAR_POP ([DISTINCT] expression)

参数

描述
返回总体方差(总体标准方差)。此方法返回一个double型值。如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
示例
计算玩家年龄的总体方差:

  1. SELECT VAR_POP (age) from Players;

2.4.14.VAR_SAMP

  1. VAR_SAMP ([DISTINCT] expression)

参数

描述
返回样本方差(样本标准方差)。此方法返回一个double型值。如果没有命中记录,返回值为NULL,该函数只对SELECT语句有效。
示例
计算玩家年龄的样本方差:

  1. SELECT VAR_SAMP(age) FROM Players;

2.5.数值函数

2.5.1.ABS

  1. ABS (expression)

参数

描述
返回表达式的绝对值。
示例
计算绝对值:

  1. SELECT transfer_id, ABS (price) from Transfers;

2.5.2.ACOS

  1. ACOS (expression)

参数

描述
计算反余弦函数值,该函数返回double型值。
示例
获取反余弦值:

  1. SELECT acos(angle) FROM Triangles;

2.5.3.ASIN

  1. ASIN (expression)

参数

描述
计算反正弦函数值,该函数返回double型值。
示例
获取反余弦值:

  1. SELECT asin(angle) FROM Triangles;

2.5.4.ATAN

  1. ATAN (expression)

参数

描述
计算反正切函数值,该函数返回double型值。
示例
获取反余切值:

  1. SELECT atan(angle) FROM Triangles;

2.5.5.COS

  1. COS (expression)

参数

描述
计算余弦函数值,该函数返回double型值。
示例
获取余弦值:

  1. SELECT COS(angle) FROM Triangles;

2.5.6.COSH

  1. COSH (expression)

参数

描述
计算双曲余弦函数值,该函数返回double型值。
示例
获取双曲余弦值:

  1. SELECT COSH(angle) FROM Triangles;

2.5.7.COT

  1. COT (expression)

参数

描述
计算余切函数值,该函数返回double型值。
示例
获取余切值:

  1. SELECT COT(angle) FROM Triangles;

2.5.8.SIN

  1. SIN (expression)

参数

描述
计算正弦函数值,该函数返回double型值。
示例
获取正弦值:

  1. SELECT SIN(angle) FROM Triangles;

2.5.9.SINH

  1. SINH (expression)

参数

描述
计算双曲正弦函数值,该函数返回double型值。
示例
获取双曲正弦值:

  1. SELECT SINH(angle) FROM Triangles;

2.5.10.TAN

  1. TAN (expression)

参数

描述
计算正切函数值,该函数返回double型值。
示例
获取正切值:

  1. SELECT TAN(angle) FROM Triangles;

2.5.11.TANH

  1. TANH (expression)

参数

描述
计算双曲正切函数值,该函数返回double型值。
示例
获取双曲正切值:

  1. SELECT TANH(angle) FROM Triangles;

2.5.12.ATAN2

  1. ATAN2 (y, x)

参数

描述
将直角坐标转换成极坐标时的角度计算,该函数返回double型值。
示例
获取方位角:

  1. SELECT ATAN2(X, Y) FROM Triangles;

2.5.13.BITAND

  1. BITAND (y, x)

参数

描述
按位与操作,该函数返回double型值。
示例

  1. SELECT BITAND(X, Y) FROM Triangles;

2.5.14.BITGET

  1. BITGET (y, x)

参数

描述
当且仅当第一个参数在第二个参数指定的位置上存在二进制位组时返回true,该方法返回布尔值,第二个参数从0开始,最小有效位位置为0。
示例
检查第3位是否为1:

  1. SELECT BITGET(X, 3) from Triangles;

2.5.15.BITOR

  1. BITOR (y, x)

参数

描述
按位或操作,该方法返回long型值。
示例
计算两个字段的或操作:

  1. SELECT BITOR(X, Y) from Triangles;

2.5.16.BITXOR

  1. BITXOR (y, x)

参数

描述
按位异或操作,该方法返回long型值。
示例
计算两个字段的异或操作:

  1. SELECT BITXOR(X, Y) from Triangles;

2.5.17.MOD

  1. MOD (y, x)

参数

描述
取模操作,该方法返回long型值。
示例
计算两个字段的模:

  1. SELECT MOD(X, Y) from Triangles;

2.5.18.CEILING

  1. CEIL (expression)
  2. CEILING (expression)

参数

描述
可以参照Java的Math.ceil,该方法返回double型值。
示例
计算品类的向上取整价格:

  1. SELECT item_id, CEILING(price) FROM Items;

2.5.19.DEGREES

  1. DEGREES (expression)

参数

描述
可以参照Java的Math.toDegrees,该方法返回double型值。
示例
计算参数的角度值:

  1. SELECT DEGREES(X) FROM Triangles;

2.5.20.EXP

  1. EXP (expression)

参数

描述
可以参照Java的Math.exp,该方法返回double型值。
示例
计算exp:

  1. SELECT EXP(X) FROM Triangles;

2.5.21.FLOOR

  1. FLOOR (expression)

参数

描述
可以参照Java的Math.floor,该方法返回double型值。
示例
计算向下取整价格:

  1. SELECT FLOOR(X) FROM Items;

2.5.22.LOG

  1. LOG (expression)
  2. LN (expression)

参数

描述
可以参照Java的Math.log,该方法返回double型值。
示例
计算自然对数:

  1. SELECT LOG(X) from Items;

2.5.23.LOG10

  1. LOG10 (expression)

参数

描述
可以参照Java的Math.log10(Java5),该方法返回double型值。
示例
计算底数为10的对数:

  1. SELECT LOG10(X) from Items;

2.5.24.RADIANS

  1. RADIANS (expression)

参数

描述
可以参照Java的Math.toRadians,该方法返回double型值。
示例
计算参数的弧度值:

  1. SELECT RADIANS(X) FROM Triangles;

2.5.25.SQRT

  1. SQRT (expression)

参数

描述
可以参照Java的Math.sqrt,该方法返回double型值。
示例
计算参数的平方根:

  1. SELECT SQRT(X) FROM Items;

2.5.26.PI

  1. PI (expression)

参数

描述
可以参照Java的Math.PI,该方法返回double型值。
示例
计算参数的圆周率:

  1. SELECT PI(X) FROM Items;

2.5.27.POWER

  1. POWER (X, Y)

参数

描述
可以参照Java的Math.pow,该方法返回double型值。
示例
计算2的乘方:

  1. SELECT pow(2, n) FROM Rows;

2.5.28.RAND

  1. {RAND | RANDOM} ([expression])

参数

描述
调用函数时没有参数会生成下一个伪随机数,带参数时会使用会话的随机数生成器,,该方法返回从0(包含)到1(不包含)的一个double型值。
示例
为每个玩家生成一个随机数:

  1. SELECT random() FROM Play;

2.5.29.RANDOM_UUID

  1. {RANDOM_UUID | UUID} ()

描述
使用122伪随机位,返回一个新的UUID。
示例
为每个玩家生成一个随机数:

  1. SELECT UUID(),name FROM Player;

2.5.30.ROUND

  1. ROUND ( expression [, precision] )

参数

描述
四舍五入到指定的位数,如果未指定位数,则四舍五入到最近的long型值,该方法会返回一个数值(类型与输入相同)。
示例
将每个玩家的年龄转成整型值:

  1. SELECT name, ROUND(age) FROM Player;

2.5.31.ROUNDMAGIC

  1. ROUNDMAGIC (expression)

参数

描述
该方法会很好地对数值进行四舍五入,但是速度较慢。它对0附近的数值有特殊的处理,他只支持小于等于+/-1000000000000的数值。在内部,首先将值转成字符串,然后检查最后的4位,000x会变成0000,999x会变成999999,这些都是自动的,该方法返回double型值。
示例
对每个玩家的年龄进行四舍五入:

  1. SELECT name, ROUNDMAGIC(AGE/3*3) FROM Player;

2.5.32.SECURE_RAND

  1. SECURE_RAND (int)

参数

描述
生成安全加密的随机数,该方法返回字节。
示例
返回真正的随机数:

  1. SELECT name, SECURE_RAND(10) FROM Player;

2.5.33.SIGN

  1. SIGN (expression)

参数

描述
如果表达式值小于0,则返回-1,等于0,则返回0,否则返回1。
示例
返回每个值的符号:

  1. SELECT name, SIGN(VALUE) FROM Player;

2.5.34.ENCRYPT

  1. ENCRYPT (algorithmString , keyBytes , dataBytes)

参数

描述
使用密钥对数据进行加密,支持的算法为AES,块大小为16个字节,该方法返回字节。
示例
对玩家的名字进行加密:

  1. SELECT ENCRYPT('AES', '00', STRINGTOUTF8(Name)) FROM Player;

2.5.35.DECRYPT

  1. DECRYPT (algorithmString , keyBytes , dataBytes)

参数

描述
使用密钥对数据进行解密,支持的算法为AES,块大小为16个字节,该方法返回字节。
示例
对玩家的名字进行解密:

  1. SELECT DECRYPT('AES', '00', '3fabb4de8f1ee2e97d7793bab2db1116'))) FROM Player;

2.5.36.TRUNCATE

  1. {TRUNC | TRUNCATE} ({{numeric, digitsInt} | timestamp | date | timestampString})

描述
截断到一定的位数,该方法返回double型值。如果处理一个时间戳,会将截断到日期类型,如果处理一个日期,会将其截断到时间较少的一个日期,如果处理时间戳字符串,会将时间戳截断到一个日期类型。
示例

  1. TRUNCATE(VALUE, 2);

2.5.37.COMPRESS

  1. COMPRESS(dataBytes [, algorithmString])

参数

描述
使用指定的压缩算法压缩数据,支持的算法包括:LZF(快,但是压缩率较低,默认),DEFLATE(高压缩率)。压缩并不一定会减少大小,很小的对象以及冗余较少的对象会变得更大,该方法返回字节。
示例

  1. COMPRESS(STRINGTOUTF8('Test'))

2.5.38.EXPAND

  1. EXPAND(dataBytes)

参数

描述
解压缩通过COMPRESS函数压缩的数据,该方法返回字节。
示例

  1. UTF8TOSTRING(EXPAND(COMPRESS(STRINGTOUTF8('Test'))))

2.5.39.ZERO

  1. ZERO()

描述
返回0,该函数用于无法使用数值字面量的场景。
示例

  1. ZERO()

2.6.字符串函数

2.6.1.ASCII

  1. ASCII(string)

参数

描述
返回字符串中第一个字符的ASCII码值,该方法返回int型值。
示例

  1. select ASCII(name) FROM Players;

2.6.2.BIT_LENGTH

  1. BIT_LENGTH(string)

参数

描述
返回字符串的位数,该方法返回long型值,对于BLOB、CLOB、BYTES以及JAVA_OBJECT,需要使用精度,每个字符需要16位。
示例

  1. select BIT_LENGTH(name) FROM Players;

2.6.3.LENGTH

  1. {LENGTH | CHAR_LENGTH | CHARACTER_LENGTH} (string)

参数

描述
返回字符串的字符数,该方法返回long型值,对于BLOB、CLOB、BYTES以及JAVA_OBJECT,需要使用精度,每个字符需要16位。
示例

  1. SELECT LENGTH(name) FROM Players;

2.6.4.OCTET_LENGTH

  1. OCTET_LENGTH(string)

参数

描述
返回字符串的字节数,该方法返回long型值,对于BLOB、CLOB、BYTES以及JAVA_OBJECT,需要使用精度,每个字符需要2个字节。
示例

  1. SELECT OCTET_LENGTH(name) FROM Players;

2.6.5.CHAR

  1. {CHAR | CHR} (int)

参数

描述
返回ASCII码值对应的字符,该方法返回字符串。
示例

  1. SELECT CHAR(65)||name FROM Players;

2.6.6.CONCAT

  1. CONCAT(string, string [,...])

参数

描述
字符串连接,与操作符||不同,NULL参数会被忽略,不会导致结果变为NULL,该方法返回字符串。
示例

  1. SELECT CONCAT(NAME, '!') FROM Players;

2.6.7.CONCAT_WS

  1. CONCAT_WS(separatorString, string, string [,...])

参数

描述
通过一个分隔符对字符串连接,与操作符||不同,NULL参数会被忽略,不会导致结果变为NULL,该方法返回字符串。
示例

  1. SELECT CONCAT_WS(',', NAME, '!') FROM Players;

2.6.8.DIFFERENCE

  1. DIFFERENCE(X, Y)

参数

描述
返回两个字符串之间的差异,该方法返回整型值。
示例
计算玩家姓名的一致程度:

  1. select DIFFERENCE(T1.NAME, T2.NAME) FROM players T1, players T2
  2. WHERE T1.ID = 10 AND T2.ID = 11;

2.6.9.HEXTORAW

  1. HEXTORAW(string)

参数

描述
将十六进制字符串转换为普通字符串,4个十六进制字符转成一个普通字符。
示例

  1. SELECT HEXTORAW(DATA) FROM Players;

2.6.10.RAWTOHEX

  1. RAWTOHEX(string)

参数

描述
将字符串转换为十六进制形式,4个十六进制字符对应一个普通字符,该方法返回字符串类型。
示例

  1. SELECT RAWTOHEX(DATA) FROM Players;

2.6.11.INSTR

  1. INSTR(string, searchString, [, startInt])

参数

描述
返回要搜索的字符串在源字符串中的位置,如果指定了起始位置,之前的字符会被忽略,如果是负数,会返回最右侧的位置,如果未找到则返回0,注意该函数是区分大小写的。
示例
检查一个字符串是否包含@字符:

  1. SELECT INSTR(EMAIL,'@') FROM Players;

2.6.12.INSERT

  1. INSERT(originalString, startInt, lengthInt, addString)

参数

描述
在原字符串的指定位置插入额外的字符串,长度指的是在源字符串从指定开始位置开始删除的字符的长度,该方法返回字符串。
示例

  1. SELECT INSERT(NAME, 1, 1, ' ') FROM Players;

2.6.13.LOWER

  1. {LOWER | LCASE} (string)

参数

描述
将字符串转为小写。
示例

  1. SELECT LOWER(NAME) FROM Players;

2.6.14.UPPER

  1. {UPPER | UCASE} (string)

参数

描述
将字符串转为大写。
示例
下面的示例会将所有玩家的名字转为大写形式:

  1. SELECT UPPER(last_name) "LastNameUpperCase" FROM Players;

2.6.15.LEFT

  1. LEFT(string, int)

参数

描述
返回最左边的若干个字符。
示例
获取玩家名字的前三个字符:

  1. SELECT LEFT(NAME, 3) FROM Players;

2.6.16.RIGHT

  1. RIGHT(string, int)

参数

描述
返回最右边的若干个字符。
示例
获取玩家名字的后三个字符:

  1. SELECT RIGHT(NAME, 3) FROM Players;

2.6.17.LOCATE

  1. LOCATE(searchString, string [, startInt])

参数

描述
返回要搜索的字符串在源字符串中的位置,如果指定了起始位置,之前的字符会被忽略,如果是负数,会返回最右侧的位置,如果未找到则返回0。
示例
检查一个字符串是否包含@字符:

  1. SELECT LOCATE('.', NAME) FROM Players;

2.6.18.POSITION

  1. POSITION(searchString, string)

描述
返回要搜索的字符串在源字符串中的位置,可以参照LOCATE
示例

  1. SELECT POSITION('.', NAME) FROM Players;

2.6.19.LPAD

  1. LPAD(string, int[, paddingString])

描述
将字符串左补到指定的长度,如果长度比字符串长度小,后面会被截断,如果未指定补齐字符串,默认使用空格。
示例

  1. SELECT LPAD(AMOUNT, 10, '*') FROM Players;

2.6.20.RPAD

  1. RPAD(string, int[, paddingString])

描述
将字符串右补到指定的长度,如果长度比字符串长度小,后面会被截断,如果未指定补齐字符串,默认使用空格。
示例

  1. SELECT RPAD(TEXT, 10, '-') FROM Players;

2.6.21.LTRIM

  1. LTRIM(string)

描述
删除字符串开头的空格。
示例

  1. SELECT LTRIM(NAME) FROM Players;

2.6.22.RTRIM

  1. RTRIM(string)

描述
删除字符串末尾的空格。
示例

  1. SELECT RTRIM(NAME) FROM Players;

2.6.23.TRIM

  1. TRIM ([{LEADING | TRAILING | BOTH} [string] FROM] string)

描述
删除首尾的所有空格,通过一个字符串,也可以删除其他的字符。
示例

  1. SELECT TRIM(BOTH '_' FROM NAME) FROM Players;

2.6.24.REGEXP_REPLACE

  1. REGEXP_REPLACE(inputString, regexString, replacementString [, flagsString])

描述
替换每个匹配正则表达式的子串,具体可以参照Java的String.replaceAll()方法,如果参数都为空(除了可选的flagsString参数),返回结果也为空。
flagsString参数可以为icnm,其他的字符会出现异常,该参数可以同时使用多个标志位(比如im),后面的标志会覆盖前面的,比如ic等价于c

示例

  1. SELECT REGEXP_REPLACE(name, 'w+', 'W', 'i') FROM Players;

2.6.25.REGEXP_LIKE

  1. REGEXP_LIKE(inputString, regexString [, flagsString])

描述
用正则表达式进行字符串匹配,具体可以参照Java的Matcher.find()方法,如果参数都为空(除了可选的flagsString参数),返回结果也为空。
flagsString参数可以为icnm,其他的字符会出现异常,该参数可以同时使用多个标志位(比如im),后面的标志会覆盖前面的,比如ic等价于c

示例

  1. SELECT REGEXP_LIKE(name, '[A-Z ]*', 'i') FROM Players;

2.6.26.REPEAT

  1. REPEAT(string, int)

描述
返回重复若干次数的字符串。
示例

  1. SELECT REPEAT(NAME || ' ', 10) FROM Players;

2.6.27.REPLACE

  1. REPLACE(string, searchString [, replacementString])

描述
将文本中出现的所有搜索字符串替换为另一个字符串,如果未指定替换字符串,索索字符串会从原字符串中删除,如果参数都为空,则返回值为空。
示例

  1. SELECT REPLACE(NAME, ' ') FROM Players;

2.6.28.SOUNDEX

  1. SOUNDEX(string)

描述
返回表示字符串声音的四个字符码,具体可以看这里,该方法返回一个字符串。
示例

  1. SELECT SOUNDEX(NAME) FROM Players;

2.6.29.SPACE

  1. SPACE(int)

描述
返回由若干个空格组成的字符串。
示例

  1. SELECT name, SPACE(80) FROM Players;

2.6.30.STRINGDECODE

  1. STRINGDECODE(string)

描述
使用Java的字符串编码格式对已编码字符串进行转换,特殊字符为\b\t\n\f\r\"\\<octal>, \u<unicode>,该方法返回一个字符串。
示例

  1. STRINGENCODE(STRINGDECODE('Lines 1\nLine 2'));

2.6.31.STRINGENCODE

  1. STRINGENCODE(string)

描述
使用Java的字符串编码格式对字符串进行编码,特殊字符为\b\t\n\f\r\"\\<octal>, \u<unicode>,该方法返回一个字符串。
示例

  1. STRINGENCODE(STRINGDECODE('Lines 1\nLine 2'))

2.6.32.STRINGTOUTF8

  1. STRINGTOUTF8(string)

描述
将字符串转换成UTF-8格式的字符数组,该方法返回字节数组。
示例

  1. SELECT UTF8TOSTRING(STRINGTOUTF8(name)) FROM Players;

2.6.33.SUBSTRING

  1. {SUBSTRING | SUBSTR} (string, startInt [, lengthInt])

描述
返回一个字符串从指定位置开始的一个子串,如果开始位置为负数,那么开始位置会相对于字符串的末尾。长度是可选的。SUBSTRING(string [FROM start] [FOR length])也是支持的。
示例

  1. SELECT SUBSTR(name, 2, 5) FROM Players;

2.6.34.UTF8TOSTRING

  1. UTF8TOSTRING(bytes)

描述
将UTF-8编码的字符串解码成对应的字符串。
示例

  1. SELECT UTF8TOSTRING(STRINGTOUTF8(name)) FROM Players;

2.6.35.XMLATTR

  1. XMLATTR(nameString, valueString)

描述
以name=value的形式创建一个XML属性元素,value是以XML文本的形式进行编码,该方法返回一个字符串。
示例

  1. XMLNODE('a', XMLATTR('href', 'http://h2database.com'))

2.6.36.XMLNODE

  1. XMLNODE(elementString [, attributesString [, contentString [, indentBoolean]]])

描述
创建一个XML节点元素,如果属性字符串为空或者null,那么意味着这个节点没有属性,如果内容字符串为空或者null,那么这个节点是没有内容的,如果内容中包含换行,那么默认会被缩进,该方法返回一个字符串。
示例

  1. XMLNODE('a', XMLATTR('href', 'http://h2database.com'), 'H2')

2.6.37.XMLCOMMENT

  1. XMLCOMMENT(commentString)

描述
创建一个XML注释,两个减号(--)会被转换为- -。该方法返回一个字符串。
示例

  1. XMLCOMMENT('Test')

2.6.38.XMLCDATA

  1. XMLCDATA(valueString)

描述
创建一个XML CDATA元素,如果值中包含]]>,会创建一个XML文本元素作为替代,该方法返回一个字符串。
示例

  1. XMLCDATA('data')

2.6.39.XMLSTARTDOC

  1. XMLSTARTDOC()

描述
返回一个XML声明,结果为<?xml version=1.0?>
示例

  1. XMLSTARTDOC()

2.6.40.XMLTEXT

  1. XMLTEXT(valueString [, escapeNewlineBoolean])

描述
创建一个XML文本元素,如果启用,换行符会被转换为一个XML实体(&#),该方法返回一个字符串。
示例

  1. XMLSTARTDOC()

2.6.41.TO_CHAR

  1. TO_CHAR(value [, formatString[, nlsParamString]])

描述
该函数会格式化一个时间戳、数值或者文本。
示例

  1. TO_CHAR(TIMESTAMP '2010-01-01 00:00:00', 'DD MON, YYYY')

2.6.42.TRANSLATE

  1. TRANSLATE(value , searchString, replacementString]])

描述
该函数会用另一组字符替换字符串中一组字符。
示例

  1. TRANSLATE('Hello world', 'eo', 'EO')

2.7.日期和时间函数

2.7.1.CURRENT_DATE

  1. {CURRENT_DATE [()] | CURDATE() | SYSDATE | TODAY}

描述
返回当前日期,该方法在一个事务中会返回同一个值。
示例

  1. CURRENT_DATE()

2.7.2.CURRENT_TIME

  1. {CURRENT_TIME [ () ] | CURTIME()}

描述
返回当前时间,该方法在一个事务中会返回同一个值。
示例

  1. CURRENT_TIME()

2.7.3.CURRENT_TIMESTAMP

  1. {CURRENT_TIMESTAMP [([int])] | NOW([int])}

描述
返回当前时间戳,注意纳秒的精度参数是可选的,该方法在一个事务中会返回同一个值。
示例

  1. CURRENT_TIMESTAMP()

2.7.4.DATEADD

  1. {DATEADD| TIMESTAMPADD} (unitString, addIntLong, timestamp)

描述
为时间戳增加若干个单位。第一个字符串表示单位,使用负数可以做减法,如果操作毫秒addIntLong可以是一个long型值,否则限定为整型值。支持的单位与EXTRACT函数一致。DATEADD方法返回一个时间戳,TIMESTAMPADD方法返回一个long型值。
示例

  1. DATEADD('MONTH', 1, DATE '2001-01-31')

2.7.5.DATEDIFF

  1. {DATEDIFF | TIMESTAMPDIFF} (unitString, aTimestamp, bTimestamp)

描述
返回两个时间戳根据特定单位计算的差值,该方法返回long型值,第一个字符串表示单位,支持的单位与EXTRACT函数一致。
示例

  1. DATEDIFF('YEAR', T1.CREATED, T2.CREATED)

2.7.6.DAYNAME

  1. DAYNAME(date)

描述
返回日期的名字(英语)。
示例

  1. DAYNAME(CREATED)

2.7.7.DAY_OF_MONTH

  1. DAY_OF_MONTH(date)

描述
返回月中的日期数(1-31)。
示例

  1. DAY_OF_MONTH(CREATED)

2.7.8.DAY_OF_WEEK

  1. DAY_OF_WEEK(date)

描述
返回周中的天数(1表示周日)。
示例

  1. DAY_OF_WEEK(CREATED)

2.7.9.DAY_OF_YEAR

  1. DAY_OF_YEAR(date)

描述
返回年中的天数(1-366)。
示例

  1. DAY_OF_YEAR(CREATED)

2.7.10.EXTRACT

  1. EXTRACT ({YEAR | YY | MONTH | MM | WEEK | DAY | DD | DAY_OF_YEAR
  2. | DOY | HOUR | HH | MINUTE | MI | SECOND | SS | MILLISECOND | MS}
  3. FROM timestamp)

描述
返回时间戳中的特定值,该方法返回整型值。
示例

  1. EXTRACT(SECOND FROM CURRENT_TIMESTAMP)

2.7.11.FORMATDATETIME

  1. FORMATDATETIME (timestamp, formatString [,localeString [,timeZoneString]])

描述
将日期、时间或者时间戳格式化成字符串,最常用的格式符为:y:年,M:月,d:日期,H:小时,m:分钟,s:秒,要了解详细信息,可以看Java的java.text.SimpleDateFormat,该方法返回字符串。
示例

  1. FORMATDATETIME(TIMESTAMP '2001-02-03 04:05:06', 'EEE, d MMM yyyy HH:mm:ss z', 'en', 'GMT')

2.7.12.HOUR

  1. HOUR(timestamp)

描述
返回时间戳中的小时数(0-23)。
示例

  1. HOUR(CREATED)

2.7.13.MINUTE

  1. MINUTE(timestamp)

描述
返回时间戳中的分钟数(0-59)。
示例

  1. MINUTE(CREATED)

2.7.14.MONTH

  1. MONTH(timestamp)

描述
返回时间戳中的月数(1-12)。
示例

  1. MONTH(CREATED)

2.7.15.MONTHNAME

  1. MONTHNAME(date)

描述
返回月的名字(英语)。
示例

  1. MONTHNAME(CREATED)

2.7.16.PARSEDATETIME

  1. PARSEDATETIME(string, formatString [, localeString [, timeZoneString]])

描述
将字符串解析成时间戳类型,最常用的格式符为:y:年,M:月,d:日期,H:小时,m:分钟,s:秒,要了解详细信息,可以看Java的java.text.SimpleDateFormat。
示例

  1. PARSEDATETIME('Sat, 3 Feb 2001 03:05:06 GMT', 'EEE, d MMM yyyy HH:mm:ss z', 'en', 'GMT')

2.7.17.QUARTER

  1. QUARTER(timestamp)

描述
返回时间戳中的季度数(1-4)。
示例

  1. QUARTER(CREATED)

2.7.18.SECOND

  1. SECOND(timestamp)

描述
返回时间戳中的秒数(0-59)。
示例

  1. SECOND(CREATED)

2.7.19.WEEK

  1. WEEK(timestamp)

描述
返回时间戳中的周数(1-53),该方法使用系统当前的区域设置。
示例

  1. WEEK(CREATED)

2.7.20.YEAR

  1. YEAR(timestamp)

描述
返回时间戳中的年数。
示例

  1. YEAR(CREATED)

2.8.系统函数

2.8.1.COALESCE

  1. {COALESCE | NVL } (aValue, bValue [,...])

描述
返回第一个非空值。
示例

  1. COALESCE(A, B, C)

2.8.2.DECODE

  1. DECODE(value, whenValue, thenValue [,...])

描述
返回第一个匹配的值,NULL会匹配NULL,如果没有匹配的,那么会返回NULL或者最后一个参数(参数个数为偶数)。
示例

  1. DECODE(RAND()>0.5, 0, 'Red', 1, 'Black')

2.8.3.GREATEST

  1. GREATEST(aValue, bValue [,...])

描述
返回非空的最大值,如果所有值都为空则返回空。
示例

  1. GREATEST(1, 2, 3)

2.8.4.IFNULL

  1. IFNULL(aValue, bValue)

描述
如果aValue非空则返回aValue,否则返回bValue
示例

  1. IFNULL(NULL, '')

2.8.5.LEAST

  1. LEAST(aValue, bValue [,...])

描述
返回非空的最小值,如果所有值都为空则返回空。
示例

  1. LEAST(1, 2, 3)

2.8.6.NULLIF

  1. NULLIF(aValue, bValue)

描述
如果aValue等于bValue,则返回NULL,否则返回aValue
示例

  1. NULLIF(A, B)

2.8.7.NVL2

  1. NVL2(testValue, aValue, bValue)

描述
如果testValue为空,则返回bValue,否则返回aValue
示例

  1. NVL2(X, 'not null', 'null')

2.9.数据类型

本章节中列出了Ignite中支持的SQL数据类型列表,比如string、numeric以及date/time类型。
对于每个SQL类型来说,都会被映射到Ignite原生支持的编程语言或者驱动指定的类型上。

2.9.1.BOOLEAN

可选值:TRUEFALSE
映射:

2.9.2.INT

可选值:[-2147483648, 2147483647]。
映射:

2.9.3.TINYINT

可选值:[-128, 127]。
映射:

2.9.4.SMALLINT

可选值:[-32768, 32767]。
映射:

2.9.5.BIGINT

可选值:[-9223372036854775808, 9223372036854775807]。
映射:

2.9.6.DECIMAL

可选值:带有固定精度的数值类型。
映射:

2.9.7.DOUBLE

可选值:浮点数。
映射:

2.9.8.REAL

可选值:单精度浮点数。
映射:

2.9.9.TIME

可选值:时间数据类型,格式为hh:mm:ss
映射:

2.9.10.DATE

可选值:日期数据类型,格式为yyyy-MM-dd
映射:

2.9.11.TIMESTAMP

可选值:时间戳数据类型,格式为yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]
映射:

2.9.12.VARCHAR

可选值:Unicode字符串。
映射:

2.9.13.CHAR

可选值:Unicode字符串。支持这个类型是为了与旧的应用或者其他数据库进行兼容。
映射:

2.9.14.UUID

可选值:通用唯一标识符,长度128位。
映射:

2.9.15.BINARY

可选值:表示一个字节数组。
映射:

2.9.16.ARRAY

可选值:表示一个对象数组。
映射:

2.9.17.GEOMETRY

可选值:空间几何类型,基于com.vividsolutions.jts库,通常以文本格式表示。
映射:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注