聚合函数
在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等。
AVG函数用于获得非空值的平均值,非数字数据统计结果为0
SUN函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。
MAX函数用于获得非空值的最大值
统计字符个数 LENGTH()
MIN函数用于获得非空值的最小值
COUNT(*)用于获得包含空值的记录数,COUNT(列名)用于获得包含非空值的记录数
聚合函数不可以出现在WHERE子句中
分组查询
默认情况下聚合函数是对全表范围内的数据做统计
GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理
ROUND() 四舍五入
数据库支持多列分组条件,执行的时候逐级分组。
查询语句中如果含有GROUP BY子句,那么SELECT子句中的内容就必须要遵守规定:SELECT子句中可以包括聚合函数,或者GROUP BY子句的分组列,其余内容均不可以出现在SELECT子句中
SELECT deptno,COUNT(*),AVG(sal)
FROM t_emp
GROUP BY deptno;
对分组结果集再次做汇总计算
SELECT deptno,COUNT(*),AVG(sal),MAX(sal),MIN(sal)
FROM t_emp
GROUP BY deptno WITH ROLLUP;#对结果作二次计算
GROUP_CONCAT函数可以把分组查询中的某个字段拼接成一个字符串
SELECT deptno,GROUP_CONCAT(ename), COUNT(*)
FROM t_emp
WHERE sal>=2000
GROUP BY deptno;
各种子句的执行顺序
FROM WHERE GROUP BY SELECT ORDER BY LIMIT
HAVING子句不能单独存在,需依赖于GROUP BY
SELECT deptno
FROM t_emp
GROUP BY deptno HAVING AVG(sal)>=2000;类似的聚合函数不可以写在WHERE中,因为WHERE执行顺序优先于GROUP BY,所以聚合函数找不到执行的数据范围
HAVING子句可以使用聚合函数与常数作比较,但不能与字段作比较(可以用表连接解决)
按照数字1分组,MySQL会依据SELECT子句中的列进行分组,HAVING子句也可以正常使用
SELECT deptno,COUNT(*)
FROM t_emp
GROUP BY 1;
WHERE和HAVING功能上是一致的,都是数据筛选,普通的数据筛选条件可以写在HAVING中,不推荐这样写
SELECT deptno,COUNT(*)
FROM t_emp
GROUP BY 1 HAVING deptno IN(10,20);
从多张表中提取数据
从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积
SELECT e.empno, e.ename, d.dname
FROM t_emp e JOIN t_dept d#对两张表重命名
ON e.deptno=d.deptno;#连接条件
表连接分为两种:内连接和外连接
内连接是结果集中只保留符合连接条件的记录
外连接是不管符不符合连接条件,记录都要保留在结果集中
SELECT ...... FROM 表1
[INNER] JOIN 表2 ON 条件
[INNER] JOIN 表3 ON 条件
内连接的数据表不一定必须有同名字段,只要字段之间符合逻辑关系就可以
相同的数据表和查询结果集也可以做表连接
FLOOR() 小数点后强制舍位
CELL() 小数点后强制进位
左连接和右连接
左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。
UNION关键字可以将多个查询语句的结果集进行合并
(查询语句)UNION(查询语句)UNION(查询语句).......
字段个数和名称必须相同,否则没法合并
外连接的注意事项
内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是在外连接里,条件写在WHERE子句里,不符合条件的记录是会被过滤掉的,而不是保留下来。
子查询是一种查询中嵌套查询的语句,只推荐在FROM子句中使用,子查询只会执行一次,所以查询效率很高
WHERE子句中,可以使用IN ALL ANY EXISTS关键字来处理多行表达式结果集的条件判断
EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。
SELECT ...... FROM 表名 WHERE [NOT] EXXISTS(子查询);