例1:
一個Customer表,一個字段Value,現請問如何查到Value中第二大的值
select max(value) from Customer where value < (select max(value) from Customer)
例2:
數據庫中人表有三個屬性,用戶(編號,姓名,身高),查詢出該身高排名第二的高度。
1、查詢出沒有重復值的第二名,即假如最高的身高是182,有幾個人同時身高是182,則查出身高小於182的的最高的身高值。
1>、方式1:
select MAX(height) from users where height < (select MAX(height) from users );
意義:先查詢出最高的身高值,然后查詢身高小於該值的最高身高。
2>、方式2:
select top 1 height from users where height not in (select MAX(height) from users) order by height desc;
意義:先查詢出最高的身高,排除該身高,然后將數據進行排序(降序),查詢出當前的第一條數據。
3>、方式3:使用RANK()函數
rank函數考慮到了over子句中排序字段值相同的情況,值相同的時候RANK函數的到的值相等。
select top 1 height from ( select *,RANK() OVER (ORDER BY height desc) AS Rank from users ) t where rank<>1
意義:給每一個記錄一個行號,使用RANK函數,去掉身高值最高的記錄(重復值的rank函數獲得值相同)。
2、查詢出可能與最高身高值相同的第二名,即假如身高最高是182,有幾個人同時是182身高,第二名依然是182.
1>、方式1:
select top 1 * from (select top 2 height from users order by height desc) s order by height asc;
意義:將數據按照身高(降序)排列,查詢出前面的兩項,然后將這兩項按照身高升序,查詢第一項目。
2>、方式2:row_number函數的用途是非常廣泛,這個函數的功能是為查詢出來的每一行記錄生成一個序號(不考慮重復值)。
select top 1 height from ( select *,ROW_NUMBER() OVER (ORDER BY height desc) AS Rank from users ) t where rank<>1
意義:給每一個記錄一個行號ROW_NUMBER使用函數,去掉身高值最高的記錄(重復值的ROW_NUMBER函數獲得值不同)。