当前位置: 首页 > article >正文

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;
http://www.lryc.cn/news/2414251.html

相关文章:

  • 信号频谱、幅度、功率和能量
  • 基于深度学习方法的图像分割
  • Windows+C语言 共享内存与互斥量
  • C#之读取数据:DataReader对象
  • 找资源网站
  • [QQAI机器人]-接入腾讯AI接口
  • 转让对战平台~~
  • Windows 11中无法使用小键盘的问题及其解决方法
  • kinect 1 for windows
  • 云远程调试工具V1.0.0
  • VC——线程同步
  • 智能音乐推荐系统(开题+源码)
  • 入门级 如何编写第一个网页
  • 【实验学习】思科模拟器学习
  • Windows系统shdocvw.dll文件丢失导致功能异常问题
  • 在线辞源辞海
  • 潇洒郎:用cxfreeze打包py文件为exe文件全过程——呕心吐血经验——安装、调试、解决KeyError: 'TCL_LIBRARY'问题、最终成功、打包方便技巧
  • 【Google论文】The Google File System 译文
  • 推荐一款国内好用的Java CMS内容管理软件,功能强大,灵活好用(附源码)
  • 爬虫有用的数据网站
  • MySql触发器介绍及应用
  • 【NLP】语义分析
  • 【算法合集】学习算法第二天(二分与排序篇)
  • SSM宠物店管理系统-计算机毕业设计源码93755
  • 解决Windows提示d3dx9_36.dll找不到
  • Mathcad使用数学表达式
  • 2022年茶艺师(高级)考题及答案
  • C语言项目-学生信息管理系统
  • windows编程------TextOut与TextOutw与TextOutA,基于vs2010
  • linux Shell 命令汇总 (持续更新)