一.使用聚合函数进行统计汇总
1.COUNT 返回结果集中行的数目
SUM 所有值的总和
AVG 平均值
MAX 最大值
MIN 最小值
2.执行行和列技术
select COUNT (<计数规范>) from <表名>;
select COUNT (s_id) from s_stu; 统计全班有多少人
select COUNT (<计数规范>)As <列名> from <表名>;
3.计数规范关键字
* 计数所有选择的行,包括NULL值
SELECT COUNT(*) FROM t_student WHERE 性别=‘男’ 统计男生有多少人
ALL列 计数指定列的所有的非空值行
SELECT COUNT(ALL 班级) FROM t_student
DISTINCT列 计数指定列所有非空值行
SELECT COUNT(DISTINCT 年龄) FROM t_student
4.返回列合计值
select SUM (<计数规范>) from <表名>;
select SUM (s_grade) from s_stu; 统计全班总成绩
sum 里面不能有* 会报错 只能是浮点型和整型 不能是字符串
5.获取列平均值
select AVG (<平均值规范>) from <表名>;
select AVG (ALL age ) from student;
6.返回最大值和最小值
MAX MIN 没有 all distinct * 三个规范
select Max(s_grade) from t_stu;
二.数据分组
1.过滤分组数据
select 列A , 聚合函数(聚合函数规范) from 表名 where 过滤条件 GROUP BY 列A;
select studentID , count(*) As highPasses from studentExam where Mark >70 group by studentID; 先将考试分数小于70的行过滤掉,再将具有相同studentID列值行分组 在 一起 最后执行count 函数
2. select s_age from t_stu group by s_age; 年龄分组
3.使用having字句
select s_c_id count(*)from t_stu group by s_c_id having count(*)>2;
4.having 和where 的区别
相同点:都是条件过滤
不同点:where运行在分组前 不能执行聚合函数
having 运行分组后,只能用做聚合函数的过滤
5.SQL 的执行顺序
第一步:执行FROM
第二步:WHERE条件过滤
第三步:GROUP BY分组
第四步:执行SELECT投影列
第五步:HAVING条件过滤
第六步:执行ORDER BY 排序
第七步:LIMT限制
笔记:
CREATE DATABASE day06_32;
USE day06_32;
CREATE TABLE t_stu(
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(200),
s_age INT,
s_phone BIGINT,
s_grade INT,
s_c_id INT
);
SELECT * FROM t_stu;
/*全班有多少同学*/
SELECT COUNT(ALL s_grade) FROM t_stu;
SELECT COUNT(DISTINCT s_age) FROM t_stu;
/*sum函数的使用*/
SELECT * FROM t_stu;
SELECT SUM(s_age)/6 FROM t_stu;
SELECT SUM(*) FROM t_stu;
/*avg函数求平均值*/
SELECT AVG(s_grade) FROM t_stu;
SELECT MAX(s_grade) FROM t_stu;
SELECT MIN(s_grade) FROM t_stu;
SELECT s_name FROM t_stu WHERE s_grade;
SELECT * FROM t_stu;
/*分组查询*/
SELECT * FROM t_stu;
/*18以后的学生每个年龄阶段多少人*/
SELECT s_age,COUNT(*) FROM t_stu WHERE s_age > 18 GROUP BY s_age;
SELECT s_c_id,COUNT(s_id) AS '班级人数' FROM t_stu GROUP BY s_c_id;
SELECT s_c_id,s_age,COUNT(*) AS '班级人数' FROM t_stu GROUP BY s_c_id,s_age;
/*having字句*/
/*查询出班级人数大于2的班级*/
SELECT * FROM t_stu;
SELECT s_c_id,COUNT(*) FROM t_stu GROUP BY s_c_id HAVING COUNT(*)>2;