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
。数据访问代理目前支持
COUNT
、SUM
、AVG
、MAX
、MIN
五种聚合函数。暂不支持聚合函数中使用表达式,其中AVG
仅支持数值类型。同时使用
GROUP BY
和ORDER 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_order
和order_item
这两张表的拆分维度必须相同。SELECT * FROM trade_order o JOIN order_item i ON o.order_id=i.order_id WHERE order_id IN (1,2);
子查询
仅单库单表类型数据库支持子查询。