mysql distinct和group by以及having用法
mysql distinct 去重和group by用法区别
1. distinct
1.1 定义
在使用mysql时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段。
1.2 只对一列操作
这种操作时最常见的
select distinct name from study_test
结果为:
1.3 对多列进行操作
当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面
没有去重查询id,name字段结果;
select id,name from study_test
去重查询id,name字段结果;
select id,name from study_test
distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。
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
对于上面提到的表格,我们做一个这样的查询:
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
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
例子所涉及的表结构和数据
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 多表查询 以及 concat 、concat_ws和 group_concat
-
sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)
-
MySQL之concat以及group_concat的用法
-
mysql之group by和having用法详解
-
深入浅析SQL中的group by 和 having 用法
-
sql中的 where 、group by 和 having 用法解析
-
MySQL中USING 和 HAVING 用法实例简析
-
sql中的group by和having 用法解析
-
sql中的group by和having 用法解析
-
数据库中group by和having语法使用详解_MySQL