表格存储的 DQL 操作兼容 MySQL 的查询语法,支持 SELECT 查询、聚合函数和 Join 多表联接,还支持全文检索、向量检索、JSON 函数等多元索引查询。
前提条件
使用 SELECT 前需要创建映射关系,参见DDL 操作。
查询数据
执行 SELECT 语句查询映射表中的数据。
语法
SELECT
[ALL | DISTINCT | DISTINCTROW]
select_expr [, select_expr] ...
[FROM table_references | join_expr]
[WHERE where_condition]
[GROUP BY groupby_condition]
[HAVING having_condition]
[ORDER BY order_condition]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]参数
参数 | 是否必选 | 说明 |
ALL | DISTINCT | DISTINCTROW | 否 | 结果去重模式。ALL(默认)返回所有行;DISTINCT 去掉结果集中的重复行;DISTINCTROW 与 DISTINCT 等效。 |
select_expr | 是 | 列名或列表达式,格式为 |
table_references | 是 | 目标表,可以是表名或 SELECT 子查询,格式为 |
where_condition | 否 | WHERE 子句,支持主键等值/范围条件、逻辑运算符(AND/OR/NOT)、比较运算符(=、>、<、>=、<=、!=)、IN、LIKE、IS NULL、BETWEEN 等。 |
groupby_condition | 否 | GROUP BY 子句,按指定列分组,通常与聚合函数配合使用。 |
having_condition | 否 | HAVING 子句,对 GROUP BY 的分组结果进行过滤。 |
order_condition | 否 | ORDER BY 子句,按指定列排序。支持 ASC(升序,默认)和 DESC(降序)。 |
LIMIT / OFFSET | 否 | 限制返回行数。 |
示例
查询 exampletable 中所有数据,最多返回 20 行:
SELECT * FROM exampletable LIMIT 20;按条件查询并排序:
SELECT pk, col_long, col_keyword FROM exampletable WHERE col_long > 100 ORDER BY col_long DESC LIMIT 10;去重查询:
SELECT DISTINCT col_keyword FROM exampletable;分组统计:
SELECT col_keyword, COUNT(*) AS cnt FROM exampletable GROUP BY col_keyword HAVING cnt > 1;分页查询(跳过前 10 行,返回 5 行):
SELECT * FROM exampletable LIMIT 10, 5;聚合函数
聚合函数对多行数据的指定字段执行计算并返回统计结果,支持与 GROUP BY 配合使用。
函数 | 返回类型 | 说明 |
COUNT() | BIGINT | 返回匹配指定条件的行数。 |
COUNT(DISTINCT) | BIGINT | 返回指定列不同值的数量。 |
SUM() | DOUBLE | 返回数值列的总和。 |
AVG() | DOUBLE | 返回数值列的平均值。 |
MAX() | 与列类型一致 | 返回一列中的最大值。 |
MIN() | 与列类型一致 | 返回一列中的最小值。 |
示例
SELECT COUNT(*) FROM exampletable;
SELECT SUM(col_long), AVG(col_long) FROM exampletable;
SELECT col_keyword, COUNT(*) AS cnt, MAX(col_long) FROM exampletable GROUP BY col_keyword;Join
通过 Join 可将两张或多张表按联接条件联接,返回满足条件的数据行。
语法
table_references join_type table_references [ ON join_condition | USING ( join_column [, ...] ) ]
table_references : {
table_name [ [ AS ] alias_name ]
| select_statement
}
join_type : {
[ INNER ] JOIN
| LEFT [ OUTER ] JOIN
| RIGHT [ OUTER ] JOIN
| CROSS JOIN
}参数
参数 | 是否必选 | 说明 |
table_references | 是 | 联接的目标表,可以是表名(可附带别名)或 SELECT 子查询。表在 JOIN 关键词的左侧为左表,右侧为右表。 |
join_type | 是 | 联接类型:
|
join_condition | 是 | 指定两张表的联接列。使用 |
Join 算法
表格存储支持 INDEX JOIN 和 HASH JOIN 两种算法,默认使用 INDEX JOIN。当右表的联接列不满足索引条件时,系统自动切换为 HASH JOIN。
算法 | 适用条件 | 说明 |
INDEX JOIN | 右表联接列满足索引条件 | 从左表读取数据,利用右表的索引或主键查找匹配行。右表联接列必须满足以下条件之一:
|
HASH JOIN | 联接列不满足 INDEX JOIN 条件 | 从左表读取数据构建哈希表,再用右表的行探测哈希表判断是否匹配,无索引限制。 |
右表缺少合适的索引时,INDEX JOIN 会退化为全表扫描。为联接列和过滤列添加索引可以显著提升查询速度。
联接行数较少时INNER JOIN性能更优 ,联接行数较多时HASH JOIN性能更优。将数据量更少的表放在左侧可进一步提升性能。
示例
假设有 orders 和 customers 两张表:
-- orders 表
+----------+-------------+------------+--------------+
| order_id | customer_id | order_date | order_amount |
+----------+-------------+------------+--------------+
| 1001 | 1 | 2023-01-01 | 50 |
| 1002 | 2 | 2023-01-02 | 80 |
| 1003 | 3 | 2023-01-03 | 180 |
| 1004 | 4 | 2023-01-04 | 220 |
| 1005 | 6 | 2023-01-05 | 250 |
+----------+-------------+------------+--------------+
-- customers 表
+-------------+---------------+----------------+
| customer_id | customer_name | customer_phone |
+-------------+---------------+----------------+
| 1 | Alice | 11111111111 |
| 2 | Bob | 22222222222 |
| 3 | Carol | 33333333333 |
| 4 | David | 44444444444 |
| 5 | Eve | 55555555555 |
+-------------+---------------+----------------+INNER JOIN 只返回两表中 customer_id 匹配的行,订单 1005(customer_id=6)因右表无匹配而被排除。
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id;
-- 等价写法:
SELECT * FROM orders JOIN customers USING(customer_id);LEFT JOIN 返回左表(orders)所有行,右表无匹配时对应列填充 NULL。
SELECT * FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id;CROSS JOIN 返回两表的笛卡尔积。
SELECT * FROM orders CROSS JOIN customers;