問題:
數據庫中人表有三個屬性,用戶(編號,姓名,身高),查詢出該身高排名第二的高度。
建表語句
create table users ( id int identity(1,1) primary key, name varchar(20), height float );
數據庫表:用戶表(Users)
數據庫字段 |
字段意義 |
數據類型 |
約束 |
備注 |
id |
編號 |
int |
主鍵 |
自增長 |
name |
姓名 |
VARCHAR(20) |
|
|
height |
身高 |
float |
|
|
測試數據
insert into users(name,height) values('zhangsan',182); insert into users(name,height) values('李四',122); insert into users(name,height) values('張強',132); insert into users(name,height) values('王明',122); insert into users(name,height) values('姜明',182); insert into users(name,height) values('蔣克龍',182); insert into users(name,height) values('zhang',182); insert into users(name,height) values('安安',181); insert into users(name,height) values('健健',181); insert into users(name,height) values('明明',181); insert into users(name,height) values('小小',177); insert into users(name,height) values('旺旺',123); insert into users(name,height) values('卡納',175); insert into users(name,height) values('文鑫',166); insert into users(name,height) values('健明',155); insert into users(name,height) values('拉拉',152); insert into users(name,height) values('青青',132); insert into users(name,height) values('樂樂',155); insert into users(name,height) values('KK',123); insert into users(name,height) values('FF',122); insert into users(name,height) values('Lily',152);
查詢語句
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函數獲得值不同)。
致謝:感謝您的耐心閱讀!假如有更好的答案希望不吝賜教。