【SQL-牛客】SQL习题

声明

牛客网这个结果不准确。每次提交都会发生变化。
在这里插入图片描述

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

根据目前所学知识,并没有查找非最值的经验。
看了题解后,直到要使用sqlite支持的limit关键字。
SQLite Limit 子句

  • 总而言之,limit子句的作用是获得特定数目的数据,offset是为了获得特定偏移量下的数据。(注意limit子句放置位置在正常SQL语句的最后面)
SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows] OFFSET [row num]

题解:

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

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

请你查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下:
在这里插入图片描述

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

要求:请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工(这句话就按时我们要用左外连接,使空数据也能被包含在内),以上例子如下:
在这里插入图片描述

select last_name,first_name,dept_no from employees 
left join dept_emp on (employees.emp_no=dept_emp.emp_no);

SQL-7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t

根据要求,易知,要按照emp_no分组,使用having关键字判断记录数是否超过15。

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

SQL-11 获取所有员工当前的manager(对列命名别名)

对列属性命名别名然后显示出来的方法
select [列名] as [名称]

select dept_emp.emp_no,dept_manager.emp_no as manager 
from dept_emp,dept_manager 
where dept_emp.dept_no = dept_manager.dept_no and dept_emp.emp_no<>dept_manager.emp_no;

SQL-12 获取每个部门中当前员工薪水最高的相关信息

题意要求,每个部门 就是在提示我们要按部门分组。但有两个表,如何分组呢?left join实现连接为一个表格后分组。

select dept_emp.emp_no,dept_manager.emp_no as manager from dept_emp,dept_manager 
where dept_emp.dept_no = dept_manager.dept_no 
and dept_emp.emp_no<>dept_manager.emp_no;

SQL-15 请你查找employees表所有emp_no为奇数 奇偶数查询方法

20170922–mysql–奇偶数查询

  • 查询奇数的一般方法:如上(最好是位运算&)
    也可以模2计算。%2 或者是 MOD(emp_no, 2)=1部分版本SQL不支持后者。

  • 查询偶数的方法 字段=(字段>>1)<<1:这是左移和右移运算符,先整除再乘,意思就是先整除2再乘以2,看前后结果是否一样,一样的就是偶数。

select * from employees 
where emp_no%2=1 
and last_name<>'Mary' order by hire_date desc;

SQL-16 统计出当前各个title类型对应的员工当前薪水对应的平均工资

第一次遇到仅通过一组测试的问题。因为left join会把空值也包含在内计算。实际上不应该left join
在这里插入图片描述

select title,avg(salary) 
from titles left join salaries as s on (titles.emp_no=s.emp_no) 
group by title;

SQL-18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary 要求不能使用order by

不能使用order by完成,以上例子输出为:
(温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

思路:题目提问比较巧妙。第二多的薪水。我们已有的函数是max()求最大。那么不包括最大分数所组成的salary表中,使用max()得到的就是第二大的。

select employees.emp_no,max(salary),last_name,first_name 
from salaries,employees 
where salary in (select salary from salaries where salary<>(select max(salary) from salaries))//非最大薪水组成的薪水列表 
and salaries.emp_no=employees.emp_no;

SQL-21 查找在职员工自入职以来的薪水涨幅情况

第一次写法如下,答案错误提示,SQL_ERROR_INFO: misuse of aggregate: max() 因为where当中不能有聚集函数。
转化一下理解:外表的to_date

select emp_no,max(salary)-min(salary) as growth 
from salaries
where  max(to_date)='9999-01-01' group by emp_no;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值