查询数据库中第二大的记录的几种方法

在学习过程中,遇到一个问题,查询最大的数据时十分容易,使用MAX函数语句即可,但是如何查询第二大的记录呢, 抱着这个问题我开始查找资料

首先建表语句,我建立了一个employee的表,属性有id,name和age,其中id为int 自增 主键,name为char(5),age为int型,创建及插入数据语句略去

首先我看到了以下方法

方法一:

1 select top 1 height from users where height not in (select MAX(height) from users) order by height desc;

该方法使用了Top函数,但当我去试验该方法后发现Mysql没有Top函数,只有Limit函数,但是也差不多,于是改进后的sql语句如下

1 select  height from users where height not in (select MAX(height) from users) order by height desc limit 1;

该方法是首先查询出该表中最大的记录,然后排除该记录后再查询剩下数据中最大的记录。

方法二:

和上一方法类似,查询出最大的记录,然后查询剩下记录中比该记录小的最大数据记录,语句如下

1     SELECT MAX(age) AS age from empolyee
2     where age<(SELECT MAX(age)from empolyee)

经过试验后成功执行,但是查询出的记录只有age一项,改进后改为

1     SELECT * from empolyee
2     where age<(SELECT MAX(age)from empolyee) LIMIT 1

方法三:

使用rank函数,经过查询后得知mysql并没有rank函数,但是可以自己定义,经过查询rank函数定义的语句后,写出如下语句

1   SELECT r.id,age,rank from(
2     SELECT tmp.id,tmp.age,IF(tmp.id=@tmid,@rank:=1,@rank:=@rank+1) as rank,@tmid:=tmp.id
3     FROM (SELECT id,age from empolyee GROUP BY id,age ORDER BY id ASC,age DESC)tmp,
4     (select @rank:=0,@tmid:=null)tmp1
5     )r
6     WHERE age is not null and rank=2;

经过测试,能够成功查询出正确的记录

经过学习,对Sql语句有了进一步的了解,还有一点感想就是oracle和sql sever有rank函数好方便啊,不像mysql只能自己定义

原文地址:https://www.cnblogs.com/cangbaijun/p/9951558.html

时间: 2024-08-03 03:08:35

查询数据库中第二大的记录的几种方法的相关文章

查询数据库中所有表的记录数,所占空间,索引使用空间

常用 --查询数据库中所有表的记录数,所占空间,索引使用空间 exec sp_MSForEachTable @precommand=N'create table ##(表名 sysname,记录数 int,保留空间 Nvarchar(20),使用空间 varchar(20),索引使用空间 varchar(20),未用空间 varchar(20))', @command1=N'insert ## exec sp_spaceused ''?''', @postcommand=N'select * f

sql查询数据库中所有表的记录条数,以及占用磁盘空间大小。

1 SELECT 2 TableName = obj.name, 3 TotalRows = prt.rows, 4 [SpaceUsed(KB)] = SUM(alloc.used_pages)*8 5 FROM sys.objects obj 6 JOIN sys.indexes idx on obj.object_id = idx.object_id 7 JOIN sys.partitions prt on obj.object_id = prt.object_id 8 JOIN sys.

Oracle查询数据库中所有表的记录数

首先建立一个计算函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>create or

查询数据库中所有表的记录数和大小

if exists ( select  *            from    dbo.sysobjects            where   id = object_id(N'[dbo].[TableSpace]')                    and objectproperty(id, N'IsUserTable') = 1 )     drop table [dbo].[TableSpace]gocreate table TableSpace    (      Tabl

mysqli:查询数据库中,是否存在数据的三种校验方法

在我们编辑用户登录功能的时候,常常需要对用户输入的信息进行校验,校验的方法就是通过SQL语句进行一个比对,那么我们就需要用到以下三种中的一种进行校验啦 1.使用mysqli_num_rows()校验 例子: 成功情况: 失败情况: 2.使用mysqli_fetch_array()校验 例子: 成功情况: 失败情况: 3.使用mysqli_fetch_all()校验 例子: 成功情况: 失败情况: 以上 END 原文地址:https://www.cnblogs.com/finalanddistan

在SQL查询结果中添加自增列的两种方法

解决办法<一>:如果想查询出这个表的信息,并添加一列连续自增的ID,可用如下查询语句: SELECT Row_Number() over ( order by getdate() ) as init , * FROM 表名 解决办法<二>: 使用关键字IDENTITY创建临时表 SELECT IDENTITY(int,1,1) as Nid,* INTO #T FROM 表名 SELECT * FROM #T 原文地址:https://www.cnblogs.com/crrc/p/

查询数据库中重复记录的方法

select * from [DataBase].[dbo].[TableName] where [字段一] in (select [字段一] from [DataBase].[dbo].[TableName] group by [字段一] having count([字段一]) > 1) 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from peop

MySql 查询数据库中所有表名

查询数据库中所有表名select table_name from information_schema.tables where table_schema='csdb' and table_type='base table'; 查询指定数据库中指定表的所有字段名column_nameselect column_name from information_schema.columns where table_schema='csdb' and table_name='users'

SQL 中怎么查询数据库中具有的表、存储过程、试图数目、总触发器数、作业数

用户表:select count(*) 总表数 from sysobjects where xtype='u' 刚才那个是用户表,下面这个是系统表加用户表: select count(*) 总表数 from sysobject s where xtype in('u','s') 总视图数:select count(*) 总视图数 from sysobjects where xtype='v' 总存储过程数:select count(*) 总存储过程数 from sysobjects where