sql数据分析实战_牛客网SQL单向选择题

sql数据分析实战_牛客网SQL单向选择题牛客网数据库SQL实战剖析(1-10)

牛客网数据库SQL实战剖析(1-10)

1. 查找最晚入职员工的所有信息

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

代码100分

解题思路:根据入职时间倒序排序order by ... DESC,然后再取一条记录,就是最晚入职的员工。

代码100分select * from employees 
order by hire_date DESC limit 1;

这样做有一个问题,hire_date是 date 类型,很有可能多条记录中是同一个时间入职的,所以说时间类型还是用时间戳比较精切。

来源:https://www.cnblogs.com/Jie-Jack/p/3793304.html

针对这道题目可以使用 MAX() 函数,然后用一个子查询。

select * from employees
where hire_date = (select MAX(hire_date) FROM employees);

MAX()先查询出最晚入职的时间,然后再查询出在最晚时间入职的所有员工。


2. 查找入职员工时间排名倒数第三的员工所有信息

查找入职员工时间排名倒数第三的员工所有信息

代码100分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`));

解题思路:查询入职时间倒数第三的,要先进行排序,再取三条记录。MySQL中的结果集默认以正序排列,要逆序排列就要使用 DESC,取第三条则是使用limit

select * from employees
order by hire_date DESC 
limit 2,1;

3. 查找当前薪水详情以及部门编号dept_no

查找各个部门当前(to_date=”9999-01-01″)领导当前薪水详情以及其对应部门编号dept_no

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

解题思路:这是一个等值连接的题目,用员工编号emp_no 做关联即可。

select s.*, d.dept_no
from salaries s
join dept_manager d on d.emp_no = s.emp_no
where d.to_date="9999-01-01";

上面的SQL有一个优化的点,就是可以用 s.to_date="9999-01-01" 再进行一次去重锁定。修改之后的 SQL 如下所示:

select s.*, d.dept_no
from salaries s
join dept_manager d on d.emp_no = s.emp_no
where d.to_date="9999-01-01"  and s.to_date="9999-01-01";

吐槽:牛客网里,表 dept_manager 用两个字母的别名 dm,竟然过不了…


4. 查找所有已经分配部门的员工的last_name和first_name以及dept_no

查找所有已经分配部门的员工的last_name和first_name以及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`));

解题思路:这道题开始想到用一个子查询,先查询出所有部门id,作为条件去查询员工表。然后看到还需要查询出部门表里的dept_no ,所以觉得用外连接更加合适,用dept_emp 表作为主表进行查询。

select e.last_name, e.first_name, d.dept_no
from dept_emp  d
left join employees e on d.emp_no=e.emp_no;

5. 查找所有员工的last_name和first_name以及对应部门编号dept_no

查找所有员工的last_name和first_name以及对应部门编号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`));

解题思路:这个和上一题一个意思,只是这题里,没有部门号的也要查询出来,即查询所有员工,以员工表作为主表。

select e.last_name, e.first_name, d.dept_no
from employees e
left join dept_emp  d on d.emp_no=e.emp_no;

6. 查找所有员工入职时候的薪水情况

查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_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`));

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

解题思路:这道题要考虑到,员工的入职时的薪水情况,即他入职第一个月时的薪水,即employees.​hire_date=salaries.​from_date​​

select e.emp_no, s.salary
from employees e
join salaries s on e.emp_no=s.emp_no and e.hire_date = s.from_date
order by e.emp_no DESC;

7. 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

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

解题思路:看到这道题第一反应是,这道题也太复杂了。因为薪水涨幅需要比较前后两个月的薪水,如果薪水下降是不能算涨幅的。所以,用解题的思路,我觉得这道题不会这么复杂,就大胆假设它默认一直涨薪的。

从应试的角度,我觉得它是要考察 group by...having...,也就是先通过 emp_no 进行分组,再过滤分组记录数大于15的记录

select emp_no, count(emp_no) as t
from salaries
group by emp_no
having t > 15;

果然是这样。不用纠结这道题的题意,知道考察点在group by...having...就行了。

MySQL having子句


8. 找出所有员工当前薪水salary情况

找出所有员工当前(to_date=”9999-01-01″)具体的薪水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`));

解题思路:这道题讲到了,相同的薪水只显示一次,就是让我们用 DISTINCT 去重。

select DISTINCT salary
from salaries
where to_date="9999-01-01"
order by salary DESC;

9. 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=”9999-01-01″

获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date=”9999-01-01″

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

解题思路:这道题先看表结构,emp_no,dept_nodept_manager 表的主键,这就表示一个部门可能有多个领导,然后dept_manager 去关联salaries 表查询工资即可,限制条件是查询当天的工资 s.to_date="9999-01-01";

select d.dept_no, d.emp_no, s.salary
from dept_manager d
join salaries s on d.emp_no = s.emp_no
where s.to_date="9999-01-01";

但是我这样写,竟然AC不过,导入数据后发现,查询结果是这样的,意思就是一个部门的一个领导,在同一天会有多份工资??

d001	10002	72527
d001	10002	72527
d001	10002	72527
d001	10002	72527
d001	10002	72527
d001	10002	72527
d004	10004	40054
d004	10004	42283
d004	10004	42542
d004	10004	46065
d004	10004	48271
d004	10004	50594
d004	10004	52119
d004	10004	54693
d004	10004	58326

要再加一个查询条件d.to_date="9999-01-01",看讨论说是表示在职的经理。

select d.dept_no, d.emp_no, s.salary
from dept_manager d
join salaries s on d.emp_no = s.emp_no
where s.to_date="9999-01-01" and d.to_date="9999-01-01";

10. 获取所有非manager的员工emp_no

获取所有非manager的员工emp_no

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

解题思路:查找不是 Manager 的员工,即 employees 左连接 dept_manager 之后,没有在 dept_manager 表中查询到记录的员工。所以在关联之后,判断 d.dept_no IS NULL; 就是在 dept_manager 表中没有数据的员工了。

select e.emp_no
from employees e
left join dept_manager d on e.emp_no = d.emp_no
where d.dept_no IS NULL;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9144.html

(0)
上一篇 2023-02-14
下一篇 2023-02-14

相关推荐

  • stonebase_矿渣社区

    stonebase_矿渣社区我们又把近期的一些社区热点问题做了一次汇总,同步给所有关注StoneDB的同学们~ 提问Qustions & 解答Answers Q:现在StoneDB单机什么硬件规格部署能分析100TB级别

    2023-06-01
    225
  • sql初学者笔记 语法基础pdf_sql存储过程语法

    sql初学者笔记 语法基础pdf_sql存储过程语法常见注释 — 很少支持 #行内注释 /**/段落注释 基础语法 SELECT 检索数据 语法 作用 例子 释义 select 查找列,并返回行 select prod_name from produ

    2023-03-15
    140
  • Linux CentOS7 的安装[通俗易懂]

    Linux CentOS7 的安装[通俗易懂]实现步骤如下 点击文件顶部导航条文件 > 新建虚拟机 > 选择典型,当然你也可以选择自定义,个人觉得典型好点 选择销后安装镜像 解这选择Linux 下面选择C

    2023-02-23
    150
  • WEB安全入门:如何防止 CSRF 攻击?

    WEB安全入门:如何防止 CSRF 攻击?现在,我们绝大多数人都会在网上购物买东西。但是很多人都不清楚的是,很多电商网站会存在安全漏洞。乌云就通报过,国内很多家公司的网站都存在 CSRF 漏洞。如果某个网站存在这种安全漏洞的话,那么我们在购…

    2023-03-14
    163
  • 解析分页思想+分页实战「终于解决」

    解析分页思想+分页实战「终于解决」一、排除Top分页法(自命名,非规范) 思想:所谓“排除Top分页”,主要依靠“排除”和Top这个两大核心步骤。首先查询当前页码之前的数据,然后将该数据从总数据中排除掉,在从剩下的数据中获取前N条记录

    2023-03-22
    159
  • 用Python TKinter构建强大的图形用户界面

    用Python TKinter构建强大的图形用户界面TKinter是Python的标准GUI库之一,它提供了创建GUI程序所需的所有基本控件,例如按钮、标签、文本框、下拉列表、滚动条等等。同时,TKinter还集成了几个流行的GUI样式,例如Windows、MacOS、Linux等。因此,使用Python和TKinter,我们可以轻松地构建功能强大的GUI应用程序。

    2024-02-28
    87
  • 用Python求解圆周率的平方根

    用Python求解圆周率的平方根求解圆周率的方法有很多种,其中一种常用的方法是蒙特卡罗方法。假设有一个圆和一个正方形,正方形边长为圆的直径,当在正方形中随机生成大量点时,经过圆内点的数量占总点数的比例将趋近于圆的面积与正方形面积的比例,而圆的面积与正方形面积的比例是圆周率的平方的1/4。于是,通过这一比例就可以近似求出圆周率的值。

    2024-03-02
    87
  • Python中datetime.datetime.strptime的使用方法

    Python中datetime.datetime.strptime的使用方法在Python中,时间的处理是非常重要的。datetime模块提供了多个方法来处理时间。其中,strptime方法是一个非常实用的方法。strptime方法可以将字符串表示的时间转换为datetime类型。

    2024-04-09
    77

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注