您的位置:

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);