暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL分组函数

brevity分享 2021-08-24
823
MySQL常见函数中,上次已经分享了一些单行函数,这次分享一些分组函数,是一类比较复杂且重要的函数。常见的分组函数有求和SUM()、平均值AVG()、最大值MAX()、最小MIN()等。其中SUM()、AVG()一般用于处理数值类型;MAX()、MIN()COUNT()可以处理任何数据类型,而且这些分组函数都忽略null值。和分组函数一同查询的字段要求必须是GROUP BY后的字段。

    SELECT SUM(salary) 总和,AVG(salary) 平均, MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 总数 FROM employees;
    SELECT SUM(salary) 总和,ROUND(AVG(salary),2) 平均, MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 总数 FROM employees;
    分组函数与DISTINCT()去重函数结合使用:
      SELECT SUM(DISTINCT(salary)) 去重和,SUM(salary) 总和 FROM employees;
      SELECT COUNT(DISTINCT(salary)) 去重总数,COUNT(salary) 总数 FROM employees;
      其中COUNT()函数除了上述用法,还有其他的详细使用如下:
        SELECT COUNT(*) 行数 FROM employees;
        SELECT COUNT(1) 行数 FROM employees;
        在INNODB引擎下,COUNT(*)与COUNT(1)的效率几乎一样,不过都比COUNT(字段)的方法效率高。

        GROUP BY函数是每个学习数据库都需要使用的语句,它的使用语法如下:

        SELECT 查询列表,分组函数(分组列,与GROUP BY的列是同一个列) FROM 表名 [WHERE 表名] [GROUP BY 分组列] [ORDER BY 排序列]; 其中特别强调WHERE子句一定要放在FROM的后面,GROUP BY的前面。
          SELECT ROUND(AVG(salary),2) AS avg_sal,job_id FROM employees GROUP BY job_id;
          SELECT COUNT(*),location_id FROM departments GROUP BY location_id;
          SELECT AVG(salary),department_id,job_id FROM employees GROUP BY department_id,job_id;
          SELECT AVG (salary),department_id,email FROM employees WHERE email LIKE '%a%' GROUP BY department_id;
          SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id ORDER BY manager_id DESC;
          SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 5;
          SELECT job_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary) > 12000;
          SELECT MIN(salary),manager_id FROM employees WHERE manager_id > 102 GROUP BY manager_id HAVING MIN(salary) > 6000;
          从上面的几条SQL可以看出,分组查询中的筛选条件分为分组前筛选和分组后筛选,其中分组前筛选的数据源来自于数据表,在FROM后面使用WHERE实现,而分组后筛选的数据源来源于查询的结果集,在GROUP BY的后面使用HAVING子句进行过滤。一般来说,分组函数做条件一定放在HAVING子句中。从SQL性能考虑来说,能用分组前筛选的就不用分组后筛选。
          按照表达式或者函数进行分组举例:
            SELECT COUNT(1),LENGTH(last_name) len FROM employees GROUP BY LENGTH(last_name) HAVING len > 5 ORDER BY len DESC;
            文章转载自brevity分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论