基础知识
我们来看一个简单的表结构和一些基础的查询方法。
(图片来源网络,侵权删除)
假设我们有一个名为employees
的表,其结构如下:
id | name | department | salary |
1 | Alice | HR | 5000 |
2 | Bob | IT | 6000 |
3 | Charlie | IT | 7000 |
4 | David | HR | 5500 |
5 | Eve | Finance | 6500 |
6 | Alice | HR | 5000 |
查询单列重复项
假设我们想找出名字(name)重复的员工,可以使用以下SQL语句:
SELECT name, COUNT(*) as count FROM employees GROUP BY name HAVING count > 1;
执行结果:
name | count |
Alice | 2 |
查询多列重复项
如果我们想找到名字和部门都重复的员工,可以使用以下SQL语句:
SELECT name, department, COUNT(*) as count FROM employees GROUP BY name, department HAVING count > 1;
执行结果:
name | department | count |
Alice | HR | 2 |
查询所有重复行
有时我们需要查找所有重复的行,而不仅仅是重复的列值,我们想知道所有完全重复的行,在这种情况下,我们可以使用窗口函数:
(图片来源网络,侵权删除)
SELECT * FROM ( SELECT *, COUNT(*) OVER (PARTITION BY name, department, salary) as count FROM employees ) subquery WHERE count > 1;
执行结果:
id | name | department | salary | count |
1 | Alice | HR | 5000 | 2 |
6 | Alice | HR | 5000 | 2 |
删除重复项
如果我们希望删除重复项,只保留其中一行,可以使用ROW_NUMBER()窗口函数:
WITH ranked_employees AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name, department, salary ORDER BY id) as row_num FROM employees ) DELETE FROM employees WHERE id IN ( SELECT id FROM ranked_employees WHERE row_num > 1 );
执行上述语句后,employees
表中将只剩下唯一的一行数据。
相关问题与解答
问题1: 如果我想查找薪水最高的员工,并且可能有多个员工的薪水是相同的最高值,应该如何查询?
答:你可以使用窗口函数来找到薪水最高的员工,如果多个员工的薪水相同且为最高值,它们都会被返回,以下是查询语句:
SELECT id, name, department, salary FROM ( SELECT *, RANK() OVER (ORDER BY salary DESC) as rank FROM employees ) subquery WHERE rank = 1;
问题2: 如何查找每个部门中薪水最高的员工?如果有多个员工薪水相同且为部门内的最高值,应该如何处理?
(图片来源网络,侵权删除)
答:同样可以使用窗口函数,但这次需要在PARTITION BY子句中包含部门信息,以下是查询语句:
SELECT id, name, department, salary FROM ( SELECT *, RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank FROM employees ) subquery WHERE rank = 1;
这样,对于每个部门,都会返回薪水最高的员工,即使有多个员工的薪水相同且为部门内的最高值,它们都会被返回。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/58207.html