在sql分组查询时,会出现这样一个问题:一般思路和sql运行顺序不同。
通常,解题的思路是:目的,获得什么——怎么做——怎么呈现
而sql的查询运行顺序是:怎么查——查什么——怎么呈现
那么如果按照一般思路写sql语句,就会经常出错。
比如查看score表里,按课程号分组后的所有信息。
按照一般解题思路:从score获得所有信息——按分组获得——直接呈现
而sql的查询运行顺序:from score,group by 课程号——select *——直接呈现
![1a8c53723de82c17e0e0c4afd63c7acb.png](https://i-blog.csdnimg.cn/blog_migrate/77d6802e03b54a0a81b845cc0b82fb98.png)
这样的语法是错误的。这是因为sql先运行了group by语句,而group by语句返回的是统计数据,这就限制了查询的内容(select),不能够查询组内数据,也同样限制了呈现的方式(order by,limit),不能按照组内字段呈现。
就算按照一般解题思路去写sql语句,即使不报错,得出的结果也常不合题意。
这时候就要求我们转变思路,在第一步“目的,获得什么,查询什么”里我们就要分析用什么方法。
![8992b7b559a175463633a33e9deb9bb0.png](https://i-blog.csdnimg.cn/blog_migrate/86ee28a90d2d6937ae67df549b685e53.jpeg)
假如查询的是各科最低成绩,那么我们使用简单查询即可;
假如查询的是各科最低成绩,包括学号,那么就要用到复杂查询中的关联子查询
(因为学号是组内字段);
假如查询的是各科成绩排名,包括所有的信息,那么就要用到开窗函数
(因为所有信息中包括组内字段,并且要求返回多条记录)。
总结:
1、select语句、order by语句受到group by语句限制
2、转变思路:获得什么+方法——怎么做——怎么呈现