关于MySQL查询最高分与最高分得主的相关信息。与group by 使用的一些小bug.
问题:
求出表中最高分学生的姓名与分数。
select ename, sal from emp group by ename order by sal desc limit 1;
以上这条为正确的语句,然而其中的一些思考得到问题:
使用sal 也就是分数进行分组的话
也就是这一句:select ename,max(sal) from emp group by sal;
此时的语句看样子好像是有一定的逻辑,实际上是以分数进行了一个分组,也就是区分了不同分数段的数据,它输出的数据为不同分数段的学生名字与分数,所以没有达到我们预期的效果。
当时是否可以使用最高分进行一个分组呢。
此时想法出来以后,笔者就实现了也就有了下面的代码:
select ename,max(sal) from emp group by max(sal);
但是它报错了。具体原因如下:
这也就是我标题中提到的第二个group by 使用的小bug
因为我们的分组函数是需要在分组后才能进行一个使用的。
所以会进行一个报错,因为在这条语句还没执行完的情况下就进行一个使用是与上面我们所说得会有一个冲突的。
同时这里也可以使用子查询,这个方法用的好的话非常nice。
比如这样:
select ename, sal from emp having sal = (select max(sal) from emp);
or
select ename, sal from emp where sal = (select max(sal) from emp);
这两种都是子查询的方法。
同时因为笔者初学有一个小问题不太理解。有知道可以做一个解答,等我想出来我也会进行一个在编辑的。
就是:select ename, sal from emp having sal = max(sal);
这条语句为什么会查不出来。
同时这里附上一些我学到现在的一些心得:
1.可以在where select from having后面,放置子查询
2.不可以在group by后面放置子查询
4.主查询和子查询可以不是同一张表,只要子查询返回的结果,主查询可以使用
5.limit 可以限制查询数据的输出个数。
6.子查询放在from里面,比放在select里面要快
having必须和group by一起用,且在group by后面???