牛客网sql实战(一)

1.查找最晚入职员工的所有信息
注意:同一天入职的可能有多个人
法一:利用max函数找到最大的hire_date对应的员工信息(最优)

法二:利用order by 和 limit找到最大的一个hire_date对应的员工信息

2.查找入职员工时间排名倒数第三的员工所有信息
注意:同一天入职的可能有多个人
法一:利用order by 和 limit找到倒数第三的hire_date对应的员工信息

法二:同一天入职的如果有多个人,那么倒数第三的员工并不是按照时间日期排的,更严谨的做法,是利用子查询结合distincnt 和order by 和 limit找到入职日期倒数第三的hire_date对应的员工信息

3.查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号
以salary为主表,进行内连接查找
4.查找所有已经分配部门的员工的last_name和first_name
以dept_emp为主表,进行内连接查找
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 
on e.emp_no=d.emp_no;

6.查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
注意内连接与where并列查询的区别:
内连接是取左右两张表的交集形成一个新表,用FROM并列两张表后仍然还是两张表。如果还要对新表进行操作则要用内连接。从效率上看应该FROM并列查询比较快,因为不用形成新表。本题从效果上看两个方法没区别。

7.查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
解决本题的关键在于要记得,sql语句的执行顺序,先group by emp_no,按员工编号进行分组,然后执行select中的count(emp_no) 最后执行having中的过滤条件

一个sql查询语句的主要组成部分为
select --- from --- where --- group by --- having --- order by --- limit --- ;
执行顺序:

  1. from
  2. where
  3. group by
  4. select
  5. having
  6. ordre by
  7. limit
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,多表的时候使用group by,虽然一般使用group by ,但还是要知道distinct的用法

单表用distinct:

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

多表用group by:

select salary from salaries where to_date='9999-01-01'
group by salary 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 inner join
salaries as s on d.emp_no=s.emp_no 
and 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)

方法二:

select emp_no from (select * from employees as e left join dept_manager as d
on e.emp_no=d.emp_no) where dept_no is NUll

11.获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。
结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。

select e.emp_no,m.emp_no from dept_emp as e 
inner join dept_manager as m 
on e.dept_no=m.dept_no
and e.emp_no<>m.emp_no
and e.to_date='9999-01-01' 
and m.to_date='9999-01-01';

12.获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
1.先内连接两张表
2.按dept_no进行分组
3.找出组内最大薪水的成员

select d.dept_no,d.emp_no,max(s.salary) from dept_emp as d inner 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"
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.从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略。

select title ,count(distinct emp_no) as t from titles
group by title having t>=2;

15.查找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;

16.统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg

select t.title,avg(s.salary) from titles as t 
inner join salaries as s on t.emp_no=s.emp_no
where t.to_date="9999-01-01" and s.to_date="9999-01-01"
group by t.title;

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

select emp_no,salary from salaries order by salary desc limit 1,1;

改进版:针对于薪水相同的员工,上述做法无法真正得到按薪水排第二的员工信息

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

18.查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
从薪水不是第一的里面找最大值

select e.emp_no,max(s.salary),e.last_name,e.first_name
from employees as e inner join salaries as s
on e.emp_no=s.emp_no where s.to_date='9999-01-01' and 
s.salary<>(select max(salary) from salaries where to_date='9999-01-01')

19.查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

select e.last_name,e.first_name,d.dept_name
from employees as e left join 
(select * from dept_emp inner join departments on dept_emp.dept_no=departments.dept_no) as d
on e.emp_no=d.emp_no

20.查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth

select (max(salary)-min(salary)) as growth from salaries where emp_no='10001'

更严谨的做法:

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

21.查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序

select a.emp_no,(b.salary-c.salary) as growth
from employees as a 
inner join salaries as b on a.emp_no=b.emp_no and b.to_date='9999-01-01'
inner join salaries as c on a.emp_no=c.emp_no and c.from_date=a.hire_date
order by growth

22.统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum

  • 将员工与其薪水内连接成一张表,该表为一个员工有多种薪水
  • 将部门表与上表内连接,按部门编号分组
  • 每个部门中,多种薪水的员工对应多个部门编号,count部门编号即为该部门内所有员工的涨薪次数之和
select d.dept_no,d.dept_name,count(d.dept_no) as sum from departments as d inner join 
(select * from dept_emp as a inner join salaries as b 
on a.emp_no=b.emp_no) as c on d.dept_no=c.dept_no
group by d.dept_no
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容