DQL操作
Table Store的 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 演算法
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;