牛客网——SQL9&&SQL12&&SQL13&&SQL14&&SQL15--“查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t”

参考:https://blog.csdn.net/weixin_39599711/article/details/78132187
&& https://www.cnblogs.com/kexiblog/p/10653101.html

SQL9记录:

题目描述

获取所有部门当前(dept_manager.to_date='9999-01-01')manager的当前(salaries.to_date='9999-01-01')薪水情况,给出dept_no, emp_no以及salary(请注意,同一个人可能有多条薪水情况记录)
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_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`));

解答:

方法一:【使用 distinct  去重】
select distinct dm.dept_no,s.emp_no,s.salary from dept_manager dm left join salaries s on 
dm.emp_no = s.emp_no where dm.to_date='9999-01-01' and s.to_date = '9999-01-01';

方法二: 【使用 group by 分组】
select dm.dept_no,s.emp_no,s.salary from dept_manager dm left join salaries s on 
dm.emp_no = s.emp_no where dm.to_date='9999-01-01' and s.to_date = '9999-01-01'
group by s.salary;

答题心得:试了三次才写对,如果是现场笔试那我完了。啥也不说了,慢慢加油吧!


SQL12记录:

题目描述

获取所有部门中当前(dept_emp.to_date = '9999-01-01')员工当前(salaries.to_date='9999-01-01')薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_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`));
如插入:
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d001','1996-08-03','1997-08-03');

INSERT INTO salaries VALUES(10001,90000,'1986-06-26','1987-06-26');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','1997-08-03');
INSERT INTO salaries VALUES(10002,72527,'2000-08-02','2001-08-02');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,90000,'1996-08-03','1997-08-03');


则输出
dept_no			emp_no				salary
d001				10001					88958

解答:

方法一【我的方法】:
select de.dept_no,de.emp_no,s.salary from dept_emp de left join salaries s 
on de.emp_no = s.emp_no where de.to_date = '9999-01-01' and s.to_date = '9999-01-01' 
group by de.dept_no having max(s.salary);

方法二:
SELECT d.dept_no,d.emp_no,max(salary)
FROM dept_emp d, salaries s
WHERE d.emp_no = s.emp_no
AND d.to_date = '9999-01-01'
AND s.to_date = '9999-01-01'
GrOUP BY d.dept_no;

分析:
1、先用 left join on 连接两张表【本菜鸟只会熟练使用左连接嘿嘿】,限制条件是两张表的emp_no相同,即d.emp_no = s.emp_no;
2、选取每个员工当前的工资水平,用d.to_date = ‘9999-01-01’ AND s.to_date = '9999-01-01’作条件限制,因为此表中每条最新记录的 to_date 都用 9999-01-01 表示;
3、用GROUP BY d.dept_no将每个部门分为一组,用MAX()函数选取每组中工资最高者;(答题时因为这里分组写错了于是百度,好像经常不知道要将哪个条件分组)
4、将salaries用s代替,dept_emp用de代替,最后将MAX(s.salary)用salary代替后输出。


SQL13记录:

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
如插入:
INSERT INTO titles VALUES(10001,'Senior Engineer','1986-06-26','9999-01-01');
INSERT INTO titles VALUES(10002,'Staff','1996-08-03','9999-01-01');
INSERT INTO titles VALUES(10003,'Senior Engineer','1995-12-03','9999-01-01');
INSERT INTO titles VALUES(10004,'Engineer','1986-12-01','1995-12-01');
INSERT INTO titles VALUES(10004,'Senior Engineer','1995-12-01','9999-01-01');
..................................................

解答:

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

【写了3次才写对 】


SQL14记录:

题目描述

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略(即emp_no重复的title不计算,title对应的数目t不增加)。
CREATE TABLE IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

解答:

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

思路:
count(distinct emp_no)统计同一个title值且不包含重复emp_no 值得记录数

遇到的问题:
知道去重关键词是distinct 也知道它要用在语句开头处 , 但是最后还是没写对。

参考:https://www.cnblogs.com/kexiblog/p/10668521.html(老想给这个博客园的博主点赞了,60SQL题的解答都可以在她博客找到。大概看了一下,人家1.5h可以写11题外加整理到博客上。我,,,两天写了14题。)


SQL15记录:

题目描述

查找employees表所有emp_no为奇数,且last_name不为Mary(注意大小写)的员工信息,并按照hire_date逆序排列(题目不能使用mod函数)
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`));

解答:

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

或者
select * from employees where emp_no % 2 = 1 and last_name <> 'Mary'
order by hire_date desc;

思考过程
1.百度,查找id为奇数:mod(id,2)=1 , 也可以直接用 id % 2=1来表示 。
对应的,查找id为偶数:mod(id,2)=0 ,或id % 2=0
2.不等于:
尽量用<>表示,大部分都是支持的。【某博主说的,我还没搞清楚原因】
(我习惯用 != )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值