DQL操作

更新時間:
Copy as MD

Table Store的 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 演算法

Table Store支援 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;