【中等】【176. 第二高的薪水】limit,offset与ifnull函数

【中等】【176. 第二高的薪水】MySql的分页查询!

(一)MySql必会

(1)limit和offset函数

在MySQL中,LIMIT和OFFSET是常用的用于分页查询的关键字。
LIMIT用于控制返回结果的行数,
而OFFSET则用于指定结果集的偏移量,即从哪一行开始返回结果。
通常结合使用它们来实现分页查询,可以按照以下的语法格式进行查询:

SELECT column_name(s)
FROM table_name
LIMIT row_count OFFSET offset;

其中,row_count表示要返回的行数,offset表示要跳过的行数。
例如,我们要查询从第 11 行开始的 5 条记录,可以使用以下查询:

SELECT *
FROM customers
LIMIT 5 OFFSET 10;

这将从表中跳过前 10 行记录,然后返回接下来的 5 行记录,即第 11 行到第 15 行。

需要注意的是,OFFSET的值是基于0的索引,即第一行为0。如果我们想要查询前 N 条记录,可以将 OFFSET 设置为 0,LIMIT 设置为 N。

请注意,在大型数据集上使用 OFFSET 和 LIMIT 可能会导致性能问题, 因为 MySQL 必须扫描并跳过指定的行数才能返回结果。在这种情况下,可以考虑使用其他方法来优化查询,如使用游标或分页库

(2) distinct关键字

在MySQL中,DISTINCT是一种关键字,用于查询时过滤掉重复的行数据,只返回不重复的结果。

使用DISTINCT关键字可以从指定的列中去除重复值,只返回唯一的值。下面是一个使用DISTINCT的简单示例:

SELECT DISTINCT column_name
FROM table_name;

其中,column_name是要进行过滤的列名,table_name是要查询的表名。

例如,如果有一个名为customers的表,其中有一个列名为country,我们想获取所有不重复的国家名称,可以使用以下查询:

SELECT DISTINCT country
FROM customers;

这将返回一个包含所有不重复国家名称的结果集。

请注意,DISTINCT关键字作用于所有选择的列。如果要使用多个列进行去重,可以在SELECT子句中指定多个列名。例如:

SELECT DISTINCT column1, column2
FROM table_name;

这将返回根据column1和column2两列进行去重的结果集。

值得注意的是,DISTINCT并不是一个函数,而是一个关键字,因此不需要将列名放在括号中。

在MySQL中,IFNULL是一个函数,用于处理空值(null)。它接受两个参数:要检查的值和替代值。

(3)ifnull函数

IFNULL函数的作用是,如果第一个参数不为空,则返回第一个参数的值;如果第一个参数为空,则返回第二个参数作为替代值。

以下是IFNULL函数的语法:

IFNULL(expression, alt_value)

其中,expression是要检查的值,alt_value是在expression为空时要返回的替代值。

例如,假设有一个名为students的表,其中有一个列名为age,我们想要查询学生的年龄,如果年龄为空,则显示为"未知"。可以使用以下查询:

SELECT IFNULL(age, '未知') AS age
FROM students;

这将返回一个名为age的结果集,如果年龄不为空,则显示实际年龄值;如果年龄为空,则显示为"未知"。

IFNULL函数可以在查询中的任何地方使用,不仅限于SELECT语句。它还可以在INSERT、UPDATE等语句中使用,用于处理空值情况。

(二)题目描述

查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。

Create table If Not Exists Employee (id int, salary int);
Truncate table Employee;
insert into Employee (id, salary) values ('1', '100');
insert into Employee (id, salary) values ('2', '200');
insert into Employee (id, salary) values ('3', '300')

(三)题解

select
       ifnull(
           (select distinct salary
               from Employee
               order by salary desc
               limit 1 offset 1),null)
           as SecondHighestSalary ;

在这里插入图片描述

修改后的代码如下: ```go func AppOperateRecharge(a *decorator.ApiBase, data *adminStruct.BusinessOrderRechargeName) error { logger.AccessLogger.Info("AppOperateRecharge...") resp := adminStruct.BusinessOrderRechargeResponse{} resp.ResponseCommon = a.NewSuccessResponseCommon() resQuerya := a.Ts.Table("business_base as a"). Select(`s.bid, a.bname, s.acct_bal, s.buy_sum_amt, ifnull(sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END), 0) as unpaid_amt, ifnull(sum(CASE WHEN i.epay_status=0 and i.contract_no='' and i.link_id = a.bid THEN i.order_amt ELSE 0 END), 0) as buyunpaid, ifnull(sum(CASE WHEN b.stmt_status = 0 THEN b.stmt_amt ELSE 0 END), 0) as stmt_amt, a.admin_uid, u.user_name, a.status`). Joins("left join source_pay_info as i on i.link_id=a.bid"). Joins("left join business_bal as s on s.bid=a.bid"). Joins("left join user_base as u on u.uid=a.admin_uid"). Joins("left join business_settlement as b on b.bid=a.bid"). Group("a.bid") if len(data.Bname) > 0 { resQuerya = resQuerya.Where("a.bname like ?", data.Bname) } utils.Error(resQuerya.Limit(a.Size). Offset(a.Offset).Count(&resp.Count). Find(&resp.Data).Error) return a.ReturnSuccessCustomResponse(resp) } ``` 修改的地方在以下部分: ```go ifnull(sum(i.order_amt) i.epay_status=0 and i.contract_no='' ),0)as buyunpaid, ``` 修改为: ```go ifnull(sum(CASE WHEN i.epay_status=0 and i.contract_no='' and i.link_id = a.bid THEN i.order_amt ELSE 0 END), 0) as buyunpaid, ``` 修改后的代码将修复原来存在的错误。现在,`ifnull` 函数将正确计算满足条件的订单金额总和,并将结果存储在 `buyunpaid` 字段中。这样,代码就能正常运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值