SQL中的去重

SQL中的去重

1. Distinct去重

说明 :DISTINCT 关键字用于返回唯一不同的值,一般放在查询语句中的第一个字段前使用。

DISTINCT会将NULL值也看做成一个不同的值。

DISTINCT去重

假如有一张员工表:

需要获取所有不重复的员工薪资和年龄的组合,如下编写SQL即可

sql 复制代码
SELECT DISTINCT age,salary
FROM Employee

结果:

2. Group By去重

GROUP BY也可以达到类似的效果

sql 复制代码
SELECT age,salary
FROM Employee
GROUP BY age,salary

不过使用GROUP BY还可以实现聚合的效果,可以联合聚合函数一起使用。

还是上面的员工表,我需要获取每个部门的最高工资的人

sql 复制代码
-- 使用JOIN连表
SELECT e.department_id, e.name, e.salary
FROM Employee e
JOIN (
    SELECT department_id, MAX(salary) AS max_salary
    FROM Employee
    GROUP BY department_id
) AS max_salaries
ON e.department_id = max_salaries.department_id
   AND e.salary = max_salaries.max_salary;
-- 使用EXISTS条件判断
SELECT e.department_id, e.name, e.salary
FROM Employee e
WHERE EXISTS
(
    SELECT 1
    FROM (
        SELECT department_id, MAX(salary) AS salary
        FROM Employee
        GROUP BY department_id
    ) AS m 
		WHERE m.department_id = e.department_id AND m.salary = e.salary
);

3. 唯一索引限制

可以创建一个唯一索引,用来在源头上控制重复数据的插入

sql 复制代码
CREATE UNIQUE INDEX index_name  ON Employee(age,salary)
相关推荐
随遇而安zx1 分钟前
【多线程】---ConcurrentHashMap 源码解析
java·多线程·并发
不才不才不不才8 分钟前
Spring 源码系列(27): @Transactional 七大失效场景与源码归因
java·后端·spring
随遇而安zx11 分钟前
【多线程】---线程池 ThreadPoolExecutor 原理与调优
java·线程池·多线程
Meta3914 分钟前
PostgreSQL报SELECT rule‘s target entry X has different type from column “XXX“
数据库·postgresql·dubbo
抠脚小弟14 分钟前
WebSocketServer 使用详解:从入门到实战
java·spring·websocketserver
随便做点啥19 分钟前
32卡64G-910B4-16后端集群部署报告
java·大数据·运维
Wang's Blog27 分钟前
Java框架快速入门: Spring Security+OAuth2之字段验证与自定义验证注解实战
java·算法·spring
CodeStats28 分钟前
【Java 类加载器】Java 类加载器完整体系深度拆解(上):从 JVM 启动到双亲委派模型
java·开发语言·jvm·classloader·双亲委派
带多刺的玫瑰33 分钟前
Leecode#29刷题之两数相除
java·python·算法
洋不写bug1 小时前
二叉树(四)经典算法题目解析,公共祖先,二叉树构造,非递归遍历
数据库·算法·二叉树·二叉树构造·公共祖先