zoukankan      html  css  js  c++  java
  • sql查询最大的见多了,查询第二的呢???

    问题:

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

    建表语句

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

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

  • 相关阅读:
    强化学习
    详解a标签中href=""的几种用法 锚点
    使用Django自带的登录访问限制login_required
    ValueError: invalid literal for int() with base 10: ''
    Django 中创建Model时报以下错误: TypeError: init() missing 1 required positional argument: ‘on_delete’
    bootstrp实现同一界面多个模态框
    第十二章 Django框架开发
    Python format 格式化函数
    Python3.x在django中如何设置Content-Disposition,才能让浏览器正确保存中文命名的文件?
    python中的*和**参数传递机制
  • 原文地址:https://www.cnblogs.com/0201zcr/p/4820706.html
Copyright © 2011-2022 走看看