SQL习题
- 声明
- SQL-2 查找入职员工时间排名倒数第三的员工所有信息
- SQL-3 查找当前薪水详情以及部门编号dept_no
- SQL-5 查找所有员工的last_name和first_name以及对应部门编号dept_no
- SQL-7 查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t
- SQL-11 获取所有员工当前的manager(对列命名别名)
- SQL-12 获取每个部门中当前员工薪水最高的相关信息
- SQL-15 请你查找employees表所有emp_no为奇数 奇偶数查询方法
- SQL-16 统计出当前各个title类型对应的员工当前薪水对应的平均工资
- SQL-18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary 要求不能使用`order by`
- SQL-21 查找在职员工自入职以来的薪水涨幅情况
声明
牛客网这个结果不准确。每次提交都会发生变化。
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为奇数 奇偶数查询方法
-
查询奇数的一般方法:如上(最好是位运算&)
也可以模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;