1. 程式人生 > >MySQL中取出一列中含有最大值的記錄

MySQL中取出一列中含有最大值的記錄

在資料庫使用過程中,我們有時候需要取出在一個表中對於某個列來說具有最大值或最小值的記錄行,那麼該如何操作呢?下面講解幾種方法。

首先我們先定義一個表,如下所示:

這是一張簡單的表,下面我們通過這張表來得到含有最大price的記錄行。你想到該怎麼做了嗎?

(1)採用子查詢

我想這種方法是你們最先想到的吧,不錯,也是我最先想到的方法。那麼現在實現一下。


呵呵,達到目的了,那麼這種查詢是怎麼執行的呢?我們來看看其執行計劃:


從執行計劃中我們可以知道,這個查詢分為兩個階段,第一個基本查詢,對全表掃描,第二個是一個子查詢,也是對全表掃描。

(2)採用排序

也會你會說,不就是取出最大值嘛,不就可以先按照排序排好,然後取出最前面的一行不就行了嘛,對的,你太聰明瞭。現在來實現一下吧。


看看,結果如你所願呵呵,看一下執行計劃吧。


從執行計劃中,可以看出,只需要一次掃描過程,對全表掃描,並且使用檔案排序。

(3)使用左外連線

除了上面的兩種操作,你還能有其他方法嗎?如果還有,說明你水平還行嘛呵呵。。。現在講解一下下一種方法。

我們可以使用左外連線的方式,左外連線意味著左邊的表中的每個元素都會在結果集中有記錄存在,我們讓這個表和自己進行左連線,然後取出所有左邊的表中price比右邊表中price小的記錄,那麼對於所有除最大值以外的記錄來說都會有記錄,由於最大值是沒有price比它大的,所以在匹配時,其右邊表的匹配行將以NULL值填充,我們只要找到這個NULL值,其所對應的的左表記錄就是我麼要找的含有最大price的記錄行了。現在實現一下:


從結果中我們可以看到,除了最後一行外,其他行的s2表的記錄都不為空,意味著相應行的s1表中的記錄不是最大行記錄。只有s2表記錄為空的行所對應的的s1錶行才是對應著s1表的最大記錄行。所以我們只需在上述查詢的條件中新增where s2.article is null即可。


下面看一下其執行計劃:


至此,三種方法講完了,大家以後可以選擇合適的一種進行使用了偷笑....