MySQL刷题-牛客网 Day3

今天这几道题很有意思
先看第一题的题目~

获取当前薪水第二多的emp_no以及其对应的薪水salary,不准使用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`));

不准使用order by,是一个很大的条件假如可以使用顺序条件,直接用LIMIT1,1即可。
这里的思路是将薪水第一多的的去除,再用MAX即可。
代码见下,

SELECT s.emp_no, MAX(salary), e.last_name, e.first_name
FROM salaries AS s
INNER JOIN employees AS e
ON s.emp_no = e.emp_no
WHERE s.to_date = '9999-01-01'
AND salary NOT IN (
SELECT MAX(salary)
FROM salaries
WHERE to_date = '9999-01-01'
)

思路很清奇!需要记住这道题。

查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth

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 (
(SELECT salary FROM salaries WHERE emp_no = '10001' ORDER BY to_date DESC LIMIT 1)
- (SELECT salary FROM salaries WHERE emp_no = '10001' ORDER BY to_date LIMIT 1)
) AS growth

解法很容易想到,最后的AS growth后面没有WHERE和FROM。

查找所有员工自入职以来的薪水涨幅情况

查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序

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 a.emp_no, (b.salary - c.salary) AS growth
FROM employees AS a
INNER JOIN salaries AS b
ON a.emp_no = b.emp_no AND b.to_date = '9999-01-01'
INNER JOIN salaries AS c
ON a.emp_no = c.emp_no AND a.hire_date = c.from_date
ORDER BY growth

b.to_date = ‘9999-01-01’ 是指目前还还在职的员工,
a.hire_date = c.from_date 是指当时就雇佣的员工。
这两个条件非常重要,要理解题意和sql条件的转化。

发布了24 篇原创文章 · 获赞 0 · 访问量 323

猜你喜欢

转载自blog.csdn.net/Helslie/article/details/104439335