牛客网速刷sql 3天计划版

INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。
LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。

查找最晚入职员工的所有信息https://www.nowcoder.com/practice/218ae58dfdcd4af195fff264e062138f?tpId=82&tqId=29753&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

SELECT * FROM employees ORDER BY hire_date DESC LIMIT 0,1;

但是有人说最晚入职不一定只有一个人,所以选择最大日期即可:

select * from employees
where hire_date =
(select max(hire_date) from employees)

[编程题]查找入职员工时间排名倒数第三的员工所有信息

https://www.nowcoder.com/practice/ec1ca44c62c14ceb990c3c40def1ec6c?tpId=82&tqId=29754&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select * from employees order by hire_date desc limit 2,1;

limit后第一个2为no_of_rows即第几行,一般如果没有后面的 1 ,就会返回从0到2共3行,加了1就是从2开始后的一行,1即offset偏移量;

[编程题]查找当前薪水详情以及部门编号dept_no

https://www.nowcoder.com/practice/c63c5b54d86e4c6d880e4834bfd70c3b?tpId=82&tqId=29755&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

SELECT s.*,d.dept_no 
FROM salaries s inner join dept_manager d on s.emp_no = d.emp_no
WHERE s.to_date='9999-01-01'
AND d.to_date='9999-01-01';

说实话我觉得这两个表有问题,emp_no一致怎么会有不同的to_date?违反了完整性约束啊;

[编程题]查找所有已经分配部门的员工的last_name和first_name

https://www.nowcoder.com/practice/6d35b1cd593545ab985a68cd86f28671?tpId=82&tqId=29756&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select e.last_name,e.first_name,d.dept_no from employees e cross join dept_emp d on  e.emp_no = d.emp_no;

[编程题]查找所有员工的last_name和first_name以及对应部门编号dept_no

https://www.nowcoder.com/practice/dbfafafb2ee2482aa390645abd4463bf?tpId=82&tqId=29757&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

SELECT e.last_name, e.first_name, d.dept_no 
FROM employees e 
LEFT JOIN dept_emp d 
ON e.emp_no = d.emp_no;

编程题]查找所有员工入职时候的薪水情况

https://www.nowcoder.com/practice/23142e7a23e4480781a3b978b5e0f33a?tpId=82&tqId=29758&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select e.emp_no,s.salary from employees as e inner join salaries as s on e.emp_no = s.emp_no
AND e.hire_date = s.from_date
order by e.emp_no desc;

链接:https://www.nowcoder.com/questionTerminal/23142e7a23e4480781a3b978b5e0f33a
来源:牛客网

1、由于测试数据中,salaries.emp_no 不唯一(因为号码为 emp_no 的员工会有多次涨薪的可能,所以在 salaries 中对应的记录不止一条),employees.emp_no 唯一,即 salaries 的数据会多于 employees,因此需先找到 employees.emp_no 在 salaries 表中对应的记录salaries.emp_no,则有限制条件 e.emp_no = s.emp_no

2、根据题意注意到 salaries.from_date 和 employees.hire_date 的值应该要相等,因此有限制条件 e.hire_date = s.from_date

[编程题]查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

https://www.nowcoder.com/practice/6d4a4cff1d58495182f536c548fee1ae?tpId=82&tqId=29759&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select emp_no,count(*) as t from salaries group by emp_no having count(*) > 15;

[编程题]找出所有员工当前薪水salary情况

https://www.nowcoder.com/practice/ae51e6d057c94f6d891735a48d1c2397?tpId=82&tqId=29760&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select distinct salary from salaries where to_date = '9999-01-01' order by salary desc;

[编程题]获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'

https://www.nowcoder.com/practice/4c8b4a10ca5b44189e411107e1d8bec1?tpId=82&tqId=29761&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select d.dept_no,s.emp_no,s.salary from dept_manager d inner join salaries s on d.emp_no = s.emp_no
where d.to_date = '9999-01-01'
group by d.dept_no;

[编程题]获取所有非manager的员工emp_no

select emp_no from employees where emp_no not in (select emp_no from dept_manager);

[编程题]获取所有员工当前的manager

https://www.nowcoder.com/practice/e50d92b8673a440ebdf3a517b5b37d62?tpId=82&tqId=29763&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

这个我写了两种:

select e.emp_no,m.emp_no as manager_no
from dept_emp e inner join dept_manager m on e.dept_no = m.dept_no
where e.emp_no not in (select emp_no from dept_manager) and e.to_date='9999-01-01' AND m.to_date = '9999-01-01';
SELECT de.emp_no, dm.emp_no AS manager_no 
FROM dept_emp AS de INNER JOIN dept_manager AS dm
ON de.dept_no = dm.dept_no 
WHERE dm.to_date = '9999-01-01' AND de.to_date = '9999-01-01' AND de.emp_no <> dm.emp_no

第二种好一点,因为不等于更具普遍性

[编程题]获取所有部门中当前员工薪水最高的相关信息

https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6?tpId=82&tqId=29764&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select d.dept_no,d.emp_no,max(s.salary) from dept_emp as d inner join salaries as s on d.emp_no=s.emp_no
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
group by d.dept_no;

[编程题]从titles表获取按照title进行分组

https://www.nowcoder.com/practice/72ca694734294dc78f513e147da7821e?tpId=82&tqId=29765&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select title,count(title) as t from titles group by title having t >= 2;

[编程题]从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。

这题很不错

https://www.nowcoder.com/practice/c59b452f420c47f48d9c86d69efdff20?tpId=82&tqId=29766&tPage=

1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

1、先用GROUP BY title将表格以title分组,再用COUNT(DISTINCT emp_no)可以统计同一title值且不包含重复emp_no值的记录条数

select distinct title,count(distinct emp_no) as t from titles group by title having count(title)>=2;

[编程题]查找employees表

https://www.nowcoder.com/practice/a32669eb1d1740e785f105fa22741d5c?tpId=82&tqId=29767&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select * from employees where emp_no%2 = 1 and last_name != 'Mary' order by hire_date desc;

[编程题]统计出当前各个title类型对应的员工当前薪水对应的平均工资

https://www.nowcoder.com/practice/c8652e9e5a354b879e2a244200f1eaae?tpId=82&tqId=29768&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select t.title,avg(s.salary) as avg 
from salaries s inner join titles t on s.emp_no = t.emp_no
where t.to_date='9999-01-01' 
and s.to_date='9999-01-01'
group by t.title;

[编程题]获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

https://www.nowcoder.com/practice/8d2c290cc4e24403b98ca82ce45d04db?tpId=82&tqId=29769&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select emp_no,salary
from salaries
where to_date = '9999-01-01'
order by salary desc limit 1,1;

考虑到钱多的人可能不止一个,所以更好的语句是:

select emp_no, salary
 from salaries 
where salary = (select salary from salaries group by salary order by salary desc limit 1,1)

[编程题]获取当前薪水第二多的员工的emp_no以及其对应的薪水salary,不准使用order by

https://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719?tpId=82&tqId=29770&tPage=1&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select e.emp_no,s.salary,e.last_name,e.first_name from 
employees e inner join salaries s on e.emp_no = s.emp_no
where s.to_date = '9999-01-01' and s.emp_no=(select s1.emp_no from salaries s1 join salaries s2 on s1.salary<=s2.salary 
              and s1.to_date='9999-01-01' and s2.to_date='9999-01-01'
              group by s1.emp_no having count(s1.salary) = 2);

这题就很不错,我也不想用max,因为你用了max的局限很明显,如果我想找第三多,第四多的工资员工就会很乏力;

用max的解法

select e.emp_no,s.salary,e.last_name,e.first_name from 
employees e inner join salaries s on e.emp_no = s.emp_no
where s.to_date = '9999-01-01'
and 
s.salary = (select max(salary) from salaries where salary != (select max(salary) from salaries));

[编程题]获取员工其当前的薪水比其manager当前薪水还高的相关信息

https://www.nowcoder.com/practice/f858d74a030e48da8e0f69e21be63bef?tpId=82&tqId=29777&tPage=2&rp=&ru=%2Fta%2Fsql&qru=%2Fta%2Fsql%2Fquestion-ranking

select x.emp_no,manager.emp_no as manager_no,x.salary as emp_salary,manager.salary as manager_salary
from
(dept_emp d inner join salaries s on d.emp_no = s.emp_no and d.to_date = '9999-01-01' and s.to_date = '9999-01-01') x
inner join
(dept_manager d inner join salaries s1 on d.emp_no = s1.emp_no and d.to_date = '9999-01-01' and s1.to_date = '9999-01-01')as manager on x.dept_no = manager.dept_no
 and x.salary > manager.salary;

猜你喜欢

转载自blog.csdn.net/qq_17641711/article/details/82975701