详细分析MySQL中的distinct函数(附Demo)

2024-04-23 23:04

本文主要是介绍详细分析MySQL中的distinct函数(附Demo),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 1. 基本知识
  • 2. 基础Demo
  • 3. 进阶Demo

前言

该函数主要用于去重,对于细节知识,此文详细补充说明

1. 基本知识

DISTINCT 是一种用于查询结果中去除重复行的关键字

在查询数据库时,可能会得到重复的结果行,但有时只需要这些结果的唯一副本,这时就可以使用 DISTINCT 来过滤结果,确保每行只出现一次

类似如下:

SELECT DISTINCT name FROM students;

关于 DISTINCT 的基本知识和使用情况的详细分析:

  • DISTINCT 关键字紧跟在 SELECT 后面,用于指示要返回唯一值
  • DISTINCT 用于过滤查询结果中的重复行,确保每行只出现一次
  • 使用 DISTINCT 可能会影响查询性能,特别是当查询的列包含大量重复值时。因为数据库需要对结果集进行排序和去重操作,如果可能的话,应该在查询中仅选择需要的列,以减少不必要的计算量。在某些情况下,使用 GROUP BY 也可以达到类似的效果,但它更适用于需要对结果进行聚合的情况

2. 基础Demo

创建两张表格:

CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),age INT
);INSERT INTO students (name, age) VALUES
('Alice', 20),
('Bob', 22),
('Charlie', 21),
('Alice', 20),
('David', 23);

另外一张表格:

CREATE TABLE courses (course_id INT AUTO_INCREMENT PRIMARY KEY,course_name VARCHAR(50),student_id INT,FOREIGN KEY (student_id) REFERENCES students(student_id)
);INSERT INTO courses (course_name, student_id) VALUES
('Math', 1),
('Physics', 2),
('Chemistry', 3),
('Math', 4),
('Biology', 5);
  1. 查询所有学生的姓名和年龄:SELECT DISTINCT name, age FROM students; (注意此处有个Bug,那就是我的Alice 20 是有两条记录的)
    在这里插入图片描述
  2. 查询所有学生的姓名和他们所选的课程:
SELECT s.name, c.course_name
FROM students s
JOIN courses c ON s.student_id = c.student_id;

在这里插入图片描述

  1. 查询每门课程的选课人数:
SELECT course_name, COUNT(student_id) AS num_students
FROM courses
GROUP BY course_name;

在这里插入图片描述

3. 进阶Demo

以上的Demo比较普遍
如果涉及不常规的逻辑:

  1. 使用多个字段进行查重:返回所有不重复的姓名和年龄的组合

(修改数据)
在这里插入图片描述

SELECT DISTINCT name, age
FROM students;

此处截图如下:

在这里插入图片描述

如果此时想获取最大的age可以这么使用:

SELECT GROUP_CONCAT(DISTINCT name), MAX(age) AS age
FROM students
GROUP BY name;

截图如下:

在这里插入图片描述

  1. 处理 NULL 值:在查询中进行特殊处理
    使用 COALESCE() 函数将 NULL 值转换为一个特定的占位符,然后再进行查重
SELECT DISTINCT COALESCE(name, ''), COALESCE(age, 0)
FROM students;
  1. 考虑使用聚合函数:
    如果想要统计每组唯一值的数量,可以结合 COUNT() 函数使用
SELECT name, age, COUNT(*)
FROM students
GROUP BY name, age;

这篇关于详细分析MySQL中的distinct函数(附Demo)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930126

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C