【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 操作后可能出现的、所有选择列都完全相同的重复行,确保最终返回给程序的结果是干净且唯一的。

相关推荐
Albert Edison4 小时前
【Python】学生管理系统
开发语言·数据库·python
heimeiyingwang8 小时前
企业供应链 AI 优化:需求预测与智能调度
大数据·数据库·人工智能·机器学习
山岚的运维笔记8 小时前
SQL Server笔记 -- 第73章:排序/对行进行排序
数据库·笔记·后端·sql·microsoft·sqlserver
XLYcmy9 小时前
智能体大赛 目录
数据库·ai·llm·prompt·agent·检索·万方
盟接之桥9 小时前
盟接之桥EDI软件:API数据采集模块深度解析,打造企业数据协同新引擎
java·运维·服务器·网络·数据库·人工智能·制造
vx-Biye_Design10 小时前
servlet家政公司管理系统-计算机毕业设计源码01438
java·vue.js·spring·servlet·tomcat·maven·mybatis
QQ243919710 小时前
语言在线考试与学习交流网页平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·spring boot·sql·学习·java-ee
闲人编程10 小时前
内存数据库性能调优
数据库·redis·字符串·高并发·哈希·内存碎片
l1t10 小时前
DeepSeek总结的PostgreSQL 19新功能:第一部分
数据库·postgresql
青衫码上行12 小时前
高频 SQL 50题(基础版)| 查询 + 连接
数据库·sql·学习·mysql