博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql查询最大的见多了,查询第二的呢???
阅读量:4499 次
发布时间:2019-06-08

本文共 2376 字,大约阅读时间需要 7 分钟。

问题:

   数据库中人表有三个属性,用户(编号,姓名,身高),查询出该身高排名第二的高度。

 

建表语句

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函数获得值不同)。

  致谢:感谢您的耐心阅读!假如有更好的答案希望不吝赐教。

 

转载于:https://www.cnblogs.com/0201zcr/p/4820706.html

你可能感兴趣的文章
C++虚析构函数
查看>>
《玩转.NET Micro Framework 移植-基于STM32F10x处理器》--微软中国.NET Micro Framework项目组工程师所作之序...
查看>>
php服务端搜索,功能改进
查看>>
unity, 在surface shader中访问顶点色
查看>>
Spring声明式事务配置
查看>>
并查集的实现
查看>>
Leetcode 350. Intersection of Two Arrays II
查看>>
EditPlus VC2010 and 2008 C/C++配置
查看>>
Practical Lessons from Predicting Clicks on Ads at Facebook
查看>>
JFrame面板
查看>>
Android自动化压力测试之Monkey Test 异常解读(五)
查看>>
Compressing Convolutional Neural Networks in the Frequency Domain 论文笔记
查看>>
设计模式:单例和多例
查看>>
Myslq 之修改数据库
查看>>
maven工程转为web工程时没有add web project capabilities选项的解决办法
查看>>
[BZOJ1192][HNOI2006]鬼谷子的钱袋
查看>>
正则表达式之 数据验证 与 文本替换
查看>>
CLR via C#:CLR的执行模型
查看>>
JS获取服务器时间
查看>>
如何对数据排序和拆分文件
查看>>