MySQL学习笔记10-----SELECT的聚合函数们

目录

1.  AVG()求平均,SUM()求总和

2. MAX()最大,MIN()最小

3. COUNT()求个数

4. GROUP BY  通过字段进行分组

5. HAVING,聚合过滤条件中WHERE的分身

6. 92,99语法小结

6.1 语法规则

6.2 语句执行顺序


        聚合函数作用于一组数据,但是只返回一个值 多输入,单输出

1.  AVG()求平均,SUM()求总和

SELECT AVG (字段名) FROM 表名;
SELECT SUM (字段名) FROM 表名;

          只对数值型的参数有意义 ,不适用于字符串类型和日期类型  

2. MAX()最大,MIN()最小

SELECT MAX (字段名) FROM 表名;
SELECT MIN (字段名) FROM 表名;

          适用于数值类型、字符串类型、日期时间类型 

 3. COUNT()求个数

        COUNT( * ) 返回表中记录总数,适用于任意数据类型

        作用1: 用于查询指定字段出现的次数

SELECT
count(*)
count(1) -- 1,2,3,4...几都可以
count(列名) -- 该字段为NULL的行不被计算

        注意NULL将不被算在记录里。例如commission_pct只有35条数据非NULL,那么:

 哪种查询方式效率更高?如果使用的是MyISAM存储引擎,则三者效率相同;如果使用InnoDB引擎,则效率:COUNT( *) = COUNT(1) > COUNT(字段)

         作用2:计算表中共有多少条记录

SELECT
count(*)
count(1) -- 1,2,3,4...几都可以

        作用3AVG = SUM / COUNT ,这个公式永远成立 

         如果想查询公司的平均commission_pct,显然用 AVG(commission_pct) 是不正确的

应该用 SUM(commission_pct) / COUNT IFNULL commission_pct,0 ) )

或者  AVG ( IFNULL ( commission_pct,0 ))

4. GROUP BY  通过字段进行分组

SELECT....
FROM...
GROUP BY 分组字段1,分组字段2

        查询各个部门的平均工资:先按部门分组,在分别求平均:

         按 department_id,employee_id 两个字段分组,往GROUP BY 后面放就行:

         从实际需求上来说,两个字段谁前谁后效果是一样的

1. SELECT中出现的非组函数的字段,必须出现在GROUP BY中 

        SELECT department_id , job_id , AVG( salary)
        FROM employees
        GROUP BY department_id

        这是错误写法,因为只显示一个 department_id,不同的 job_id 无法显示。

        这个错误在Orical中报错,但是MySQL不报错(付费和免费的区别TAT)

2. GROUP BY 在 FROM , WHERE 后面 ,在ORDER BY 和 LIMIT 前面

3. GROUP BY...WITH ROLLUP,自带总体值

         与 ORDER BY连用时,会出现问题,MySQL8.0以下版本尽量不要连用

 5. HAVING,聚合过滤条件中WHERE的分身

        使用HAVING的前提,是我们使用了GROUP BY ,否则没有意义       

       问题1: 查询部门最高工资比10000高的部分,我们首先想到的是WHERE,尝试一下:

         直接报错,不能用。因为过滤条件中出现了聚合函数,就必须使用HAVING来替换WHERE!

并且, HAVING 必须声明在 GROUP BY 的后面!

         问题2: 查询部门id为10,20,30这三个部门中最高工资比10000高的部门信息:

        方式1(执行效率更高)用WHERE,WHERE永远紧跟 FROM~

           方式2:直接在 HAVING 后面接过滤条件

         结论:多条过滤条件可以分开写!当过滤条件中有聚合函数时,必须声明在 HAVING 中;没有聚合条件时,WHERE,HAVING 都可以,但是为了效率要用 WHERE

 

 6. 92,99语法小结

6.1 语法规则

        SQL92语法 

SELECT 字段,单行函数,聚合函数
FROM 表1,表2
WHERE 多表连接条件 AND 不包含聚合函数的过滤条件
GROUP BY 字段1,字段2
HAVING 包含聚合函数的过滤条件
ORDER BY 排序条件1,排序条件2(ASC/DESC)
LIMIT 初始条目,一页几条

        SQL99语法

SELECT 字段,单行函数,聚合函数
FROM 表1 (LEFT / RIGHT ) JOIN 表2 ON 多表连接条件1
(LEFT / RIGHT ) JOIN 表3 ON 多表连接条件2
WHERE 不包含聚合函数的过滤条件
GROUP BY 字段1,字段2
HAVING 包含聚合函数的过滤条件
ORDER BY 排序条件1,排序条件2(ASC/DESC)
LIMIT 初始条目,一页几条

6.2 语句执行顺序

         这也解释了为什么 WHERE 里不能用聚合条件过滤,因为在使用 WHERE之前 ORDER BY 还没有出现


    ✿聚合函数完结撒花✿基础知识部分OVER~✿   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值