Test 1
有一个部门表 departments
简况如下:
有一个,部门员工关系表 dept_emp
简况如下:
有一个薪水表 salaries
简况如下:
请你统计各个部门的工资记录数,给出部门编码 dept_no
、部门名称 dept_name
以及部门在 salaries
表里面有多少条记录 sum
,按照 dept_no
升序排序,以上例子输出如下:
考察知识点
内联结、ORDER BY
,GROUP BY
。
解题思路
根据题目的描述,可以先将 dept_emp
和 departments
两个表连接起来,再与 salaries
表连接,然后通过 dept_no
进行分组,使用 COUNT()
统计 salary
的数目 sum
,最后再通过 dept_no
进行排序即可。
SELECT d.dept_no, dept_name, COUNT(salary) AS sum FROM dept_emp AS d INNER JOIN departments AS dp ON d.dept_no = dp.dept_no INNER JOIN salaries AS s ON d.emp_no = s.emp_no GROUP BY dept_no ORDER BY dept_no 复制代码
Test 2
有一个薪水表 salaries
简况如下:
对所有员工的薪水按照 salary
降序进行 1-N 的排名,要求相同 salary
并列且按照 emp_no
升序排列:
考察知识点
窗口函数 DENSE_RANK()
,ORDER BY
。
解题思路
根据题目的要求,可以使用窗口函数进行排序。
SELECT emp_no, salary, DENSE_RANK() OVER(ORDER BY salary DESC) FROM salaries 复制代码
三种排序的窗口函数:
RANK()
在排序时,若有相同位次,会跳过这些位次进行排序。 例如,有3条数据排在第1位时,排序为:1,1,1,4······DENSE_RANK()
在计排序时,若存在相同位次,不会跳过之后的位次。 例如,有3条数据排在第1位时,排序为:1,1,1,2······ROW_NUMBER()
这个函数赋予唯一的连续位次。 例如,有3条数据排在第1位时,排序为:1,2,3,4······