sql中的DISTINCT(查询结果去重)

本篇博文使用的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等数据库也可以使用



昨天不过是今天的回忆  明天不过是今天的梦想    -->纪伯伦【先知】



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与