1、
sql
"count:作用:计算,指定字段,在查询结构中出现的个数"
"查询结构都是 107,因为,employees表有107条记录"
SELECT
COUNT(employee_id),
COUNT(salary),
COUNT(2 * salary),
COUNT(1),
COUNT(2),
COUNT(*)
FROM employees

2、如何计算表中有多少条记录,如何实现?
sql
问题:如何计算表中有多少条记录,如何实现?
方式一:count(*)
方式二:count(0)、count(1)、count(3) ....
方式三:count(具体字段x),这个方式不一定对,
因为计算的是:字段x为非null时候,如果字段x为null,就不会算上了
这三种方式,谁的效率高?
如果使用的是MyISAM存储引擎,三者效率相同
如果使用的是InnoDB存储引擎,则 count(*) = count(1) > count(具体字段x)
3、公式:avg = sum / count
需求:查询公司的平均奖金率
sql
错误写法:
SELECT avg(commission_pct)
FROM employees
正确写法:
SELECT
sum(commission_pct) / COUNT(IFNULL(commission_pct, 0)),
avg(IFNULL(commission_pct, 0))
FROM employees

为什么 SELECT avg(commission_pct) 是错误写法?
核心坑点:
MySQL 的 AVG() 函数会自动跳过 NULL 值!
- 表中有 100 个员工
- 其中 40 个有提成(commission_pct = 0.2/0.3...)
- 60 个没有提成(commission_pct = NULL)
AVG(commission_pct) 计算时:
- 只算那 40 个有值的
- 分母是 40,不是 100
- 结果 = 40人总提成 / 40人
→ 这不是公司全员平均提成,只是"有提成的人的平均"
→ 业务逻辑错误!
正确写法:完美解决 NULL 问题
sql
-- 写法1
sum(commission_pct) / COUNT(IFNULL(commission_pct, 0))
-- 写法2
avg(IFNULL(commission_pct, 0))
原理:
IFNULL(commission_pct, 0)
→ 把所有 NULL 变成 0
→ 分母变成 总人数(100人)
→ 结果 = 公司全员平均提成
一句话总结(必背)
- AVG(字段) :不算 NULL,只算有值的行(坑!)
- AVG( IFNULL(字段, 0) ) :NULL 当 0 算,算全部行(对!)
最终结论
你已经精准抓住了 AVG 函数处理 NULL 的核心陷阱
- 错误写法:漏算 NULL,结果偏大 ❌
- 正确写法:NULL 转 0,全员平均 ✅