一、汇总统计
1、聚集函数
COUNT() 计算总数SUM() 求和MAX() 最大值MIN() 最小值AVG() 平均值
2、聚集函数使用
总共有多少名学生?SELECT COUNT(*) FROM student;所有学生的数学成绩总和?SELECT SUM(score) FROM student;所有学生的数学成绩最高分?SELECT MAX(score) FROM student;所有学生的数学成绩最低分?SELECT MIN(score) FROM student;所有学生的数学成绩平均分?SELECT AVG(score) FROM student;###有多少名学生? SELECT COUNT(*) FROM student; 219另一种写法: SELECT COUNT(score) FROM student; 219 SELECT COUNT(student_id) FROM student; 219 SELECT COUNT(1) FROM student; 219 SELECT COUNT('ABC') FROM student; 219 SELECT COUNT(teacher_id) FROM student; 205 COUNT(teacher_id) 忽略掉了值为null的行;同样忽略值为NULL的行: SELECT MAX(score) FROM student; SELECT MIN(score) FROM student; SELECT SUM(score) FROM student; SELECT AVG(score) FROM student;count(*) 与count(1)比较: 如果你的数据表没有主键,那么count(1)比count(*)快 如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快 如果你的表只有一个字段的话那count(*)就是最快的啦 count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。 如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(*),自动会优化指定到那一个字段。所以没必要去count(?),用count(*),sql会帮你完成优化的。AVG(score) 等价于SUM(score)/COUNT(score)
3、分组汇总统计
关键字:GROUP BY比如: 如何获取每个班级的数学成绩平均分(因为学生太多,这里先不计算成绩在80分以下的学生),以便比较不同班级的成绩? SELECT class_id,avg(score) FROM student WHERE score > 80 GROUP BY class_id;:SELECT里除了使用聚集函数返回的字段外,其他所有的字段都必须原样出现在GROUP BY的后面;
比如: 如何统计不同的交易所的总的买入金额? SELECT left(stock_code,2),sum(price*volume) FROM t_stock_trans_dtl WHERE opt_typ = '买入' GROUP BY left(stock_code,2);比如: 如何统计不同的交易所的不同交易类型的总的交易金额? #根据多个字段分组 SELECT left(stock_code,2),opt_typ,sum(price*volume) FROM t_stock_trans_dtl GROUP BY left(stock_code,2),opt_typ;GROUP BY会将NULL值的行,分到同一组计算统计值;SELECT teacher_id,count(*)FROM studentGROUP BY teacher_id;
二、汇总统计
1、过滤分组结果
关键字:GROUP BY + HAVINGhaving关键字专门用来对group by进行指定条件;having和where比较: having:过滤分组,在GROUP BY后执行; where:过滤行,在GROUP BY前执行;比如: 如何获取教授15名以上学名的老师? SELECT teacher_id,count(*) FROM student GROUP BY teacher_id HAVING count(*) > 15;比如: 如何获取数学成绩平均分在70分及以上的班级? SELECT class_id,avg(score) FROM student GROUP BY class_id HAVING avg(score) >= 70;
2、排序分组结果
比如: 如何获取每个班级的数学成绩平均分(不计算数学成绩在80分以下的学生),然后以平均分从高到低排序? 使用关键字:GROUP BY + ORDER BY #会先执行where,再进行order by SELECT class_id,avg(score) FROM student WHERE score > 80 GROUP BY class_id ORDER BY avg(score) DESC;如果每次查询都想得到确定的排序结果,则必须使用ORDER BY!
3、SELECT子句顺序
最简单的SQL语句:
SELECT 1;