编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
答案如下:
第一种写法:
SELECT MAX(Salary) AS SecondHighestSalary
FROM Employee
where salary < ( SELECT MAX(Salary) FROM Employee )
第二种写法:
select IFNULL((select distinct(Salary)
from Employee
order by Salary desc
limit 1,1),null) as SecondHighestSalary
1,IFNULL() 函数
IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
IFNULL(expression, alt_value)
例如:SELECT IFNULL(NULL, “RUNOOB”);
输出结为:RUNOOB
2,distinct去重
1.Distinct 位置
单独的distinct只能放在开头,否则报错,语法错误,与其他函数使用时候,没有位置限制如下
Select player_id,count(distinct(task_id))from task;
这种情况下是正确的,可以使用。
2.Distinct用法
a.在count计算不重复的记录的时候能用到
比如SELECT COUNT( DISTINCT player_id ) FROM task;
就是计算talbebname表中id不同的记录有多少条
b,在需要返回记录不同的id的具体值的时候可以用
比如SELECT DISTINCT player_id FROM task;
返回talbebname表中不同的id的具体的值
c.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义
比如SELECT DISTINCT player_id, task_id FROM task;
实际上返回的是player_id与task_id同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得player_id与task_id都相同的才被排除了,与我们期望的结果不一样,我们期望的是player_id不同被过滤
在这种情况下,distinct同时作用了两个字段,player_id,task_id
d.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的
e. 其实还有另外一种解决方式,就是使用
SELECT player_id, task_id, count(DISTINCT player_id) FROM task.
虽然这样的返回结果多了一列无用的count数据(有时也许就需要这个数据)
f.同时我们还可以利用下面的方式解决b遇到的歧义问题通过group by 分组
select player_id,task_id from task group by player_id
group by 必须放在 order by 和 limit之前,不然会报错
g.对null不过滤
h.不能与all同时使用
3,limit
limit m,n是指从第m+1条开始,取n条。
select * from tablename limit 2,4
即取出第3条至第6条,4条记录