3-1-3 MySQL基础-数据库的高级查询

测试表结构

 1 DROP TABLE IF EXISTS `t_emp`;
 2 CREATE TABLE `t_emp` (
 3   `empno` int(4) NOT NULL,
 4   `ename` varchar(20) DEFAULT NULL,
 5   `job` varchar(20) DEFAULT NULL,
 6   `mgr` int(4) DEFAULT NULL,
 7   `hiredate` date DEFAULT NULL,
 8   `sal` decimal(10,2) DEFAULT NULL,
 9   `comm` decimal(10,2) DEFAULT NULL,
10   `deptno` int(2) DEFAULT NULL,
11   PRIMARY KEY (`empno`)
12 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
13 
14 DROP TABLE IF EXISTS `t_dept`;
15 CREATE TABLE `t_dept` (
16   `deptno` int(2) NOT NULL,
17   `dname` varchar(20) DEFAULT NULL,
18   `loc` varchar(20) DEFAULT NULL,
19   PRIMARY KEY (`deptno`)
20 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

聚合函数

SUM函数

SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加

1 SELECT SUM(ename), SUM(sal) FROM t_emp;

3-1-3 MySQL基础-数据库的高级查询

 

 注意SUM函数求和会排除NULL值

MAX函数

MAX函数用于获取非空值的最大值

1 SELECT MAX(comm) FROM t_emp;

3-1-3 MySQL基础-数据库的高级查询

 

MIN函数

MIN函数用于获取非空值的最小值

1 SELECT MIN(comm) FROM t_emp;

3-1-3 MySQL基础-数据库的高级查询

 

 AVG函数

AVG函数用于获得非空值的平均值,非数字数据统计结果为0

1 SELECT AVG(ename), AVG(sal+IFNULL(comm,0)) FROM t_emp;

3-1-3 MySQL基础-数据库的高级查询

 

COUNT函数

COUNT(*)用于获得主键条数,COUNT(列名)用于获得包含非空值的记录数.

1 SELECT COUNT(*), COUNT(comm) FROM t_emp;

3-1-3 MySQL基础-数据库的高级查询

 

 分组查询

默认情况下聚合函数是对全表范围内的数据做统计

GROUP BY子句的作用是通过一定的规则蒋一个数据集划分成若干个小的区域,然后针对每个小区域分进行数据聚合处理

1 SELECT deptno, AVG(sal) FROM t_emp GROUP BY deptno;

3-1-3 MySQL基础-数据库的高级查询

 

 对SELECT子句要求

查询语句中含有GROUP BY子句,那么SELECT子句中的内容就必须遵守规定:SELECT子句中可以包括聚合函数,或者GROUP BY子句的分组列,其余内容均不可以出现在SELECT子句中.

WITH ROLLUP

在group分组字段的基础上再进行统计数据

1 SELECT deptno, COUNT(*), AVG(sal), MAX(sal), MIN(sal) FROM t_emp GROUP BY deptno WITH ROLLUP;

3-1-3 MySQL基础-数据库的高级查询

 

 GROUP_CONCAT函数

GROUP_CONCAT函数可以把分组查询中的某个字段拼成一个字符串

1 SELECT deptno, GROUP_CONCAT(ename),COUNT(*) 
2 FROM t_emp 
3 WHERE sal >=2000
4 GROUP BY deptno;

3-1-3 MySQL基础-数据库的高级查询

 

 GROUP BY语句在查询语句的执行顺序

FROM -> WHERE -> GROUP BY -> SELECT -> ORDER BY -> LIMIT

HAVING子句

因为WHERE子句先于GROUP BY,一旦WHERE中出现了聚合函数,数据库根本不知道按照什么范围计算聚合值,此时需要HAVING子句

1 SELECT deptno 
2 FROM t_emp
3 WHERE hiredate >= '1982-01-01'
4 GROUP BY deptno
5 HAVING COUNT(*) >=2
6 ORDER BY deptno;

3-1-3 MySQL基础-数据库的高级查询

 

HAVING子句的特殊用法

按照数字1分组,MySQL会根据SELECT子句中的列进行分组,HAVING子句也可以正常执行

1 SELECT deptno,COUNT(*) 
2 FROM t_emp
3 GROUP BY 1
4 HAVING deptno IN (10,20);

3-1-3 MySQL基础-数据库的高级查询

 

上一篇:Hive基础(三十八):Hive DML (二) JOIN/排序


下一篇:mysql