牛客网SQL

2021/3/25 ——2021/4/15 第二轮刷题

SQL1

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

# 方法1:使用子查询

--获取所有最晚的hire_date,然后把与其相等的记录选出来,可以选多条

-- date类型的数据越大,表示时间越接近现在,即最晚,使用MAX()函数

-- where语句使用=和in都可得到结果

SELECT *
FROM employees
WHERE hire_date = (
      SELECT MAX(hire_date)
      FROM employees);


# 方法2:使用limit或者offset关键字

--通过倒序排序,查询第一条数据,就是最晚入职的信息,但是最晚入职可能不止一人,可能存在同一时间入职多人

SELECT * FROM employees
ORDER BY hire_date DESC LIMIT 1;
#
select * from employees
order by hire_date desc limit 0,1;
#
select * from employees
order by hire_date desc limit 1 offset 0;

# 补充:
-- limit n:表示从第0条数据开始,读取n条数据,是limt(0, n)的缩写
-- limit m,n:表示从第m条数据开始,读取n条数据
-- limit n offset m:表示从第m条数据开始,读取n条数据

SQL2

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

--存在员工入职时间可能一致的问题


# 方法1:子查询(最佳)

select * from employees
where hire_date =(
    select distinct hire_date 
    from employees
    order by hire_date desc
    limit 1 offset 2);
#
select * from employees
where hire_date =(
    select hire_date from employees
    group by hire_date
    order by hire_date desc
    limit 1 offset 2);

# 补充:
# 若存在多人(如3人)同时在最晚的一天入职的情形,必须要考虑去重(使用distinct或者group by)
distinct和group by的执行顺序都在limit前面

# 方法2:使用limit或者offset关键字

select * from employees
order by hire_date desc limit 2,1;
# 
select * from employees
order by hire_date desc limit 1 offset 2;

-- 总结:
-- 方法1适用于存在多个员工入职同时达到最晚一天的情况。泛用性更好。

 

SQL8

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

select distinct salary
from salaries
where to_date = '9999-01-01'
order by salary desc;

--注意:是当前时间

 SQL10

请你找出所有非部门领导的员工emp_no

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

--左连接+is null
--左连接左边所有表都会有,右边没有的自动补为null

SQL11

获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示

select de.emp_no, dm.emp_no manager
from dept_emp de
join dept_manager dm
on de.dept_no = dm.dept_no
where de.emp_no <> dm.emp_no
and dm.to_date = '9999-01-01'
and de.to_date = '9999-01-01';

--可以先筛选出当前日期的manager和员工
--且员工ID与manager不一样

 SQL12

获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列

-- 错误:d.emp_no是非聚合字段,不能出现在SELECT。因为一个聚合字段(dept_no)对应多个非聚合字段(emp_no),所以选择的时候,会随机选择非聚合字段中的任何一个,于是出错。

-- 聚合函数通过作用一组值而只返回一个单一值,因此,在SELECT语句中出现的字段要么为一个聚合函数的输入值,如COUNT(course),要么为GROUP BY语句中指定的字段,要么是常数,否则会出错。

-- 简而言之:使用GROUP BY子句时,SELECT子句中只能有聚合键、聚合函数、常数

SELECT a.dept_no,b.emp_no,a.salary
FROM
    (SELECT dept_no,MAX(salary) AS salary
    FROM salaries
    INNER JOIN dept_emp
    ON dept_emp.emp_no=salaries.emp_no
    WHERE dept_emp.to_date = '9999-01-01'
    AND salaries.to_date='9999-01-01'
    GROUP BY dept_no) AS a                         --找出各部门最高薪资
INNER JOIN
    (SELECT dept_no,dept_emp.emp_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是牛客数据分析方面的几道题目: 1. 某公司有一个销售平台,需要你通过数据分析找出哪些销售员的业绩最好。请根据以下表格结构,编写 SQL 查询语句,返回销售员的姓名、销售总额和销售数量,按销售总额从高到低排序。 | 销售员编号 | 销售员姓名 | 销售日期 | 销售金额 | |-----------|-----------|---------|---------| | 001 | 张三 | 2021-02-01 | 5000 | | 002 | 李四 | 2021-02-02 | 3000 | | 001 | 张三 | 2021-02-03 | 10000 | | 003 | 王五 | 2021-02-04 | 8000 | | 002 | 李四 | 2021-02-05 | 6000 | | 001 | 张三 | 2021-02-06 | 7000 | 2. 某公司有一个电商平台,需要你通过数据分析找出哪些商品的销售量最好。请根据以下表格结构,编写 SQL 查询语句,返回商品名称、销售总量和销售总额,按销售总量从高到低排序。 | 商品编号 | 商品名称 | 销售日期 | 销售数量 | 商品单价 | |-----------|-----------|---------|---------|---------| | 001 | 商品A | 2021-02-01 | 10 | 500 | | 002 | 商品B | 2021-02-02 | 15 | 300 | | 001 | 商品A | 2021-02-03 | 20 | 500 | | 003 | 商品C | 2021-02-04 | 25 | 200 | | 002 | 商品B | 2021-02-05 | 30 | 300 | | 001 | 商品A | 2021-02-06 | 35 | 500 | 3. 某电商平台有一个用户行为表,记录了用户在平台上的操作记录。请根据以下表格结构,编写 SQL 查询语句,返回每个用户在平台上的操作总数和最近一次操作的时间。 | 用户编号 | 操作类型 | 操作时间 | |-----------|-----------|---------| | 001 | 登录 | 2021-02-01 10:00:00 | | 002 | 注册 | 2021-02-02 10:00:00 | | 001 | 浏览商品 | 2021-02-02 11:00:00 | | 002 | 下单 | 2021-02-03 10:00:00 | | 001 | 支付订单 | 2021-02-03 11:00:00 | | 003 | 注册 | 2021-02-04 10:00:00 | | 001 | 评价商品 | 2021-02-04 11:00:00 | | 002 | 浏览商品 | 2021-02-05 10:00:00 | | 003 | 下单 | 2021-02-06 10:00:00 | | 001 | 登出 | 2021-02-06 11:00:00 | 以上是三道数据分析方面的牛客题目,希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值