【中等】【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 ;