SELECT 语法

在使用数据访问代理时,您可以通过 SELECT 语句从一张或多张表中查询数据。

基本语法

[HINT]SELECT
[ALL]
    select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr}
[ORDER BY {col_name | expr}
[ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE]

语法说明

  • HINT:表示数据访问代理自定义的 HINT 语法,可以用 HINT 指定具体的分库分表查询。更多有关 HINT 的信息,参见 自定义 HINT

  • select_expr:表示 SELECT 语句要查询的列或者聚合函数表达式,可以使用 *

  • table_references:表示从哪些表中查询数据,支持单表及多张表。

  • WHERE:表示查询条件,从表中获取满足 where_condition 的行。若没有条件,需要使用 HINT 指定具体的分库分表或全表扫描,否则 SQL 会报错。

  • GROUP BY:表示聚合条件,可以是具体的列名或者表达式,暂不支持 HAVING 子句。

  • ORDER BY:表示排序条件,可以是具体的列名或者表达式,可以自定升序 ASC(默认)或者降序 DESC

  • LIMIT:表示输出的 OFFSET 和行数。如果没有指定 OFFSET,则表示从 0 行开始输出,输出 row_count 数量的行。

  • FOR UPDATE:表示对查询的行加上排他锁,阻止并发修改,或阻止在某些事务隔离级别时的并发读取。在全表扫描下,FOR UPDATE 暂不支持全局排他锁。

使用限制

在数据访问代理中使用 SELECT 语句进行数据查询时,您需要注意以下使用限制。

普通查询

  • 分库分表查询条件要带上拆分键,否则要使用 HINT 指定分库分表或全表扫描。

  • 带拆分键查询仅支持 =in,不支持范围查询。

  • LIMIT 若有两个参数,第一个参数表示返回第一行的偏移量,第二个参数表示返回的行数。若仅有一个参数,则表示返回的行数,默认偏移量为 0。

聚合查询

  • 全表的聚合查询,需要显示使用 HINT,例如 /*+DBP: $ROUTE={SCAN_ALL()}*/ SQL

  • 数据访问代理目前支持 COUNTSUMAVGMAXMIN 五种聚合函数。暂不支持聚合函数中使用表达式,其中 AVG 仅支持数值类型。

  • 同时使用 GROUP BYORDER BY 时,需尽量保证 ORDER BY 后面的表达式或者字段与 GROUP BY 保持一致,否则会占用较多内存计算,影响性能。例如,在下面的语句中,ORDER BY 后面的字段与 GROUP BY 不一致,容易影响性能。

    SELECT * FROM trade_order GROUP BY trade_no ORDER BY trade_time

JOIN 查询

  • 全表的 JOIN 查询需要显示使用 HINT,例如 /*+DBP: $ROUTE={SCAN_ALL()}*/ SQL

  • 数据访问代理目前支持业务表和 广播表 的聚合查询,例如:

    SELECT * FROM trade_order o JOIN config c on o.org_id = c.org_id WHERE order_id IN (1,2)
  • 数据访问代理仅支持拆分维度相同的业务表联合查询。相同拆分维度指的是表拆分键相同、所属同一个逻辑库并且数量相同。例如,在下面的语句中,trade_orderorder_item 这两张表的拆分维度必须相同。

    SELECT * FROM trade_order o JOIN order_item i ON o.order_id=i.order_id  WHERE order_id IN (1,2);

子查询

仅单库单表类型数据库支持子查询。