MySQL Distinct详解

一、MySQL DISTINCT 多列

在 MySQL 中,DISTINCT 关键字用于去除 SELECT 语句返回结果中重复的行。当我们想要查询一张表中某些列同时去重时,可以使用 MySQL DISTICNT 多列。

SELECT DISTINCT column1, column2 FROM table_name;

其中,column1 和 column2 分别代表表格中需要去重的列名,table_name 代表需要查询的表格名称。

举个例子:

CREATE TABLE emp(
  emp_id INT PRIMARY KEY NOT NULL,
  emp_name VARCHAR(20) NOT NULL,
  emp_salary INT NOT NULL,
  emp_dept VARCHAR(20) NOT NULL
);

INSERT INTO emp (emp_id, emp_name, emp_salary, emp_dept)
VALUES (1, '张三', 5000, '技术部'),
       (2, '李四', 6000, '财务部'),
       (3, '王五', 5000, '业务部'),
       (4, '赵六', 7500, '技术部'),
       (5, '张三', 5000, '技术部');

运行以上语句创建和插入数据后,我们想在 emp 表格中选取薪水和部门两列并去重,可以如下写出 SELECT 语句:

SELECT DISTINCT emp_salary, emp_dept FROM emp;

运行以上语句后,返回结果如下:

+------------+----------+
| emp_salary | emp_dept |
+------------+----------+
|       5000 | 技术部   |
|       6000 | 财务部   |
|       7500 | 技术部   |
|       5000 | 业务部   |
+------------+----------+

二、MySQL的DISTINCT用法

MySQL DISTINCT 关键字并不仅仅只能用于 SELECT 语句,还可以用于 DELETE 和 UPDATE 语句。

在DELETE语句中,我们可以使用DISTINCT关键字来删除重复行。

DELETE DISTINCT FROM table_name WHERE condition;

其中,table_name 代表需要删除的表格名称,condition 表示筛选出来需要删除的重复行的条件语句。

在UPDATE语句中,我们可以使用DISTINCT关键字来更新重复行。

UPDATE DISTINCT table_name SET column1 = value1, column2 = value2 WHERE condition;

其中,table_name 代表需要更新的表格名称,column1 和 column2 表示需要更新的列名,value1 和 value2 表示需要更新的值,condition 表示需要更新的行的条件语句。

三、MySQL DISTINCT 多个字段

在SELECT语句中,DISTINCT 关键字不仅能用于单个列,也能用于多个列。

SELECT DISTINCT column1, column2, column3 FROM table_name;

其中,column1, column2, column3 分别代表表格中需要去重的列名,table_name 代表需要查询的表格名称。

举个例子:

CREATE TABLE student(
  student_id INT PRIMARY KEY NOT NULL,
  name VARCHAR(20) NOT NULL,
  sex CHAR(2) NOT NULL,
  age INT NOT NULL,
  class_id INT NOT NULL
);

INSERT INTO student (student_id, name, sex, age, class_id)
VALUES (1, '张三', '男', 20, 1),
       (2, '李四', '男', 21, 2),
       (3, '王五', '女', 20, 1),
       (4, '赵六', '女', 21, 2),
       (5, '张三', '男', 20, 1);

运行以上语句创建和插入数据后,我们想在 student 表格中选取 name, sex 和 age 三列并去重,可以如下写出 SELECT 语句:

SELECT DISTINCT name, sex, age FROM student;

运行以上语句后,返回结果如下:

+------+-----+-----+
| name | sex | age |
+------+-----+-----+
| 张三 | 男  | 20  |
| 李四 | 男  | 21  |
| 王五 | 女  | 20  |
| 赵六 | 女  | 21  |
+------+-----+-----+

四、MySQL EXISTS用法

MySQL EXISTS 语句用于在一个表格中查找指定的值。如果指定的值存在,则返回 true,否则返回false。

同样地,我们也可以使用 EXISTS 关键字来达到 DISTINCT 的效果。

SELECT column1, column2 FROM table_name1 WHERE EXISTS (SELECT column FROM table_name2 WHERE condition);

其中,column1 和 column2 分别代表表格中需要选取的列名,table_name1 代表需要查询的表格名称,column 和 table_name2分别代表用于查询的列名和表格名称,condition 表示用于查询的条件语句。

举个例子:

CREATE TABLE course(
  course_id INT PRIMARY KEY NOT NULL,
  course_name VARCHAR(20) NOT NULL,
  teacher VARCHAR(20) NOT NULL
);

CREATE TABLE student_course(
  course_id INT NOT NULL,
  student_id INT NOT NULL,
  FOREIGN KEY(course_id) REFERENCES course(course_id),
  FOREIGN KEY(student_id) REFERENCES student(student_id)
);

INSERT INTO course (course_id, course_name, teacher)
VALUES (1, '数据结构', '张三'),
       (2, '计算机网络', '李四'),
       (3, '操作系统', '张三'),
       (4, '数据库原理', '王五');

INSERT INTO student_course (course_id, student_id)
VALUES (1, 1),
       (2, 1),
       (3, 2),
       (4, 2),
       (1, 5);

运行以上语句创建和插入数据后,我们想要查找选了计算机网络的学生名单,可以如下写出 SELECT 语句:

SELECT name FROM student WHERE EXISTS (SELECT course_id FROM course WHERE course_name = '计算机网络' AND course.course_id = student_course.course_id AND student.student_id = student_course.student_id);

运行以上语句后,返回结果如下:

+------+
| name |
+------+
| 张三 |
+------+

五、完整代码示例:

-- 创建员工表
CREATE TABLE emp(
  emp_id INT PRIMARY KEY NOT NULL,
  emp_name VARCHAR(20) NOT NULL,
  emp_salary INT NOT NULL,
  emp_dept VARCHAR(20) NOT NULL
);

-- 插入数据
INSERT INTO emp (emp_id, emp_name, emp_salary, emp_dept)
VALUES (1, '张三', 5000, '技术部'),
       (2, '李四', 6000, '财务部'),
       (3, '王五', 5000, '业务部'),
       (4, '赵六', 7500, '技术部'),
       (5, '张三', 5000, '技术部');

-- 查询薪水和部门两列并去重
SELECT DISTINCT emp_salary, emp_dept FROM emp;

-- 创建学生表
CREATE TABLE student(
  student_id INT PRIMARY KEY NOT NULL,
  name VARCHAR(20) NOT NULL,
  sex CHAR(2) NOT NULL,
  age INT NOT NULL,
  class_id INT NOT NULL
);

-- 插入数据
INSERT INTO student (student_id, name, sex, age, class_id)
VALUES (1, '张三', '男', 20, 1),
       (2, '李四', '男', 21, 2),
       (3, '王五', '女', 20, 1),
       (4, '赵六', '女', 21, 2),
       (5, '张三', '男', 20, 1);

-- 查询 name, sex 和 age 三列并去重
SELECT DISTINCT name, sex, age FROM student;

-- 创建课程表
CREATE TABLE course(
  course_id INT PRIMARY KEY NOT NULL,
  course_name VARCHAR(20) NOT NULL,
  teacher VARCHAR(20) NOT NULL
);

-- 创建选课表
CREATE TABLE student_course(
  course_id INT NOT NULL,
  student_id INT NOT NULL,
  FOREIGN KEY(course_id) REFERENCES course(course_id),
  FOREIGN KEY(student_id) REFERENCES student(student_id)
);

-- 插入数据
INSERT INTO course (course_id, course_name, teacher)
VALUES (1, '数据结构', '张三'),
       (2, '计算机网络', '李四'),
       (3, '操作系统', '张三'),
       (4, '数据库原理', '王五');

INSERT INTO student_course (course_id, student_id)
VALUES (1, 1),
       (2, 1),
       (3, 2),
       (4, 2),
       (1, 5);

-- 查询选了计算机网络的学生名单
SELECT name FROM student WHERE EXISTS (SELECT course_id FROM course WHERE course_name = '计算机网络' AND course.course_id = student_course.course_id AND student.student_id = student_course.student_id);

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/301305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-30 16:08
下一篇 2024-12-30 16:08

相关推荐

  • 如何修改mysql的端口号

    本文将介绍如何修改mysql的端口号,方便开发者根据实际需求配置对应端口号。 一、为什么需要修改mysql端口号 默认情况下,mysql使用的端口号是3306。在某些情况下,我们需…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • MySQL递归函数的用法

    本文将从多个方面对MySQL递归函数的用法做详细的阐述,包括函数的定义、使用方法、示例及注意事项。 一、递归函数的定义 递归函数是指在函数内部调用自身的函数。MySQL提供了CRE…

    编程 2025-04-29
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28
  • MySQL左连接索引不生效问题解决

    在MySQL数据库中,经常会使用左连接查询操作,但是左连接查询中索引不生效的情况也比较常见。本文将从多个方面探讨MySQL左连接索引不生效问题,并给出相应的解决方法。 一、索引的作…

    编程 2025-04-28
  • CentOS 7在线安装MySQL 8

    在本文中,我们将介绍如何在CentOS 7操作系统中在线安装MySQL 8。我们会从安装环境的准备开始,到安装MySQL 8的过程进行详细的阐述。 一、环境准备 在进行MySQL …

    编程 2025-04-27
  • 如何使用MySQL字段去重

    本文将从多个方面为您详细介绍如何使用MySQL字段去重并给出相应的代码示例。 一、SELECT DISTINCT语句去重 MySQL提供了SELECT DISTINCT语句,通过在…

    编程 2025-04-27
  • MySQL正则表达式替换

    MySQL正则表达式替换是指通过正则表达式对MySQL中的字符串进行替换。在文本处理方面,正则表达式是一种强大的工具,可以方便快捷地进行字符串处理和匹配。在MySQL中,可以使用正…

    编程 2025-04-27
  • Apache2.4和MySQL的全能编程开发工程师指南

    本文将从多个方面对Apache2.4和MySQL进行详细的阐述,为全能编程开发工程师提供有用的参考和指导。首先,我们来解答这个标题所涵盖的主题: 本文将提供Apache2.4和My…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25

发表回复

登录后才能评论