为什么sql语句中where后面不能直接跟分组函数
当我们错误的使用分组函数之后,mysql会报错,提示“ Invalid use of group function”,这就是今天要说的问题:where后面不能直接跟分组函数。
分组函数有五种count、sum、avg、max、min
为什么他们不能跟在where后面?
这几个函数在使用时一般都和group by联合使用,原理是先分组再进行函数计算。当然我们在平常使用时,有这种情况。
select max(age) from t_student
这个sql语句中并没有group by,但还是可以使用分组函数max。这是因为当sql语句种没有手动使用group by时,那整个调用的表默认是一个分组。max函数是在这个大分组中取的最大值。所以我们就可以知道,应该是先分组,再调用分组函数,这样的逻辑。
sql语句执行的顺序
接下来我们了解下sql语句执行的顺序
例:从学生表t_student中筛选出3年级年龄最大的女孩儿们,结果按照学号id升序
select max(age) from t_student where grade = 3 group by sex having sex = girl order by studentID asc
第一步:from 选择表
第二步:where 筛选条件,筛选对象–行( row 数据记录 )
第三步:group by 将筛选出来的数据进行分组
第四步:having 筛选条件,筛选对象–组
第五步:select 选取最后的结果
第六步:order by 将结果按照特定顺序排列
从上面的执行顺序我们又知道了先执行where,后group by分组,分组完之后才能使用分组函数。
所以where后面的筛选条件出现了分组函数那就会报错。还没有进行分组呢,不能使用分组函数。
当我们遇到这种情况时,就要改变思路,用子查询即可,where后面跟一个子查询就迎刃而解了。
SQL查询语句的书写顺序、执行顺序和注意事项
1.SQL查询语句常用关键字
select 、from、where、group by、having、order by
select :指定查看结果集中的那个列或列的计算结果from :从哪张表查询数据where :筛选过滤条件group by :将上面过滤出的数据,进行分组having :对上面已经分组的数据进行过滤的条件order by :对查询到的结果进行排序。升序:asc,降序:desc
2. SQL查询语句的书写顺序
书写顺序:select > from > where > group by > having > order by
其中select
和from
关键字是必不可少的,其他关键字是可选的。
3.SQL查询语句的执行顺序
执行顺序:from > where > group by > having > select > order by
select 之前:负责检索数据。
select和order by : 负责设置查看规则。