本篇博文使用的mysql版本:5.7.21
数据表结构和数据如下:
CREATE TABLE `student_info` ( `number` int(11) NOT NULL, `name` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `sex` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `id_number` char(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `department` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `major` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `enrollment_time` date NULL DEFAULT NULL, PRIMARY KEY (`number`) USING BTREE, UNIQUE INDEX `id_number`(`id_number`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- 插入数据的sql INSERT INTO `student_info` VALUES (20180101, '张三疯', '男', '158177199901044792', '计算机学院', '计算机科学与工程', '2018-09-01'); INSERT INTO `student_info` VALUES (20180102, '张无忌', '男', '151008199801178529', '计算机学院', '计算机科学与工程', '2018-09-01'); INSERT INTO `student_info` VALUES (20180103, '赵敏', '女', '17156319980116959X', '计算机学院', '软件工程', '2018-09-01'); INSERT INTO `student_info` VALUES (20180104, '乔峰', '女', '141992199701078600', '计算机学院', '软件工程', '2018-09-01'); INSERT INTO `student_info` VALUES (20180105, '虚竹', '男', '181048199308156368', '航天学院', '飞行器设计', '2018-09-01'); INSERT INTO `student_info` VALUES (20180106, '段誉', '男', '197995199501078445', '航天学院', '电子信息', '2018-09-01');
去除单列的重复结果
有的时候我们查询某个列的数据时会有一些重复的结果,比如我们查询一下student_info表的学院信息:
mysql> SELECT department FROM student_info; +-----------------+ | department | +-----------------+ | 计算机学院 | | 计算机学院 | | 计算机学院 | | 计算机学院 | | 航天学院 | | 航天学院 | +-----------------+ 6 rows in set (0.00 sec)
因为表里有6条记录,所以给我们返回了6条结果。但是其实好多都是重复的结果,如果我们想去除重复结果的话,可以将DISTINCT放在被查询的列前边,就是这样:
SELECT DISTINCT 列名 FROM 表名;
对学院信息做一下去重处理:
mysql> SELECT DISTINCT department FROM student_info; +-----------------+ | department | +-----------------+ | 计算机学院 | | 航天学院 | +-----------------+ 2 rows in set (0.00 sec)
看到结果集中就只剩下不重复的信息了。
去除多列的重复结果
对于查询多列的情况,两条结果重复的意思是:两条结果的每一个列中的值都相同。比如查询学院和专业信息:
mysql> SELECT department, major FROM student_info; +-----------------+--------------------------+ | department | major | +-----------------+--------------------------+ | 计算机学院 | 计算机科学与工程 | | 计算机学院 | 计算机科学与工程 | | 计算机学院 | 软件工程 | | 计算机学院 | 软件工程 | | 航天学院 | 飞行器设计 | | 航天学院 | 电子信息 | +-----------------+--------------------------+ 6 rows in set (0.00 sec)
查询结果中第1、2行记录中的department和major列都相同,所以这两条记录就是重复的,同理,第3、4行也是重复的。如果我们想对多列查询的结果去重的话,可以直接把DISTINCT放在被查询的列的最前边:
SELECT DISTINCT 列名1, 列名2, ... 列名n FROM 表名;
比如这样:
mysql> SELECT DISTINCT department, major FROM student_info; +-----------------+--------------------------+ | department | major | +-----------------+--------------------------+ | 计算机学院 | 计算机科学与工程 | | 计算机学院 | 软件工程 | | 航天学院 | 飞行器设计 | | 航天学院 | 电子信息 | +-----------------+--------------------------+ 4 rows in set (0.00 sec)
从上例中可以发现,当DISTINCT多个字段的时候,其作用的范围是其后面的所有字段,而不只是紧挨着它的一个字段。
DISTINCT的注意事项:
①、distinct只能放到所有字段的前面,如下语句是错误的:
SELECT number, distinct department FROM student_info; -- 该语句会报错
抛出错误如下:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'distinct department FROM student_info' at line 1
②、针对NULL的处理:distinct对NULL是不进行过滤的,即返回的结果中是包含NULL值的。
③、对*的处理:
*代表所有字段,使用distinct对*操作
SELECT DISTINCT * FROM student_info; -- 以上sql语句相当于如下形式: SELECT DISTINCT number,name,sex,id_number,department,major,enrollment_time FROM student_info;
④、distinct不是mysql独有的 sqlserver等数据库也可以使用
昨天不过是今天的回忆 明天不过是今天的梦想 -->纪伯伦【先知】
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论