SQL查询
SELECT
c.customer_name,
SUM(p.price * o.order_quantity) AS total_amount
FROM
customers c
JOIN
orders o ON c.customer_id = o.customer_id
JOIN
products p ON o.product_id = p.product_id
GROUP BY
c.customer_id, c.customer_name
ORDER BY
total_amount DESC, c.customer_name ASC;
优化思路
- 索引选择:
- 在
orders
表的customer_id
字段上建立索引,这样在连接customers
表和orders
表时可以快速定位相关记录。因为我们要根据customer_id
关联两张表,此索引能加快连接操作。
- 在
orders
表的product_id
字段上建立索引,用于快速连接products
表,提高orders
表和products
表连接时的查询效率。
- 在
products
表的price
字段上建立索引,虽然在计算price * order_quantity
时不能直接利用索引优化计算,但在连接操作完成后,索引有助于更快地获取price
值。
- 查询结构优化:
- 使用
JOIN
操作而不是子查询来连接表,JOIN
操作通常在现代数据库中执行效率更高,尤其是对于大型数据集。
GROUP BY
子句在customer_id
和customer_name
上,这样能准确计算每个客户的总金额,并且在后续排序时,如果总金额相同,customer_name
已经在分组中确定,便于按客户名称升序排列。
ORDER BY
子句先按total_amount
降序排列,再按customer_name
升序排列,符合题目要求。在有合适索引的情况下,数据库可以更高效地完成这种排序操作。