1.select 语句的语法顺序(数字为执行顺序)
5. select [字段列表]
1.from [表名]
2. where [条件]
3.group by [列]
4. having [筛选条件]
6.order by [列]
注: order by可以跟列的别名,其他子句不可以,是因为在第五步才给列起了别名,所以其他列不可以使用列的别名
2.group by分组查询
分组的目的:做统计
查询男生女生各有多少人
select stuGender,count(1) from TbStudent group by stuGender;
--分组后的count,是统计各个分组内的记录条数,而不是整个表的记录条数
--有多少个分组,就会count 出多少个值
查询每个地方有多少名同学
select stuAddress,count(*) as 人数 from TbStudent group by stuAddress
--根据分组统计信息时,在select后边不是必须有分组的那个字段
--但是如果在select的查询列表中没有那个分组的字段,查询结果集就很难看懂
查询每个班数学和英语的平均分
select stuClassId,avg((stuMath+stuEnglish)/2) from TbStudent
group by stuClassId
查询每个班男生数学和英语的平均分
select stuClassId,avg((stuMath+stuEnglish)/2) from TbStudent
where stuGender=1
group by stuClassId
查询每个班男生数学和英语的平均分,并且只显示平均分高于60分的
select stuClassId,avg((stuMath+stuEnglish)/2) from TbStudent
where stuGender=1
group by stuClassId
having avg((stuMath+stuEnglish)/2)>60
错误写法:
查询每个班男生数学和英语的平均分,并且只显示平均分高于60分的。
select stuClassId,avg((stuMath+stuEnglish)/2) as 平均分 from TbStudent
where stuGender=1 and avg((stuMath+stuEnglish)/2)
group by stuClassId --错误写法
select stuClassId,avg((stuMath+stuEnglish)/2) as 平均分 from TbStudent
where stuGender=1 group by stuClassId
having stuAddress=“开封” --错误的
注意:where条件只能筛选表里出现的原始数据,如果根据分组统计后出现的数据进行筛选要使用having子句,having子句只能跟group by子句搭配使用
select stuClassId,avg((stuMath+stuEnglish)/2) as 平均分 from TbStudent
where stuGender=1 group by stuClassId
having stuClassId>2
having后不能使用列的别名,列的别名只能用在order by之后,
其他地方不能使用列的别名,having是对分组的结果进行筛选,
having中不能出现未参加分组的列
但是如果这个列只是一个原始表中的字段,
我们尽量不把他作为having筛选的依据
而是应该把他放在where中去筛选
总结:where只能对原始表中出现的数据做筛选
having 只能对分组后的结果做筛选
3.分组查询原则
1. 在select查询语句中出现聚合函数时,不能再select后边查询字段列表中在出现其他字段
2.除非,该字段是出现在group by子句中,或者也出现在聚合函数里
例如:select count(1) as 人数,avg(stuMath) as 数学平均分 from TbStudent
3.在分组查询中,select后边的字段列表必须与group by中的字段名一一对应,除非它出现在聚合函数里
select stuName,avg((stuMath+stuEnglish)/2) from TbStudent --错误的
不允许把聚合函数跟某一列字段,同时出现在一个select查询列表中
4.order by排序
–语法:order by [字段名] asc(升序)/desc(降序)
–注意:如果不写asc或者desc,默认的就是asc
查询每个同学的数学成绩,按照降序排列
select stuName,stuNumber,stuMath from TbStudent order by stuMath desc
一个select语句永远只能有一个order by子句
根据数学成绩降序排序,如果数学成绩一样,再根据英语降序排序
select stuName,stuNumber,stuMath,stuEnglish from TbStudent order by stuMath desc,stuEnglish desc
order by后边还可以跟表达式
查询所有学生的平均成绩,按降序排列
select stuname,(stumath+stuenglish)/2.0 as 平均分 from TbStudent
order by (stumath+stuenglish)/2.0 desc
第二种:
select stuName,(stuMath+stuEnglish)/2.0 as 平均分 from TbStudent
order by 平均分 desc --与上面一样
根据各地区人数排序
select stuaddress,count(1) as 人数 from TbStudent group by stuAddress
order by count(1)
第二种方法:
select stuaddress,count(1) as 人数 from TbStudent group by stuAddress
order by 人数