一.orderby实现
题目描述
获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
select emp_no,salary
from salaries
where salary=
(select distinct salary from salaries
order by salary desc
limit 1,1
)
或
select emp_no,max(salary)
from salaries
where salary<
(select max(salary) from salaries where salaries.to_date='9999-01-01')
考虑只有一行情况(只有一行,返回null)
IFNULL(expr1,expr2)的用法:
假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。
select ifnull((
select distinct salary from Employee order by salary desc limit 1 offset 1),null)
as SecondHighestSalary
二.多表连接(不用oreder by)
题目描述
查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,你可以不使用order by完成吗
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
输出描述
select s.emp_no,max(s.salary),e.last_name,e.first_name
from employees as e inner join salaries as s
on e.emp_no =s.emp_no
where salary<
(select max(salary) from salaries where s.to_date='9999-01-01')
and s.to_date='9999-01-01'