牛客网题目1-10

题目链接:https://www.nowcoder.com/ta/sql
第一查找最后一名员工的消息

首先,先确定最晚入职的日期,根据题目,每个人的入职时间都不一样,确定最晚的那个时间也就等于最晚入职的那个人
找到最晚入职日期的时间

select max(hire_date) from employees;

然后从表格中查找最后那个人的全部信息

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

第二题
这条语句主要解释就是查找最后第三列信息
select hire_date from employees ORDER BY hire_date desc limit 2,1
在这条语句中,limit(2,1)的意思就是从第三行开始取一行数据,即是第三条,一般排序用的是order by
select *
from employees
where hire_date=(select hire_date from employees ORDER BY hire_date desc limit 2,1);

第三题
在这题,主要是审题,然后就是表的关联。这种题目明显是在说明查找薪水详情以及其对应部门编号(select).但在当前(dept_manager.to_date=‘9999-01-01’)的前提下(where)
理解好题意,就一切好办了
另外:注意一点就是分清主表和次表,顺序调换就会出错
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’;

第四题
last_name和first_name以及dept_no这全是属性,没必要复杂化,很简单的
select last_name,first_name,dept_no
from employees s
INNER JOIN dept_emp d
on s.emp_no = d.emp_no;

第五题
这个例子就很好解释为什么用左表
举例说明
学生表,考试成绩表
from student left jion Result
结果查出所有学生,和对应的成绩。但是可能有学生没参加考试,所以对应的Result为null,表示缺考。
在第五题中,我们暂时没有分配具体部门的员工,也就是主表employees必须有,但dept_emp可能存在缺失的情况,也就是没分配的为null
select last_name,first_name,dept_no
from employees s
left join dept_emp d
on d.emp_no = s.emp_no;

第六题
hire_date date NOT NULL//这是薪水的入职日期
from_date date NOT NULL//这是员工的入职日期
当两者相等,也就是题目的
看的是筛选条件
select e.emp_no,s.salary
from employees e
inner join salaries s
on e.emp_no=s.emp_no
where e.hire_date=s.from_date
order by e.emp_no desc;

第七
记住这句话
WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。

HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。
SQL语句执行顺序:FROM→JOIN ON→WHERE→GROUP BY→SELECT(字段)→SELECT(聚合函数)→HAVING→ORDER BY→LIMIT
讲真,我也不理解题意,为什么分类
select emp_no,count(*) as t
from salaries s
group by emp_no
having t >15

第八
这个可以对group by分组有个很好的深刻理解
部门人数
我们现在想知道每个部门有多少名在职员工,步骤如下:

筛选在职员工 where to_date=‘9999-01-01’;
对部门进行分组group by dept_no
对员工进行计数 count(emp_no)

这道题,同理,我也不知道为什么分组,不过清楚distinct + 类名
group by salary ORDER BY salary DESC,也清楚降序的使用
select salary
from salaries s
where s.to_date=‘9999-01-01’
group by salary
ORDER BY salary DESC

第九
解题思路:关键点是dept_manager表的to_date和salaries表的to_date都要等于’9999-01-01’,s.to_date = '9999-01-01’容易理解,限定当前时间当前工资,d.to_date = '9999-01-01’则限定在职经理,注意理解题目,有两个“当前”。
有必要去理解on对应的是什么
select d.dept_no,d.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’ and s.to_date=‘9999-01-01’

第十

select emp_no
from employees
where emp_no not in(
select e.emp_no
from employees e
inner join dept_manager d
on e.emp_no=d.emp_no
);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值