MYSQL的SUM和JOIN命令案例

这篇博客介绍了如何使用MySQL的SUM、JOIN等命令进行数据聚合和表连接操作。内容包括计算产品数量、总销售额、按不同维度进行分组求和、平均值计算,以及特定日期范围内的销售数据。同时,展示了JOIN命令的使用,结合中文字段名的实际案例,说明了如何在多表之间进行数据查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                            Demo表(一定要要注意date的格式为datetime)

  • 计算所有产品数量

SELECT SUM( num ) AS n
FROM `demo`

  • 按产品名排列并计算每个产品的总数量

SELECT name, SUM( num ) AS n
FROM `demo`
GROUP BY name
LIMIT 0 , 30

  • 计算总销售额

 SELECT SUM( price * num ) AS total
FROM `demo`

  • 按产品排列并计算出每个产品销售总数和销售额

SELECT name, SUM( num ) AS N, SUM( price * num ) AS total
FROM `demo`
GROUP BY name
LIMIT 0 , 30

  • 按产品排列查询每个产品的平均价

SELECT name, AVG( price ) AS AVG
FROM `demo`
GROUP BY name
LIMIT 0 , 30

  • 按日期排列查询是销售产品的数量和销售额

SELECT DATE( DATE ) AS
DAY , SUM( num ) AS N, SUM( price * num ) AS total
FROM `demo`
GROUP BY DAY
LIMIT 0 , 30

  • 按日期和商品名排列查询是销售产品的数量和销售额

SELECT DATE( DATE ) AS
DAY , name, SUM( num ) AS N, SUM( price * num ) AS total
FROM `demo`
GROUP BY DAY , name
LIMIT 0 , 30

  • 按日期排列查询是销售产品的数量和销售额在8月1-15日(一定要设置时间)

SELECT DATE( DATE ) AS
DAY , SUM( num ) AS N, SUM( price * num ) AS total
FROM `demo`
WHERE DATE
BETWEEN '2023-8-1 00:00:00'
AND '2023-8-15 23:59:59'
GROUP BY DAY
LIMIT 0 , 30

  • 按日期排列查询是销售产品的数量和销售额在8月1-18日(一定要设置时间)

SELECT DATE( DATE ) AS
DAY , SUM( num ) AS N, SUM( price * num ) AS total
FROM `demo`
WHERE DATE
BETWEEN '2023-8-1 00:00:00'
AND '2023-8-18 23:59:59'
GROUP BY DAY
LIMIT 0 , 30

  • Join命令格式

SELECT *

FROM table1

JOIN table2 ON table1.column = table2.column

JOIN table3 ON table2.column = table3.column;

  • 中文字段名使用案例

$sql=" SELECT DATE(`操作时间`) AS once_date, SUM(`数量`) AS total_num , SUM(`金额`) AS total_amount ,SUM(`进价`)  AS total_cost

FROM  `商品信息` JOIN `尺码颜色` ON `商品信息`.`条码` = `尺码颜色`.`主条码` JOIN `销售记录` ON  `销售记录`.`条码`=`尺码颜色`.`子条码`

WHERE `操作时间`

BETWEEN '$startDate ' AND '$endDate'

GROUP BY DATE(`操作时间`)";

### MySQL 中子查询 JOIN 的区别及用法 #### 子查询的概念及其应用场景 子查询是在另一个 SQL 查询内部执行的查询语句。它可以嵌套在一个 SELECT、INSERT、UPDATE 或 DELETE 语句内,也可以作为其他子查询的一部分。子查询返回的结果可以是一个单值、一列或多行多列的数据。 当需要基于某个条件获取数据而这个条件依赖于另一张表中的某些记录时,通常会考虑使用子查询。例如,在查找不属于任何部门管理者的员工信息时,可以通过子查询来实现: ```sql SELECT * FROM employees WHERE emp_no NOT IN (SELECT emp_no FROM dept_manager); ``` 此方法通过 `NOT IN` 来过滤掉那些存在于 `dept_manager` 表里的员工编号[^3]。 #### JOIN 概念及其应用场景 JOIN 是用来组合来自两个或多个表格的相关字段的一种方式。它允许我们根据一定的匹配规则将不同表之间的数据联系起来查看。常见的 JOIN 类型有 INNER JOIN(交集)、LEFT OUTER JOIN(左外连接)、RIGHT OUTER JOIN(右外连接)以及 FULL OUTER JOIN(全外连接)。其中 LEFT JOIN 可用于上述相同的需求表达如下: ```sql SELECT e.* FROM employees AS e LEFT JOIN dept_manager AS d ON e.emp_no = d.emp_no WHERE d.emp_no IS NULL; ``` 这段代码同样实现了筛选出不在管理层名单上的所有雇员的功能。 #### 性能对比分析 关于两者之间谁更优并没有绝对的答案,因为这取决于具体的应用环境数据库结构等因素。然而,一般而言,如果能够利用好索引,则 JOIN 往往会在处理大规模数据集合方面表现得更好一些;而对于相对较小规模的数据操作或是只需要简单判断是否存在的情况来说,适当运用子查询或许更加直观简便[^2]。 另外值得注意的是,在特定情况下采用 `IN()` 函数并传递一组预先计算好的 ID 列表给 MySQL 进行检索,相较于直接做复杂的联结运算可能会带来更高的效率提升,这是因为前者可以使服务器按既定次序访问磁盘文件从而减少不必要的 I/O 开销[^1]。 #### 实际案例展示 为了进一步说明这两种技术手段的不同之处,请看下面的例子:假设有一个名为 orders order_items 的两张表,现在想要找出订单总金额超过 $100 的客户姓名列表。 ##### 方法一:使用子查询 ```sql SELECT c.name FROM customers AS c WHERE EXISTS ( SELECT 1 FROM orders o JOIN order_items oi ON o.id = oi.order_id GROUP BY o.customer_id HAVING SUM(oi.price * oi.quantity) > 100 AND o.customer_id = c.id ); ``` ##### 方法二:使用 JOIN ```sql SELECT DISTINCT c.name FROM customers AS c JOIN orders AS o ON c.id = o.customer_id JOIN order_items AS oi ON o.id = oi.order_id GROUP BY c.id, c.name HAVING SUM(oi.price * oi.quantity) > 100; ``` 两种写法都能达到目的,但在实际应用中应依据具体情况选择最合适的方案以优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道行僧

鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值