Skip to content

内置SQL语句 ​

INSERT语句 ​

由Sql.insertInto()创建 或Sql.with()创建CTE后insert()创建

sql
INSERT INTO table VALUES (val1,val2...) ,(val1,val2...)... ;
INSERT INTO table (col1,col2,col3...) VALUES (val1,val2...) ,(val1,val2...)... ;
INSERT INTO table SELECT select_statement ;
WITH cte_calse INSERT INTO table SELECT select_statement ;

DELETE语句 ​

由Sql.deleteFrom()创建 或Sql.with()创建CTE后delete()创建

sql
DELTE FROM table WHERE condition... ;
WITH cte_calse DELTE FROM table WHERE condition... ;

UPDATE语句 ​

由Sql.update()创建 或Sql.with()创建CTE后update()创建

sql
UPDATE table SET xxx=xxx,xxx=xxx... ;
WITH cte_calse UPDATE table SET xxx=xxx,xxx=xxx... ;

SELECT 语句 ​

由Sql.select()创建 或Sql.with()创建CTE后select()创建

说明

  • table_ref 可以是子查询等
  • LIMIT ? OFFSET ?子句 根据数据库不同,使用LIMIT ? OFFSET ?或 OFFSET ? ROWS FETCH NEXT ? ROWS ONLY, 不支持ROW_NUMBER()方式,因此某些较老的数据库不被支持
sql
[WITH cte_clase]
SELECT [DISTINCT] selection...
[FROM table_ref]
[LEFT|RIGHT|FULL|CROSS|NATURAL JOIN table_ref [ON condition...]]
[WHERE condition...]
[GROUP BY col]
[HAVING condition...]
[LIMIT xxx [OFFSET xxx]]

集合运算/操作 ​

LIMIT 与 OFFSET 的约束

offset 不能脱离 limit 单独存在(上面的语法 [LIMIT xxx [OFFSET xxx]] 也体现了这点)。 若调用时 limit 为 null 而 offset 不为 null,会抛出 HcAstException。 即当前不支持"只偏移、不限制条数"的写法(如取第 11 行起的全部数据)。

sql
SELECT xxx UNION|INTERSECT|EXCEPT [ALL] SELECT xxx
[UNION|INTERSECT|EXCEPT [ALL] SELECT xxx]

集合运算不支持再次排序/分页

与 Select 不同,集合运算语句本身不再提供链式的 .orderBy() / .limit() / .offset()。 需要排序或限制条数时,请在参与运算的子查询(通常是最后一个 SELECT)内使用;实际是否生效取决于目标数据库。

CTE子句 ​

Sql.with()创建

Query可以是SELECT语句或集合运算/操作

sql
WITH [RECURSIVE] cte1 [(col_alias...)] AS ( Query)
[,cte2 [(col_alias...)] AS (Query)]

并非所有语句都支持所有数据库, 最终支持情况取决于数据库,如果数据不提供某些功能且没有可以优雅替代的方式 很可能就会执行出错,比如CTE支持