DQL操作

更新时间:
复制为 MD 格式

表格存储的 DQL 操作兼容 MySQL 的查询语法,支持 SELECT 查询、聚合函数和 Join 多表联接,还支持全文检索、向量检索、JSON 函数等多元索引查询。

前提条件

使用 SELECT 前需要创建映射关系,参见DDL 操作

查询数据

执行 SELECT 语句查询映射表中的数据。

说明
  • 子句执行优先级:WHERE > GROUP BY > HAVING > ORDER BY > LIMIT/OFFSET。

  • 使用多元索引映射表时,还支持全文检索、数组查询、嵌套类型查询、向量检索、JSON 函数等多元索引特有功能,详见全文检索

  • 当数据表同时存在二级索引和多元索引时,SQL 引擎自动选择合适的索引执行查询,详见SQL查询优化

语法

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

列名或列表达式,格式为 column_name | expression [AS alias]。使用 * 返回所有列。

table_references

目标表,可以是表名或 SELECT 子查询,格式为 table_name | select_statement。多表查询请参见 Join 章节。

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

限制返回行数。LIMIT row_count 返回前 N 行;LIMIT offset, row_countLIMIT row_count OFFSET offset 跳过 offset 行后返回 N 行。

示例

查询 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(*) 统计所有行,COUNT(column) 统计非 NULL 行。

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

联接类型:

  • INNER JOIN(默认):只返回两表中满足联接条件的行。

  • LEFT OUTER JOIN:返回左表所有行,右表无匹配时填充 NULL。

  • RIGHT OUTER JOIN:返回右表所有行,左表无匹配时填充 NULL。

  • CROSS JOIN:返回两表的笛卡尔积。

join_condition

指定两张表的联接列。使用 ON 指定条件,或使用 USING(column) 简化同名列的联接。以下两种写法等价:

SELECT * FROM t1 JOIN t2 ON t1.col_a = t2.col_a AND t1.col_b = t2.col_b;
    SELECT * FROM t1 JOIN t2 USING (col_a, col_b);

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;