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