select age, count(*) from student group by age having age>18
select age, count(*) from student where age>18 group by age
大家觉得这两句有什么不一样呢?一个是分组后再过滤,一个是过滤后再分组,但得到的结果是一样呢。
在SQL server中select语句中where子句指定选择的条件来实现的。where子句必须跟在from子句后面,group by子句主要用于根据字段对行分组。使用group by子句和聚合函数对数据进行分组后,还可以使用having子句对分组数据进行进一步的筛选。在select语句中,当where、group by和having子句都被使用时,要注意它们的作用和执行顺序。where用于筛选由from子句指定的数据对象,group by用于对where的结果进行分组,having则是对group by以后的分组数据进行过滤。
例如:
select 学号
where 成绩>90
group by 学号
having count(*)>2
GROUP BY:根据字段进行分组。例如:select 学号 ,AVG (成绩)from 学生表 GROUP BY 学号
where:用来限定SQl语句的查询条件。例如:select *from XSB where age >20
having:一般在使用GROUP BY之后对分组字段进一步的筛选。
例如:select 学号 ,AVG (成绩)from 学生表 GROUP BY 学号 HAVING AVG(成绩) >=60