MySQL刷题-牛客网 Day5

发现总是在用同一个大佬的题解思路~ 自己还是要慢慢学习,下次要先写自己的思路然后再看别人的思路比照分析不足,继续打怪升级吧~

汇总各个部门当前员工的title类型的分配数目

汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count

CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
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 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);

经过几道题后发现自己大致的sql框架是完全正确的,总是差了一点小细节如限制条件这种。下面首先写出自己看到这道题时候的思路和想法:
第一步 给出部门编号dept_no,这是在表departments中的,明显是要用GROUP BY来分组,dept_name没有难度;
第二步 对这句话 当前员工所有的title以及该类型title对应的数目count 进行拆解,这个查询重点不是员工的信息,在这里当然也没有给出employees表,是想汇总出每个部门各个title的人有多少,所以得出也要对title进行GROUP BY
第三步 总的框架需要用到几次内联结,第一次联结是要将departments和dept_emp进行联结,条件限定为当前,找出所有的当前部门,第二次联结是要将dept_emp和titles联结,条件限定为当前员工的当前title

下面给出sql语句!

SELECT de.dept_no, dp.dept_name, t.title, COUNT(t.title) AS count
FROM dept_emp AS de
INNER JOIN departments AS dp
ON de.dept_no = dp.dept_no
INNER JOIN titles AS t
ON de.emp_no = t.emp_no AND de.to_date = '9999-01-01' AND t.to_date = '9999-01-01'
GROUP BY de.dept_no, t.title

给出每个员工每年薪水涨幅超过5000的员工编号emp_no

给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
提示:在sqlite中获取datetime时间对应的年份函数为strftime(’%Y’, to_date)

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`));

薪水涨幅问题一般的技巧都是复用salaries表,这一点要记住,已经用到两次了,这里主要是没见过这个sqlite的函数,别的也没有什么难度,只有一张表,没有联结和嵌套。
给出解答:

SELECT s2.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
FROM salaries AS s1, salaries AS s2
WHERE s1.emp_no = s2.emp_no
AND s2.salary - s1.salary > 5000
AND strftime('%Y',s2.to_date) - strftime('%Y',s1.to_date) = 1
ORDER BY salary_growth DESC;

查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

本题的关键在于理解题意,逗号之前的条件很好解决,即用通配符找出对应的分类名称以及符合条件的电影数目,逗号之后的条件是指所对应分类所有的电影应该不止5部,而不是只包括robot的电影。
难点在于如何同时满足这几个范围限制不同的条件呢,此题技巧在于建立虚表满足条件二。
解答如下:

SELECT c.name, COUNT(f.film_id)
FROM film AS f, 
     film_category AS fc, 
     category AS c,
     (SELECT category_id 
      FROM film_category 
      GROUP BY category_id HAVING COUNT(category_id) >= 5) AS ci 
      -- 构造一个表即满足各分类电影数量>=5的条件
WHERE f.description LIKE '%robot%'
AND f.film_id = fc.film_id
AND fc.category_id = c.category_id
AND c.category_id = ci.category_id
发布了24 篇原创文章 · 获赞 0 · 访问量 320

猜你喜欢

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