题目15(没有13、14)
SQL15 查找employees表emp_no与last_name的员工信息
请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:
思路:这道题蛮简单的
- 肯定是所有字段都要有,所以Select * from employees;
- 工号为奇数,学过一点编程的都知道我们常用的判断奇数的方式 number%2!=0(即不能被2整除)
- 名字中不含Mary,这个直接where 名字字段!=“Mary”即可
- hire_date 逆序排列 order by + DESC;
SELECT * FROM employees
WHERE emp_no%2 != 0 AND last_name!="Mary"
ORDER BY hire_date DESC;
题目16
SQL16 统计出当前各个title类型对应的员工当前薪水对应的平均工资
请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:
思路:
- 首先题目要我们输出 科目和平均薪资,所以 select title和avg(s.salary)
- 接着把两个表连结成一个表,保证数据上是对应的正确的一致的
- 为什么用LEFT而不用RIGHT,是因为该题目测试项2 ,right会出现NULL值
- 按照title分组,以avg升序排序即可
SELECT title, avg(s.salary)
FROM titles
LEFT JOIN salaries as s
on titles.emp_no = s.emp_no
GROUP BY title
ORDER BY avg(s.salary)
题目17
SQL17 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
请你获取薪水第二多的员工的emp_no以及其对应的薪水salary
SELECT emp_no, salary
FROM salaries
ORDER BY salary DESC
LIMIT 1,1
思路:
这道题就简单多了
- Order by DESC 逆序排序
- limit关键字即可
题目18
SQL18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:
(温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)
思路:
由于不能使用order by,突然一下子被动了许多
但是思路捋一捋就清晰了
- 首先选出salary最大的值,再反选剩下的salary中最大的值t
- 两张表合成一张表,选出salary正好是t的值
题目19
SQL19 查找所有员工的last_name和first_name以及对应的dept_name
思路:
其实这个没啥好说的,无非就是三张表两两相连即可
SELECT last_name,first_name,dept_name
FROM departments
RIGHT JOIN (
SELECT dept_no,employees.emp_no,last_name,first_name
FROM employees
LEFT JOIN dept_emp
ON employees.emp_no = dept_emp.emp_no
) AS t1
ON departments.dept_no = t1.dept_no;
题目21(没有20)
SQL21 查找在职员工自入职以来的薪水涨幅情况
请你查找在职员工自入职以来的薪水涨幅情况,给出在职员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序,以上例子输出为
(注: to_date为薪资调整某个结束日期,或者为离职日期,to_date='9999-01-01’时,表示依然在职,无后续调整记录)
思路:
不知道别人怎么写,我这个看起来多,但是其实思路还是很简单的
- 分别找到其当前的工资t1 与入职时的工资 t2
- t1和t2 连接,把两个工资相减即得到涨幅
SELECT t1.emp_no, maxSalary-minSalary growth
FROM (
SELECT employees.emp_no,salary maxSalary
FROM employees
INNER JOIN salaries
ON employees.emp_no = salaries.emp_no
WHERE to_date = "9999-01-01"
GROUP BY emp_no
ORDER BY to_date
) AS t1
LEFT JOIN
(
SELECT employees.emp_no,salary minSalary
FROM employees
INNER JOIN salaries
ON employees.emp_no = salaries.emp_no
WHERE from_date = hire_date
GROUP BY employees.emp_no
) AS t2
ON t1.emp_no = t2.emp_no
ORDER BY growth ASC