产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
SELECT c_custkey, c_name, c_mktsegment FROM customer;
SELECT o_orderkey, o_custkey, o_orderdate, o_totalprice FROM orders;
* 可以查询表中的所有列:SELECT * FROM customer;
SELECT *,应显式指定需要的列。c_comment)。SELECTc_custkey AS customer_id,c_name AS customer_name,c_acctbal AS account_balanceFROM customer AS c;
WHERE 子句可以过滤查询结果,只返回满足条件的数据。SELECT c_custkey, c_name, c_acctbalFROM customerWHERE c_mktsegment = 'AUTOMOBILE';
SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersWHERE o_orderstatus = 'O'; -- O: Open, F: Finished, P: Pending
SELECT c_custkey, c_name, c_acctbalFROM customerWHERE c_acctbal > 5000.00;
SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersWHERE o_orderdate >= '1995-01-01';
BETWEEN 进行范围查询:SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersWHERE o_orderdate BETWEEN '1995-01-01' AND '1995-12-31';
AND、OR 组合多个条件:SELECT c_custkey, c_name, c_acctbal, c_mktsegmentFROM customerWHERE c_mktsegment = 'AUTOMOBILE'AND c_acctbal > 5000.00;
LIKE 进行模糊匹配:SELECT c_custkey, c_nameFROM customerWHERE c_name LIKE 'Customer%';
ORDER BY 子句可以对查询结果进行排序。SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersORDER BY o_orderdate;
ASC:SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersORDER BY o_orderdate ASC;
SELECT c_custkey, c_name, c_acctbalFROM customerORDER BY c_acctbal DESC;
SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersORDER BY o_orderdate DESC;
SELECT o_orderkey, o_orderdate, o_totalprice, o_orderpriorityFROM ordersORDER BY o_orderdate DESC, o_totalprice DESC;
ORDER BY 的列上建立索引,避免 filesort。ORDER BY 的列顺序应与索引定义顺序一致。-- 创建组合索引CREATE INDEX idx_orderdate_totalprice ON orders(o_orderdate DESC, o_totalprice DESC);-- 此查询可以直接使用索引,避免排序SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersORDER BY o_orderdate DESC, o_totalprice DESC;
EXPLAIN 查看执行计划:EXPLAIN SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersORDER BY o_orderdate DESC;
Using filesort,说明使用了索引排序,性能最优。LIMIT 子句可以限制返回的结果行数,常用于分页查询或获取 Top N 结果。SELECT o_orderkey, o_orderdate, o_totalpriceFROM ordersORDER BY o_totalprice DESCLIMIT 10;
SELECT c_custkey, c_name, c_acctbalFROM customerORDER BY c_acctbal DESCLIMIT 20;
LIMIT offset, count 或 LIMIT count OFFSET offset 进行分页:-- 查询第 2 页数据(每页 20 条)SELECT c_custkey, c_name, c_acctbalFROM customerORDER BY c_custkeyLIMIT 20, 20; -- offset=20, count=20
-- 更清晰的写法SELECT c_custkey, c_name, c_acctbalFROM customerORDER BY c_custkeyLIMIT 20 OFFSET 20;
LIMIT 10 只需找到10条数据即可返回。LIMIT。ORDER BY ... LIMIT N 会使用堆排序算法,空间复杂度 O(N)。-- 无 LIMIT:需要扫描全表并排序SELECT o_orderkey, o_totalpriceFROM ordersORDER BY o_totalprice DESC;-- 扫描行数: 1,500,000 (全表)-- 有 LIMIT:提前终止SELECT o_orderkey, o_totalpriceFROM ordersORDER BY o_totalprice DESCLIMIT 10;-- 扫描行数: ~10(使用索引)或使用堆排序优化
-- 性能差:需要扫描并跳过前 1,000,000 行SELECT o_orderkey, o_orderdateFROM ordersORDER BY o_orderkeyLIMIT 1000000, 20;
-- 方式一:记录上次查询的最大 IDSELECT o_orderkey, o_orderdateFROM ordersWHERE o_orderkey > 1000000 -- 上次最后一条记录的 IDORDER BY o_orderkeyLIMIT 20;-- 方式二:使用覆盖索引 + 延迟关联SELECT o.o_orderkey, o.o_orderdate, o.o_totalpriceFROM orders oINNER JOIN (SELECT o_orderkeyFROM ordersORDER BY o_orderkeyLIMIT 1000000, 20) tmp ON o.o_orderkey = tmp.o_orderkey;
COUNT、SUM、AVG、MAX、MIN 等。SELECT COUNT(*) AS total_ordersFROM orders;
SELECT SUM(o_totalprice) AS total_salesFROM orders;
SELECTMAX(o_totalprice) AS max_order_amount,MIN(o_totalprice) AS min_order_amount,AVG(o_totalprice) AS avg_order_amountFROM orders;
GROUP BY 对数据进行分组统计。SELECTc_mktsegment,COUNT(*) AS customer_countFROM customerGROUP BY c_mktsegmentORDER BY customer_count DESC;
SELECTYEAR(o_orderdate) AS order_year,COUNT(*) AS order_count,SUM(o_totalprice) AS total_sales,AVG(o_totalprice) AS avg_order_amountFROM ordersGROUP BY YEAR(o_orderdate)ORDER BY order_year DESC;
SELECTo_orderstatus,COUNT(*) AS status_count,SUM(o_totalprice) AS total_amountFROM ordersGROUP BY o_orderstatus;
HAVING 用于过滤分组后的结果(与 WHERE 过滤原始行不同)。SELECTo_custkey,COUNT(*) AS order_count,SUM(o_totalprice) AS total_spentFROM ordersGROUP BY o_custkeyHAVING COUNT(*) > 1000ORDER BY total_spent DESC;
SELECTYEAR(o_orderdate) AS order_year,AVG(o_totalprice) AS avg_amountFROM ordersGROUP BY YEAR(o_orderdate)HAVING AVG(o_totalprice) > 10000ORDER BY order_year;
DISTINCT 进行去重统计:SELECT COUNT(DISTINCT c_mktsegment) AS segment_countFROM customer;
SELECT COUNT(DISTINCT o_custkey) AS active_customersFROM orders;
-- 在 GROUP BY 列上建立索引CREATE INDEX idx_mktsegment ON customer(c_mktsegment);-- 此查询可以利用索引加速分组SELECT c_mktsegment, COUNT(*)FROM customerGROUP BY c_mktsegment;
GROUP BY 的列是索引前缀时,TDSQL Boundless 可以跳过不相关的索引记录。EXPLAIN 查看是否使用了 Using index for group-by。-- 创建覆盖索引CREATE INDEX idx_orderdate_totalprice ON orders(o_orderdate, o_totalprice);-- 此查询无需回表,直接从索引读取SELECTYEAR(o_orderdate) AS order_year,SUM(o_totalprice) AS total_salesFROM ordersGROUP BY YEAR(o_orderdate);
-- 假设 orders 表按年份分区-- 此查询只扫描 1995 年的分区SELECTCOUNT(*) AS order_count,SUM(o_totalprice) AS total_salesFROM ordersWHERE o_orderdate BETWEEN '1995-01-01' AND '1995-12-31';
文档反馈