# 创建学生成绩表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:本文为博主原创文章,转载请注明出处。