欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql distinct和group by以及having用法

程序员文章站 2022-05-17 22:42:35
...

mysql distinct 去重和group by用法区别

1. distinct

1.1 定义

  在使用mysql时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段。

1.2 只对一列操作

  这种操作时最常见的

select distinct name from study_test

  结果为:
mysql distinct和group by以及having用法

1.3 对多列进行操作

  当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面
   没有去重查询id,name字段结果;

select  id,name from study_test

mysql distinct和group by以及having用法

   去重查询id,name字段结果;

select  id,name from study_test

mysql distinct和group by以及having用法
   distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。

mysql distinct和group by以及having用法

2. group by

2.1 语法

    GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列的结果集。因为聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值,要么为GROUP BY语句的参数,否则会出错

SELECT column1, column2, ... column_n, aggregate_function (expression)            

FROM tables            

WHERE predicates            

GROUP BY column1, column2, ... column_n;
2.2 例子

  比如说我们有一个学生表格(student),包含学号(id),课程(course),分数(score)等等多个列,我们想通过查询得到每个学生选了几门课程,此时我们就可以联合使用COUNT函数与GROUP BY语句来得到这一结果

select name,count(course) from student  GROUP BY name

mysql distinct和group by以及having用法
  对于上面提到的表格,我们做一个这样的查询:


select name,score,count(course) from student  GROUP BY name

此时查询便会出错,出现以上错误的原因是因为一个学生id对应多个分数,如果我们简单的在SELECT语句中写上score,则无法判断应该输出哪一个分数。如果想用score作为select语句的参数可以将它用作一个聚合函数的输入值,如下例,我们可以得到每个学生所选的课程门数以及每个学生的平均分数:

select name,avg(score),count(course) from student  GROUP BY name

mysql distinct和group by以及having用法

2.3 HAVING

  HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。

  HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。

  语法:

SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;

  如果想查询平均分高于70分的学生记录可以这样写:

select name,avg(score) from student  GROUP BY name HAVING avg(score) > 70

mysql distinct和group by以及having用法

    例子所涉及的表结构和数据

DROP TABLE IF EXISTS `study_test`;
CREATE TABLE `study_test` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `study_test` VALUES ('1', 'hwei');
INSERT INTO `study_test` VALUES ('2', 'xmi');
INSERT INTO `study_test` VALUES ('3', 'oppo');
INSERT INTO `study_test` VALUES ('4', 'vivo');
INSERT INTO `study_test` VALUES ('5', 'apple');
INSERT INTO `study_test` VALUES ('10', 'meizu');
INSERT INTO `study_test` VALUES ('13', 'zuizi');
INSERT INTO `study_test` VALUES ('6', 'apple');
INSERT INTO `study_test` VALUES ('7', 'sanxing');
INSERT INTO `study_test` VALUES ('8', 'one+');
INSERT INTO `study_test` VALUES ('9', 'xmi');
INSERT INTO `study_test` VALUES ('11', 'hwei');
INSERT INTO `study_test` VALUES ('12', 'rongyao');
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `score` int(40) NULL DEFAULT NULL,
  `course` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `student` VALUES ('12', 'tbb', 80, '语文');
INSERT INTO `student` VALUES ('12', 'tbb', 70, '数学');
INSERT INTO `student` VALUES ('12', 'tbb', 60, '英语');
INSERT INTO `student` VALUES ('13', 'xb', 98, '语文');
INSERT INTO `student` VALUES ('13', 'xb', 96, '英语');
INSERT INTO `student` VALUES ('13', 'xb', 97, '数学');
INSERT INTO `student` VALUES ('14', 'xz', 18, '语文');
INSERT INTO `student` VALUES ('14', 'xz', 28, '数学');
INSERT INTO `student` VALUES ('14', 'xz', 8, '英语');
INSERT INTO `student` VALUES ('15', 'xm', 78, '物理');

SET FOREIGN_KEY_CHECKS = 1;

相关标签: mysql