编程技巧: where group by having order的语法执行顺序
sql语法执行顺序
- from 阶段
- where 阶段,即就是取得原始表数据。
- group by 分组,配合聚合函数sum,avg,max,min,count.
- having 对于group by的条件查询,有一种情况没有group by时等同于where,但它优于where时可以支持对于列别名的引用,而where不支持,其实就是它有缺省的group by在执行。
- select阶段,它后面跟要么全是字段名,或者要么全是聚合列(sum,max,min,avg等),但不能字段名和sum混用。当与group by结合用时,例如select 字段名,聚合列,select中的字段名必须在group by所列的字段名,没有列的字段名不能在select中使用,但聚合列的字段名可以不在group by包含的。
- order by 阶段: ASC或DESC
- limit 阶段,limit1 ,limit 起始行,返回的行数。如果没有起始行,缺省就是0开始。
count(*)和count(字段名)区别
- count(*)计算表格的行数,它不管某列是否有数值还是为空值。
- count(字段名)计算字段下的行数,它的计算会忽略空值的行。
select 和group by结合用法
- 语法 select 字段名1,聚合列(例如sum(字段2) from 表 where 1 group by 字段名1
- select中的字段必须在group by中列明,否则不能用。
- select 聚合列的字段,它的字段可以不在group by中列明。
- group by 字段1,字段2和group by 字段2,字段1。是不一样的,按它的字段依顺序对数据进行分区。
去重用disinct和group by的区别
where和having的区别
- where后面不能跟聚合函数,它是对原表的行数据进行筛选。
- having后面可以除了普通字段条件,还可以加聚合函数,它一般与group by结合使用。它是对分组结果的筛选结果。
- having 特殊情况下,不和group by结合用时,它和where功能一样,但它支持别名字段的条件查询,而where不支持列别名的引用, 为了根据别名字段进行条件查询,也可以外面再套一个select。