MySQL中根据指定字段对查询结果进行去重

# 创建学生成绩表grade:
# grade表的字段说明:id表示学生编号,name表示学生姓名,gender表示学生性别,score表示学生分数。

create table grade(
id int,
name char(1),
gender char(1),
score int
)engine myisam charset utf8;

# 向学生表中插入数据:
insert into grade values
(1,'A','f',83),
(2,'B','f',79),
(3,'C','m',76),
(4,'D','m',80),
(5,'B','m',92),
(6,'A','f',85),
(7,'C','m',76);

# grade表中的所有信息:
+------+------+--------+-------+
| id   | name | gender | score |
+------+------+--------+-------+
|    1 | A    | f      |    83 |
|    2 | B    | f      |    79 |
|    3 | C    | m      |    76 |
|    4 | D    | m      |    80 |
|    5 | B    | m      |    92 |
|    6 | A    | f      |    85 |
|    7 | C    | m      |    76 |
+------+------+--------+-------+

假如想要查询grade表中学生的姓名、性别和分数信息,且要求学生的姓名、性别和分数三者不同时重复,这个时候可以使用distinct关键字。

select distinct name,gender,score from grade;

# 查询结果为:
+------+--------+-------+
| name | gender | score |
+------+--------+-------+
| A    | f      |    83 |
| B    | f      |    79 |
| C    | m      |    76 |
| D    | m      |    80 |
| B    | m      |    92 |
| A    | f      |    85 |
+------+--------+-------+

假如想要查询grade表中学生的所有信息,且只要求学生的姓名不重复,此时则不能再用distinct关键字。因为除用于聚合函数中外,distinct关键字必须位于所有字段的前面,且作用于其后所有字段。这种查询要求其实可以用group by实现:

select id,name,gender,score from grade group by name;

# 查询结果为:
+------+------+--------+-------+
| id   | name | gender | score |
+------+------+--------+-------+
|    1 | A    | f      |    83 |
|    2 | B    | f      |    79 |
|    3 | C    | m      |    76 |
|    4 | D    | m      |    80 |
+------+------+--------+-------+

假如想要查询grade表中学生的姓名、性别和分数信息,且要求学生的姓名和性别二者不同时重复。此时仍然可以利用group by:

select id,name,gender,score from grade group by name,gender;

# 查询结果为:
+------+------+--------+-------+
| id   | name | gender | score |
+------+------+--------+-------+
|    1 | A    | f      |    83 |
|    2 | B    | f      |    79 |
|    5 | B    | m      |    92 |
|    3 | C    | m      |    76 |
|    4 | D    | m      |    80 |
+------+------+--------+-------+

# 与原表grade比较可知上述查询结果是正确的。

总结:在去重查询时,distinct关键字只能返回它的目标字段,而无法同时返回其它字段,要想解决这个问题,可以利用group by按照多列进行嵌套分组。

PS:本文为博主原创文章,转载请注明出处。

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/85013139