查詢數據庫中第二大的記錄的幾種方法
阿新 • • 發佈:2018-11-13
大數 過程 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只能自己定義
查詢數據庫中第二大的記錄的幾種方法