码迷,mamicode.com
首页 > 数据库 > 详细

sql查询第二大的记录(转)

时间:2015-09-19 19:39:30      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:

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

create table users
(
    id int identity(1,1) primary key,
    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:
查询出可能与最高身高值相同的第二名,即假如身高最高是182,有几个人同时是182身高,第二名依然是182.

select top 1 * from  (select top 2 height from users order by height desc) s order by height asc; 

解析:将数据按照身高(降序)排列,查询出前面的两项,然后将这两项按照身高升序,查询第一项目。
http://www.cnblogs.com/0201zcr/p/4820706.html
Oracle版本:

--创建表
declare
  tableNum number;
begin
  select count(1)
    into tableNum
    from user_tables t
   where t.TABLE_NAME = USERS;
  dbms_output.put_line(Table Num: || tableNum);
  if (tableNum = 0) then
    execute immediate create table USERS(
  id number(10),
  name varchar2(20),
  height number(3),
  constraint USERS_ID_PK primary key (id));
  else
    truncate table USERS;
  end if;
  select count(1)
    into tableNum
    from user_tables t
   where t.TABLE_NAME = USERS;
  dbms_output.put_line(Table Num: || tableNum);
  --insert into users (id,name, height) values (1,‘zhangsan‘, 182);
end;

这个块中,在创建表结构后,不能直接insert,会报表不存在
输出结果:
要显示dbms_output.put_line的输入内容,需要在command或sqlplus中执行set serverout on;

Table Num:0
Table Num:1
PL/SQL procedure successfully completed
  insert into users (id,name, height) values (1,zhangsan, 182);
  insert into users (id,name, height) values (2,李四, 122);
  insert into users (id,name, height) values (3,张强, 132);
  insert into users (id,name, height) values (4,王明, 122);
  insert into users (id,name, height) values (5,姜明, 182);
  insert into users (id,name, height) values (6,蒋克龙, 182);
  insert into users (id,name, height) values (7,zhang, 182);
  insert into users (id,name, height) values (8,安安, 181);
  insert into users (id,name, height) values (9,健健, 181);
  insert into users (id,name, height) values (10,明明, 181);
  insert into users (id,name, height) values (11,小小, 177);
  insert into users (id,name, height) values (12,旺旺, 123);
  insert into users (id,name, height) values (13,卡纳, 175);
  insert into users (id,name, height) values (14,文鑫, 166);
  insert into users (id,name, height) values (15,健明, 155);
  insert into users (id,name, height) values (16,拉拉, 152);
  insert into users (id,name, height) values (17,青青, 132);
  insert into users (id,name, height) values (18,乐乐, 155);
  insert into users (id,name, height) values (19,KK, 123);
  insert into users (id,name, height) values (20,FF, 122);
  insert into users (id,name, height) values (21,Lily, 152);
select max(j.height)
  from users j
 where j.height < (select max(s.height) from users s)

技术分享

select g.height
  from (select j.height
          from users j
         where j.height not in (select MAX(j.height) from users j)
         order by j.height desc) g
 where /*rownum < 2*/
 rownum = 1;

技术分享

select g.height
  from (select t.height
          from (select j.height
                  from users j
                 where rownum < 3
                 order by j.height desc) t
         order by t.height asc) g
 where rownum < 2
/* rownum=1*/
;

技术分享




sql查询第二大的记录(转)

标签:

原文地址:http://www.cnblogs.com/softidea/p/4821946.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!