select语句的执行顺序,order by子句介绍,group by子句介绍

337 阅读3分钟

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 人数