MySQL中取出一列中含有最大值的记录 - Go语言中文社区

MySQL中取出一列中含有最大值的记录


在数据库使用过程中,我们有时候需要取出在一个表中对于某个列来说具有最大值或最小值的记录行,那么该如何操作呢?下面讲解几种方法。

首先我们先定义一个表,如下所示:

这是一张简单的表,下面我们通过这张表来得到含有最大price的记录行。你想到该怎么做了吗?

(1)采用子查询

我想这种方法是你们最先想到的吧,不错,也是我最先想到的方法。那么现在实现一下。


呵呵,达到目的了,那么这种查询是怎么执行的呢?我们来看看其执行计划:


从执行计划中我们可以知道,这个查询分为两个阶段,第一个基本查询,对全表扫描,第二个是一个子查询,也是对全表扫描。

(2)采用排序

也会你会说,不就是取出最大值嘛,不就可以先按照排序排好,然后取出最前面的一行不就行了嘛,对的,你太聪明了。现在来实现一下吧。


看看,结果如你所愿呵呵,看一下执行计划吧。


从执行计划中,可以看出,只需要一次扫描过程,对全表扫描,并且使用文件排序。

(3)使用左外连接

除了上面的两种操作,你还能有其他方法吗?如果还有,说明你水平还行嘛呵呵。。。现在讲解一下下一种方法。

我们可以使用左外连接的方式,左外连接意味着左边的表中的每个元素都会在结果集中有记录存在,我们让这个表和自己进行左连接,然后取出所有左边的表中price比右边表中price小的记录,那么对于所有除最大值以外的记录来说都会有记录,由于最大值是没有price比它大的,所以在匹配时,其右边表的匹配行将以NULL值填充,我们只要找到这个NULL值,其所对应的的左表记录就是我么要找的含有最大price的记录行了。现在实现一下:


从结果中我们可以看到,除了最后一行外,其他行的s2表的记录都不为空,意味着相应行的s1表中的记录不是最大行记录。只有s2表记录为空的行所对应的的s1表行才是对应着s1表的最大记录行。所以我们只需在上述查询的条件中添加where s2.article is null即可。


下面看一下其执行计划:


至此,三种方法讲完了,大家以后可以选择合适的一种进行使用了偷笑....

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/andamajing/article/details/9296847
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 14:43:22
  • 阅读 ( 959 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢