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

來源:互聯網
上載者:User

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

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

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

(1)採用子查詢

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

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

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

(2)採用排序

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

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

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

(3)使用左外串連

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

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

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

下面看一下其執行計畫:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.