【Java-后端-Mybatis】DISTINCT 作用

假设我们有两张表:users (用户信息表) 和 user_projects (用户参与的项目表)。

表1: users

┌─────────┬──────┐

│ user_id │ name │

├─────────┼──────┤

│ 1 │ 张三 │

│ 2 │ 李四 │

└─────────┴──────┘

表2: user_projects

注意,这里为用户'张三'(user_id=1)添加了两条完全相同的'项目A'记录。

┌─────────┬──────────────┐

│ user_id │ project_name │

├─────────┼──────────────┤

│ 1 │ 项目A │

│ 1 │ 项目B │

└─────────┴──────────────┘

| 1 | 项目A | <-- 重复记录

| 2 | 项目C |


  1. 不使用 DISTINCT 的查询

如果我们想查询用户'张三'(user_id=1)参与了哪些项目,查询语句如下:

复制代码
1 SELECT
2     u.user_id,
3     u.name,
4     p.project_name
5 FROM
6     users u
7 JOIN
8     user_projects p ON u.user_id = p.user_id
9 WHERE
10     u.user_id = 1;

查询结果 会有3行,因为'张三'在 user_projects 表中有3条记录:

┌─────────┬──────┬──────────────┐

│ user_id │ name │ project_name │

├─────────┼──────┼──────────────┤

│ 1 │ 张三 │ 项目A │

│ 1 │ 张三 │ 项目B │

└─────────┴──────┴──────────────┘

| 1 | 张三 | 项目A | <-- 重复的行


  1. 使用 DISTINCT 的查询

现在,我们在 SELECT 后面加上 DISTINCT:

复制代码
1 SELECT DISTINCT
2     u.user_id,
3     u.name,
4     p.project_name
5 FROM
6     users u
7 JOIN
8     user_projects p ON u.user_id = p.user_id
9 WHERE
10     u.user_id = 1;

DISTINCT 会检查每一行所有列的组合 (user_id, name, project_name) 是否唯一。

  • 第一行 (1, '张三', '项目A') 是唯一的。
  • 第二行 (1, '张三', '项目B') 是唯一的。
  • 第三行 (1, '张三', '项目A') 和第一行完全相同,因此它会被 DISTINCT 关键字移除。

最终查询结果 只有2行:

┌─────────┬──────┬──────────────┐

│ user_id │ name │ project_name │

├─────────┼──────┼──────────────┤

│ 1 │ 张三 │ 项目A │

│ 1 │ 张三 │ 项目B │

└─────────┴──────┴──────────────┘

结论

这个例子清晰地表明,DISTINCT 并不是只看某一列(比如 project_name),而是看整行所有列的值组合。只有当多行的所有列的值都完全相同时,DISTINCT 才会将它们视为重复并只保留一行。

DISTINCT 就是为了防止 JOIN 操作后可能出现的、所有选择列都完全相同的重复行,确保最终返回给程序的结果是干净且唯一的。

相关推荐
一个天蝎座 白勺 程序猿2 分钟前
踩坑生产后整理:KingbaseES表空间管理、auto_createtblspcdir参数深度解析与运维最佳实践
运维·数据库·kingbasees
oG99bh7CK11 分钟前
FastAPI + PostgreSQL 实战:从入门到不踩坑,一次讲透
数据库·postgresql·fastapi
Wait....13 分钟前
MySQL事务知识复习
数据库·mysql
身如柳絮随风扬28 分钟前
Mybatis分页实现原理与PageHelper插件深度解析
mybatis
杨云龙UP35 分钟前
Oracle 19c:RMAN Duplicate异机复制数据库实操_20260402
linux·运维·服务器·数据库·网络协议·tcp/ip·oracle
刘~浪地球39 分钟前
Redis 从入门到精通(七):集合操作详解
数据库·chrome·redis
光泽雨40 分钟前
SQL分组Group By
数据库
我真会写代码1 小时前
MySQL高频面试题(含详细解析):从基础到高级,备战面试不踩坑
数据库·mysql·面试
观远数据1 小时前
未来3年企业数据分析的核心:基于自然语言的AI优先决策体系如何搭建
数据库·人工智能·数据分析
YummyJacky1 小时前
Redis在项目中的应用
数据库·redis·缓存