牛客SQL练习笔记


题目一: 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary

获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
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`));

解题思路:

1.用子查询获取 “薪水第二多的员工”
2.用order by salary desc 来获取逆序的薪资排序结果
3. 用limit 1,1 来获取第二个员工的信息


知识点补充:

limit语法: limit i,j

  • i为数据条的索引位置
  • j为从索引位置i开始获取多少条数据

答案:


select emp_no , salary from salaries
where to_date='9999-01-01' 
and salary = (
    select distinct salary from salaries order by salary desc  limit 1,1  
)


题目二:查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by

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


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

解题思路:

  • 两表连接
  • 排除最大数据的数据集中的最大数据就是原始数据集中的第二大数据:排除了最高薪资后的其他数据中的最高薪资,就是第二高的薪资。


知识点补充:

  1. 聚合函数的出现与Where和Having无关
  2. group by 之后如果需要添加条件 用having
  3. 聚合函数与Having,Where的关系:where > 聚合函数 > having
  • 聚合函数要比having先执行
  • where要比聚合函数先执行
  • group by 要与 having一起出现

答案:

select e.emp_no,Max(s.salary) as 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 not in (
    select Max(salary) from salaries where to_date='9999-01-01'
)

题目三:查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工(三表)

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

解题思路:
  • 通过两次left join 将三表连接,此时需要注意连接顺序
  1. 最终目标是要获取部门名称dept_name=null的数据
  2. 所以departments应该最后被连接
  3. 通过employees的emp_no字段,连接employees和dept_emp,此时可以获取dept_no
  4. 再通过dept_no 将上一次的连接结果 连接departments,最后可获取空的dept_name

答案:
select e.last_name,e.first_name,d.dept_name
from
employees as e left join dept_emp as de 
on e.emp_no = de.emp_no
left join departments as d
on d.dept_no = de.dept_no

疑惑:
表结构中每一个字段都不为空,最后结果何来的null值


全部评论

相关推荐

真tmd的恶心,1.面试开始先说我讲简历讲得不好,要怎样讲怎样讲,先讲背景,再讲技术,然后再讲提升多少多少,一顿说教。2.接着讲项目,我先把背景讲完,开始讲重点,面试官立即打断说讲一下重点,无语。3.接着聊到了项目的对比学习的正样本采样,说我正样本采样是错的,我解释了十几分钟,还是说我错的,我在上一家实习用这个方法能work,并经过市场的检验,并且是顶会论文的复现,再怎么不对也不可能是错的。4.面试官,说都没说面试结束就退出会议,把面试者晾在会议里面,丝毫不尊重面试者难受的点:1.一开始是讲得不好是欣然接受的,毕竟是学习。2.我按照面试官的要求,先讲背景,再讲技术。当我讲完背景再讲技术的时候(甚至已经开始蹦出了几个技术名词),凭什么打断我说讲重点,是不能听出人家重点开始了?这也能理解,每个人都有犯错,我也没放心上。3.我自己做过的项目,我了解得肯定比他多,他这样贬低我做过的项目,说我的工作是错误的,作为一个技术人员,我是完全不能接受的,因此我就和他解释,但无论怎么解释都说我错。凭什么,作为面试官自己不了解相关技术,别人用这个方式work,凭什么还认为这个方法是错的,不接受面试者的解释。4.这个无可厚非,作为面试官,不打招呼就退出会议,把面试者晾着,本身就是有问题。综上所述,我现在不觉得第一第二点也是我的问题,面试官有很大的问题,就是专门恶心人的,总结面试官说教,不尊重面试者,打击面试者,不接受好的面试者,技术一般的守旧固执分子。有这种人部门有这种人怎么发展啊。最后去查了一下,岗位关闭了。也有可能是招到人了来恶心人的,但是也很cs
牛客20646354...:招黑奴啊,算法工程师一天200?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务