参考: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.不等于:
尽量用<>表示,大部分都是支持的。【某博主说的,我还没搞清楚原因】
(我习惯用 != )