首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1 基本查询语句
9.2 单表查询
9.2.1 查询所有字段
9.2.2 查询指定字段
9.2.3 查询指定数据
9.2.4 带关键字IN的查询
9.2.5 带关键字BETWEEN AND的范围查询
9.2.6 带LIKE的字符匹配查询
9.2.7 用IS NULL关键字查询空值
9.2.8 带AND的多条件查询
9.2.9 带OR的多条件查询
9.2.10 用DISTINCT关键字去除结果中的重复行
9.2.11 用ORDER BY关键字对查询结果进行排序
9.2.12 用GROUP BY关键字分组查询
9.2.13 用LIMIT限制查询结果的数量
9.3 聚合函数查询
9.3.1 COUNT()统计函数
9.3.2 SUM()求和函数
9.3.3 AVG()平均数函数
9.3.4 MAX()最大值函数
9.3.5 MIN()最小值函数
9.4 连接查询
9.4.1 内连接查询
9.4.2 外连接查询
9.4.3 复合条件连接查询
9.5 子查询
9.5.1 带IN关键字的子查询
9.5.2 带比较运算符的子查询
9.5.3 带EXISTS关键字的子查询
9.5.4 带ANY关键字的子查询
9.5.5 带ALL关键字的子查询
9.6 合并查询结果
9.7 定义表和字段的别名
9.7.1 为表取别名
9.7.2 为字段取别名
9.8 使用正则表达式查询
9.8.1 匹配指定字符中的任意一个
9.8.2 使用“*”和“ ”来匹配多个字符
9.8.3 匹配以指定的字符开头和结束的记录
10.1 MySQL函数
10.2 数学函数
10.2.1 ABS(x)绝对值函数
10.2.2 FLOOR(x)向下取整函数
10.2.3 RAND()随机数函数
10.2.4 PI()圆周率函数
10.2.5 TRUNCATE(x,y)截断函数
10.2.6 ROUND(x)近似值函数和ROUND(x,y)四舍五入函数
10.2.7 SQRT(x)平方函数
10.3 字符串函数
10.3.1 INSERT(s1,x,len,s2)替换函数
10.3.2 UPPER(s)函数和UCASE(s)字母大写函数
10.3.3 LEFT(s,n)取左函数
10.3.4 RTRIM(s)去空格函数
10.3.5 SUBSTRING(s,n,len)截取函数
10.3.6 REVERSE(s)反转函数
10.3.7 FIELD(s,s1,s2,…,sn)位置函数
10.3.8 LOCATE(s1,s)、POSITION(s1 IN s)和INSTR(s,s1)3个位置函数
10.4 日期和时间函数
10.4.1 CURDATE()和CURRENT_DATE()当前日期函数
10.4.2 CURTIME()和CURRENT_TIME()当前时间函数
10.4.3 NOW()当前日期和时间函数
10.4.4 DATEDIFF(d1,d2)间隔天数函数
10.4.5 ADDDATE(d,n)日期计算函数
10.4.6 ADDDATE(d,INTERVAL expr type)日期时间计算函数
10.4.7 SUBDATE(d,n)日期计算函数
10.5 条件判断函数
10.6 系统信息函数
10.6.1 获取MySQL版本号、连接数和数据库名的函数
10.6.2 获取用户名的函数
10.6.3 获取字符串的字符集和排序方式的函数
10.7.1 格式化函数FORMAT(x,n)
10.7.2 改变字符集的函数
10.7.3 改变字段数据类型的函数
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(三)
小册名称:MySQL从入门到精通(三)
### 9.2.10 用`DISTINCT`关键字去除结果中的重复行 在数据库查询中,经常需要处理包含重复行的数据集。这种重复可能是由于表结构的设计、数据录入时的疏忽或是查询逻辑本身导致的。MySQL提供了`DISTINCT`关键字,允许我们在查询结果中去除重复的行,从而仅获取唯一值的集合。本章节将深入探讨`DISTINCT`关键字的用法、最佳实践、性能考虑以及它在不同场景下的应用。 #### 9.2.10.1 理解`DISTINCT`关键字 `DISTINCT`关键字位于`SELECT`语句的列名之前,用于指定返回的结果集应该包含唯一不同的值。当查询涉及多列时,`DISTINCT`作用于这些列的组合上,即只有当这些列的组合完全相同时,才认为它们是重复的。 **基本语法**: ```sql SELECT DISTINCT column1, column2, ... FROM table_name WHERE condition; ``` - `column1, column2, ...`:指定需要返回的唯一列。 - `table_name`:查询的表名。 - `condition`:可选的查询条件,用于筛选哪些行被包含在结果集中。 #### 9.2.10.2 单列使用`DISTINCT` 当仅对单个列使用`DISTINCT`时,它会返回该列中所有不重复的值。 **示例**: 假设有一个名为`employees`的表,包含`department_id`字段,表示员工所属的部门ID。若要获取所有不同的部门ID,可以使用以下查询: ```sql SELECT DISTINCT department_id FROM employees; ``` 这条查询将返回`department_id`列中所有唯一的值,排除了重复的部门ID。 #### 9.2.10.3 多列组合使用`DISTINCT` 当对多个列使用`DISTINCT`时,它基于这些列的组合值来判断是否唯一。 **示例**: 继续上面的例子,如果我们还想知道每个部门ID下有哪些不同的职位(`position`),并希望结果中不包含完全相同的部门ID和职位组合,可以这样做: ```sql SELECT DISTINCT department_id, position FROM employees; ``` 这将返回所有唯一的`department_id`和`position`组合,即使某个部门有多个员工拥有相同的职位,该组合也只会出现一次。 #### 9.2.10.4 性能考虑 虽然`DISTINCT`关键字提供了强大的去重功能,但在处理大数据集时,它可能会对查询性能产生负面影响。这是因为数据库系统需要额外的资源来跟踪和比较结果集中的行,以确保返回的值是唯一的。 **优化建议**: 1. **索引优化**:确保在`DISTINCT`涉及的列上建立索引,可以显著提高查询效率。 2. **查询重写**:在某些情况下,通过改写查询逻辑(如使用`GROUP BY`代替`DISTINCT`),可能获得更好的性能。 3. **减少数据量**:尽可能在`WHERE`子句中减少需要处理的数据量,因为`DISTINCT`会在过滤后的数据上操作。 4. **使用临时表**:如果查询非常复杂且频繁执行,考虑将中间结果存储在临时表中,然后在临时表上应用`DISTINCT`。 #### 9.2.10.5 `DISTINCT`与`GROUP BY`的比较 虽然`DISTINCT`和`GROUP BY`在某些情况下可以实现类似的功能(如去除重复行),但它们之间存在本质区别。 - **`DISTINCT`**:直接作用于查询的列上,去除结果集中的重复行。它不能用于聚合函数(如`SUM()`, `AVG()`)的结果上。 - **`GROUP BY`**:基于一个或多个列对结果集进行分组,通常与聚合函数一起使用来计算每个组的统计信息。虽然可以通过`GROUP BY`实现类似`DISTINCT`的效果(通过选择所有列进行分组),但`GROUP BY`的用途更广泛,灵活性更高。 #### 9.2.10.6 应用场景 `DISTINCT`关键字在多种场景下都非常有用,包括但不限于: - **数据分析**:在统计唯一用户数、唯一产品ID等场景下,`DISTINCT`是不可或缺的工具。 - **数据清洗**:在数据预处理阶段,去除重复记录,保证数据的唯一性和准确性。 - **报表生成**:在生成包含唯一值汇总的报表时,如部门列表、产品分类等。 #### 9.2.10.7 注意事项 - **NULL值处理**:在`DISTINCT`操作中,`NULL`值被视为相同的值,因此结果集中只会出现一个`NULL`。 - **与`ORDER BY`一起使用**:虽然`DISTINCT`可以去除重复行,但它不保证返回结果的顺序。如果需要特定的排序,应结合使用`ORDER BY`。 - **性能评估**:在应用`DISTINCT`之前,应评估其对查询性能的影响,并考虑是否有更高效的替代方案。 ### 结语 `DISTINCT`关键字是MySQL中处理查询结果重复行的有力工具。通过理解和正确应用`DISTINCT`,我们可以高效地获取唯一值的集合,支持复杂的数据分析和报表生成需求。然而,我们也应注意其可能带来的性能问题,并通过索引优化、查询重写等方法来提升查询效率。希望本章内容能帮助你更好地掌握`DISTINCT`的用法,并在实际工作中灵活应用。
上一篇:
9.2.9 带OR的多条件查询
下一篇:
9.2.11 用ORDER BY关键字对查询结果进行排序
该分类下的相关小册推荐:
MySQL从入门到精通(一)
MySQL从入门到精通(二)
MySQL从入门到精通(四)
MySQL从入门到精通(五)
SQL零基础到熟练应用(增删改查)
MySQL8.0入门与实践
MySQL 实战 45 讲
MySQL必会核心问题
细说MySQL(零基础到高级应用)