【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 小时前
PLSQL自定义自动替换(AutoReplace)
java·数据库·sql
无限码力3 小时前
华为OD技术面真题 - 数据库MySQL - 3
数据库·mysql·华为od·八股文·华为od技术面八股文
heartbeat..3 小时前
Redis 中的锁:核心实现、类型与最佳实践
java·数据库·redis·缓存·并发
Prince-Peng3 小时前
技术架构系列 - 详解Redis
数据结构·数据库·redis·分布式·缓存·中间件·架构
虾说羊3 小时前
redis中的哨兵机制
数据库·redis·缓存
_F_y3 小时前
MySQL视图
数据库·mysql
2301_790300963 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
九章-3 小时前
一库平替,融合致胜:国产数据库的“统型”范式革命
数据库·融合数据库
2401_838472514 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
u0109272714 小时前
使用Python进行网络设备自动配置
jvm·数据库·python