1. 程式人生 > >查詢數據庫中第二大的記錄的幾種方法

查詢數據庫中第二大的記錄的幾種方法

大數 過程 tmp where eve style desc 如何 定義

在學習過程中,遇到一個問題,查詢最大的數據時十分容易,使用MAX函數語句即可,但是如何查詢第二大的記錄呢, 抱著這個問題我開始查找資料

首先建表語句,我建立了一個employee的表,屬性有id,name和age,其中id為int 自增 主鍵,name為char(5),age為int型,創建及插入數據語句略去

首先我看到了以下方法

方法一:

1 select top 1 height from users where height not in (select MAX(height) from users) order by height desc;



該方法使用了Top函數,但當我去試驗該方法後發現Mysql沒有Top函數,只有Limit函數,但是也差不多,於是改進後的sql語句如下

1 select  height from users where height not in (select MAX(height) from users) order by height desc limit 1;



該方法是首先查詢出該表中最大的記錄,然後排除該記錄後再查詢剩下數據中最大的記錄。

方法二:

和上一方法類似,查詢出最大的記錄,然後查詢剩下記錄中比該記錄小的最大數據記錄,語句如下

1     SELECT MAX(age) AS age from empolyee
2     where age<(SELECT MAX(age)from empolyee)


經過試驗後成功執行,但是查詢出的記錄只有age一項,改進後改為

1     SELECT * from empolyee
2     where age<(SELECT MAX(age)from empolyee) LIMIT 1


方法三:

使用rank函數,經過查詢後得知mysql並沒有rank函數,但是可以自己定義,經過查詢rank函數定義的語句後,寫出如下語句

1   SELECT r.id,age,rank from(
2     SELECT tmp.id,tmp.age,IF(tmp.id=@tmid,@rank:=1,@rank:=@rank+1) as rank,@tmid
:=tmp.id 3 FROM (SELECT id,age from empolyee GROUP BY id,age ORDER BY id ASC,age DESC)tmp, 4 (select @rank:=0,@tmid:=null)tmp1 5 )r 6 WHERE age is not null and rank=2;



經過測試,能夠成功查詢出正確的記錄

經過學習,對Sql語句有了進一步的了解,還有一點感想就是oracle和sql sever有rank函數好方便啊,不像mysql只能自己定義

查詢數據庫中第二大的記錄的幾種方法