牛客SQL题目

题目链接:https://www.nowcoder.com/ta/sql

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

    select *
    from
    employees
    where
    hire_date = (select max(hire_date) from employees);
  2. 查找入职员工时间排名倒数第3的员工所有信息

    select *
    from
    employees
    order by
    hire_date
    desc --降序
    limit 2,1;--从3项,偏移1项,即第3项
  3. 查找各个部门当前(to_date='9999-01-01')的领导的当前薪水详情以及其对应部门编号dept_no

    select s.*,d.dept_no
    from salaries as s
    join dept_manager as d
    on d.emp_no=s.emp_no
    where s.to_date='9999-01-01'
    and d.to_date='9999-01-01';
  4. 查找所有已经分配部门的员工的last_name和first_name

    select e.last_name,e.first_name,d.dept_no
    from employees as e
    join dept_emp as d
    on e.emp_no = d.emp_no;
  5. 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工

    select e.last_name,e.first_name,d.dept_no
    from employees as e
    left join dept_emp as d--坐表为主,右表补充,为空补NULL
    on e.emp_no = d.emp_no;
  6. 查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序

    select e.emp_no,s.salary
    from salaries as s
    join employees as e
    where e.emp_no = s.emp_no
    and e.hire_date = s.from_date
    order by
    e.emp_no
    desc;
  7. 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

    count( ):统计记录的条数

    还需要group by emp_no将每个员工的记录显示在一条记录中

    select emp_no,count(emp_no) as t
    from salaries
    group by
    emp_no
    having t > 15;
  8. 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

    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'

    select d.dept_no,d.emp_no,s.salary
    from dept_manager as d
    join salaries as s
    on d.emp_no=s.emp_no
    where d.to_date='9999-01-01'
    and s.to_date='9999-01-01';
  10. 获取所有非manager的员工emp_no

    select emp_no
    from employees
    where emp_no not in (select emp_no from dept_manager);
  11. 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。

    select e.emp_no,m.emp_no as manager_no
    from dept_emp as e
    join dept_manager as m
    on e.dept_no=m.dept_no
    where e.emp_no <> m.emp_no -- 当前manager是自己不显示,<>不等于
    and e.to_date='9999-01-01'
    and m.to_date='9999-01-01';
  12. 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary

    select d.dept_no,d.emp_no,max(s.salary)
    from dept_emp as d
    join salaries as s
    on d.emp_no = s.emp_no
    group by
    d.dept_no;
  13. 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。

    select title,count(title) as t
    from titles
    group by
    title
    having t >= 2;
  14. 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

    select * from employees
    where emp_no%2 =1
    and last_name <> 'Mary'
    order by
    hire_date
    desc;
  15. 统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。

    select t.title,avg(s.salary)
    from titles as t
    join salaries as s
    on t.emp_no = s.emp_no
    where s.to_date='9999-01-01'
    and t.to_date='9999-01-01'
    group by
    t.title;
  16. 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary

    select emp_no,salary from salaries
    where to_date='9999-01-01'
    order by
    salary
    desc
    limit 1,1; -- 降序,取第二个
  17. 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by

    select e.emp_no,s.salary,e.last_name,e.first_name
    from employees as e
    join salaries as s
    on e.emp_no=s.emp_no
    where s.to_date='9999-01-01'
    order by
    s.salary
    desc
    limit 1,1;

    不适用order by:需要用嵌套select和max结合

    select e.emp_no,max(salary) ,e.last_name,e.first_name --这里用max(salary)
    from salaries as s,employees as e
    where s.emp_no = e.emp_no
    and salary< -- 小于最大薪水中的最大,就是第二大
    (
    select max(salary)
    from salaries
    where to_date = '9999-01-01'
    );
  18. 查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

    双左连接

    select e.last_name,e.first_name,de.dept_name
    from employees as e
    left join dept_emp as d
    on e.emp_no=d.emp_no
    left join departments as de
    on d.dept_no=de.dept_no;
  19. 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth

    通过入职时间来排序查询:

    如果直接用薪水最大值-最小值,有可能最后一次是降薪。

    SELECT (
    (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date DESC LIMIT 1) -
    (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date ASC LIMIT 1)
    ) AS growth
  20. 查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序

    --将两个查询的结果,当成两个表,进行join
    select S2.emp_no, (S2.salary-S1.salary) as growth
    from
    (select e.emp_no,s.salary
    from employees as e
    join salaries as s
    on e.emp_no=s.emp_no
    and e.hire_date=s.from_date) as S1 --所有员工的入职工资
    join
    (select e.emp_no,s.salary
    from employees as e
    join salaries as s
    on e.emp_no=s.emp_no
    and s.to_date='9999-01-01') as S2 --所有员工的当前工资
    on S1.emp_no = S2.emp_no
    order by growth;
  21. 统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum

    select dp.dept_no,dp.dept_name,count(s.emp_no) as sum
    from departments as dp
    join dept_emp as de on de.dept_no = dp.dept_no
    join salaries as s
    on de.emp_no = s.emp_no
    group by
    de.dept_no;
  22. 对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列

    SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS rank
    FROM salaries AS s1, salaries AS s2
    WHERE s1.to_date = '9999-01-01' AND s2.to_date = '9999-01-01' AND s1.salary <= s2.salary
    GROUP BY s1.emp_no
    ORDER BY s1.salary DESC, s1.emp_no ASC
  23. 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'

    select de.dept_no,de.emp_no,s.salary
    from dept_emp as de
    join salaries as s
    on de.emp_no=s.emp_no
    where de.emp_no not in (select emp_no from dept_manager where to_date='9999-01-01')
    and de.to_date='9999-01-01'
    and s.to_date='9999-01-01';
  24. 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',

    select S1.emp_no as emp_no,S2.emp_no as manager_no,S1.salary as emp_salary,S2.salary as manager_salary
    from
    (select s.salary,e.emp_no,e.dept_no from salaries as s join dept_emp as e on e.emp_no = s.emp_no and s.to_date='9999-01-01') as S1,
    (select s.salary,m.emp_no,m.dept_no from salaries as s join dept_manager as m on m.emp_no = s.emp_no and s.to_date='9999-01-01') as S2
    where S1.dept_no = S2.dept_no and S1.salary > S2.salary
  25. 汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count

    select d.dept_no,d.dept_name,t.title,count(t.title) as count
    from titles as t
    join dept_emp as e
    on e.emp_no = t.emp_no and e.to_date='9999-01-01' and t.to_date='9999-01-01'
    join
    departments as d
    on d.dept_no = e.dept_no
    group by d.dept_no,T.title
  26. 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。

    提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)

    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 salary_growth > 5000
    and (strftime("%Y",s2.to_date) - strftime("%Y",s1.to_date) = 1
    OR strftime("%Y",s2.from_date) - strftime("%Y",s1.from_date) = 1)
    order by salary_growth desc
  27. 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

    SELECT c.name AS name, COUNT(f.film_id) AS amount
    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 cc
    WHERE f.description LIKE '%robot%'
    AND f.film_id = fc.film_id
    AND fc.category_id = c.category_id
    AND c.category_id = cc.category_id
  28. 使用join查询方式找出没有分类的电影id以及名称

    select f.film_id,f.title
    from film as f
    left join
    film_category as fc
    on fc.film_id = f.film_id
    where fc.category_id is null
  29. 使用子查询的方式找出属于Action分类的所有电影对应的title,description

    -- 非子查询
    select f.title,f.description
    from film as f,film_category as fc,
    (select category_id from category where name = 'Action') as ac
    where f.film_id = fc.film_id and fc.category_id = ac.category_id
    --join
    select f.title,f.description
    from film as f
    inner join
    film_category as fc
    on f.film_id = fc.film_id
    inner join
    category as c
    on c.category_id = fc.category_id
    where c.name = 'Action';
    --子查询
    select f.title,f.description
    from film as f where f.film_id in
    (select fc.film_id from film_category as fc where fc.category_id in
    (select c.category_id from category as c where name ='Action'))
  30. explain ,此题毫无意义 = =

【MySql】牛客SQL刷题(上)的更多相关文章

  1. 牛客SQL刷题第一趴——非技术入门基础篇

    user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male   ...

  2. 牛客SQL刷题第三趴——SQL必知必会

    01检索数据 SQL60 从 Customers 表中检索所有的 ID 编写 SQL 语句,从 Customers 表中检索所有的cust_id select * from Customers; SQ ...

  3. 牛客SQL刷题第三趴——SQL大厂面试真题

    01 某音短视频 SQL156 各个视频的平均完播率 [描述]用户-视频互动表tb_user_video_log.(uid-用户ID, video_id-视频ID, start_time-开始观看时间 ...

  4. 牛客网刷题(纯java题型 1~30题)

    牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...

  5. 牛客网刷题(纯java题型 31~60题)

    牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...

  6. 牛客网刷题总结—Day1

    1.关于哈夫曼树 哈夫曼树也称最优二叉树,其n个叶子节点都是带有权值的,其节点的带权路径长度(n个叶子节点的权值*其到根节点的路径之和)最小的二叉树即为哈夫曼树. 一般的哈夫曼树不存在度为1的节点(除 ...

  7. 牛客练习赛 A题 筱玛的快乐

    链接:https://ac.nowcoder.com/acm/contest/342/A来源:牛客网 筱玛的快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...

  8. 牛客练习赛26 E-树上路径 (树链剖分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/180/E 来源:牛客网 树上路径 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  9. 出题人的RP值(牛客练习赛38--A题)(排序)

    链接:https://ac.nowcoder.com/acm/contest/358/A来源:牛客网 题目描述 众所周知,每个人都有自己的rp值(是个非负实数),膜别人可以从别人身上吸取rp值. 然而 ...

随机推荐

  1. Qt编写控件属性设计器12-用户属性

    一.前言 用户属性是后面新增加的一个功能,自定义控件如果采用的Q_PROPERTY修饰的属性,会自动识别到属性栏中,这个一般称为控件属性,在组态设计软件中,光有控件本身的控件属性还是不够的,毕竟这些属 ...

  2. 在 ServiceModel 客户端配置部分中,找不到引用协定“WebServiceSoap”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素找不到与此协定匹配的终结点元素(转)

    按语: 在项目中实现自动升级过程,在类库中调用webservice取升级update.xml文件,添加服务调用,但在类库中调用时就出现异常,但在简单的测试工程中没有问题.解决方法采用下面介绍的方法 在 ...

  3. asp.net Forms身份验证详解

    在做网站的时候,都会用到用户登录的功能.对于一些敏感的资源,我们只希望被授权的用户才能够访问,这让然需要用户的身份验证.对于初学者,通常将用户登录信息存放在Session中,笔者在刚接触到asp.ne ...

  4. SpringBoot学习笔记:Redis缓存

    SpringBoot学习笔记:Redis缓存 关于Redis Redis是一个使用ANSI C语言编写的免费开源.支持网络.可基于内存亦可以持久化的日志型.键值数据库.其支持多种存储类型,包括Stri ...

  5. ConfigMap介绍

    来源 ConfigMap API资源用来保存key-value pair配置数据,这个数据可以在pods里使用,或者被用来为像controller一样的系统组件存储配置数据.虽然ConfigMap跟S ...

  6. tracert详解

    1tracert作用 是用于探索源地址到目标地址当中所经过的路线.而每到达一个点,就会向源地址返回一个信号.例如A要访问D,那么当中经过B,再经过C.当经过B时,会向A返回一个信号,当经过C时,再向A ...

  7. [HTTPS] - 请求API失败(Could not create SSL/TLS secure channel)之解决

    背景 在单元测试中请求 HTTPS API 失败. 异常 Result StackTrace:  at System.Web.Services.Protocols.WebClientProtocol. ...

  8. ~postman基础断言方法

    postman官方文档:https://learning.getpostman.com/docs/postman/scripts/test_examples/ 断言1:检查响应主体是否包含字符串 // ...

  9. PAT(B) 1083 是否存在相等的差(Java)统计

    题目链接:1083 是否存在相等的差 (20 point(s)) 题目描述 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数 ...

  10. go io.Reader 接口

    io 包指定了 io.Reader 接口, 它表示从数据流结尾读取. Go 标准库包含了这个接口的许多实现, 包括文件.网络连接.压缩.加密等等. io.Reader 接口有一个 Read 方法: f ...