mysql数据库groupby⾯试题(⼀)
⽬录
关于mysql的group by关键字⼤家⼀定不陌⽣,在平时的开发过程中经常会⽤到mysql的group by分组的⽤法,⽤来获取数据表中以分组字段作为依据统计数据。下⾯我们通过⼀个⾯试题对group by进⾏⼀个简单的了解。
⼀、什么是Group By以及⽤法有哪些
group by通俗⼀点的讲就是通过by后⾯指定的数据库表字段把数据进⾏分组,所谓的分组就是把⼀个⼤的“数据集合”划分为若⼲
html透明背景代码个“⼩区域数据集合”,最后针对这个“⼩区域数据集合”进⾏数据处理。group by通常和聚合函数结合使⽤,⽐如count()、sum()等聚合函数。
1、使⽤group by有⼏点需要注意的地⽅:
(1)、group by查询语句中select后⾯字段必须是by后⾯的分组字段,如果其他的字段想出现在select中必须要和聚合函数⼀起使⽤。
(2)、group by查询语句中返回分组后每个组的第⼀条数据。
(3)、group by多字段分组是将具有相同多个字段的数据放到同⼀个分组中,⽐如group by a,b,意思是将所有具有a字段值和b 字段值的数据放到⼀个分组⾥。
(4)、group by常⽤的五种聚合函数:
max(列名):求最⼤值;
min(列名):求最⼩值;
sum(列名):求和;
avg(列名):求平均值;
count(列名):统计记录的条数;
2、group by与where联合使⽤:
当where和group by⼀起使⽤的时候,where⼀定是放在group by前⾯的,也就是说先对select xxx from xxx的数据集合根据where条件筛选,然后在使⽤group by对筛选后的数据进⾏分组,最后得到我
网页出现两个object
们想要的数据集合。注意:where后的条件表达式不允许使⽤聚合函数。
3、group by和having联合使⽤:
having只能⽤在group by之后,对分组以后的数据集结果进⾏筛选,也就是说使⽤having的前提条件就是分组。另外having可以和聚合函数⼀起使⽤,⽐如having sum(x)>1000。
4、group by和order by联合使⽤:
当group by和order by⼀起使⽤的时候,会先执⾏group by进⾏分组,然后将分组好的数据集进⾏order by排序,order by x中的x 是select 查询字段的某⼀个字段,order by的位置是放在having后⾯的。
order by 字段名 desc:降序排列
order by 字段名 asc:升序排列
5、group by和limit联合使⽤:
group by和limit联合使⽤时,会先执⾏group by分组,然后从分组好的数据集合中通过limit取出⼏条数据,注意,limit的位置要放在order by后⾯。
limit x 从第⼀条数据开始,取出x条数据;divorce new york style
limit x,y 从第x条数据开始,取出y条数据;
6、group by和group_concat()函数联合使⽤:
group by和group_concat()函数⼀起使⽤的话,可以将group by分组好的某个字段的数据拼接到⼀起,默认通过“,”拼接。并且group_concat()函数还可以针对某个字段数据进⾏内部排序,将最终的排序结果返回。
⼆、查询语句中select from where group by having order by的执⾏顺序
在查询语句中⽤到的关键词主要有六个,并且它们的书写顺序依次为:select--from--where--group by--having--order by。但是,在mysql数据库中这六个关键词执⾏顺序和书写顺序是不⼀样的,具体的执⾏顺序为:from--where--group by--having--select--order by。
1、from xxx从哪个表中获取数据,然后通过where xxx查询条件获取第⼀个结果集A;
2、将上⾯的结果集A通过group by xxx分组获取到第⼆个结果集B;
3、将结果集B通过having xxx进⾏筛选,获取到第三个结果集C;
4、将结果集C通过select xxx 查看某个字段或者某个字段计算的结果,⽣成结果集D;
5、将结果集D通过order by进⾏排序,返回最终的查询结果;
三、group by基础⾯试题举例
1、创建表并插⼊数据:
CREATE TABLE `tb_student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(15) DEFAULT NULL COMMENT '姓名',
`subject` varchar(15) DEFAULT NULL COMMENT '学科',
`score` int(3) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('张三', '数学', '90');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('张三', '语⽂', '50');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('张三', '英语', '40');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('李四', '数学', '45');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('李四', '语⽂', '55');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('王五', '数学', '30');析构函数是什么
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('王五', '语⽂', '70');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('李四', '英语', '80');
INSERT INTO `tb_student` (`name`, `subject`, `score`) VALUES ('王五', '英语', '49');
问题⼀:使⽤group by分组查询每个学⽣有⼏科不及格?sql语句如下:
-- 注:先通过where查出不及格的学⽣,然后通过group by分组计算每个学⽣有⼏科不及格
select name,count(*) from tb_student where score < 60 group by name;
评价evaluation的定义问题⼆:查出学⽣不及格科⽬的平均值是多少?sql语句如下:
-- 注:通过聚合函数avg()计算平均值
select name,avg(score) from tb_student where score < 60 group by name;
问题三:查询每个学⽣每科成绩的最⼤值,并倒序展⽰?sql语句如下:
-- 注:先通过group by结合max()聚合函数查出结果集,然后在通过order by排序
select name,max(score) as score from tb_student group by name order by score desc;
问题四:使⽤group_concat()函数将不及格学⽣的成绩详情排序展⽰?sql语句如下:
mysql面试题基础知识
select name,group_concat(score order by score desc) as score from tb_student where score < 60 group by name;问题五:使⽤group by 和 having查询两门以及两门以上不及格同学的平均分,sql语句如下:
-- 注:使⽤sum(score<60)来计算不及格的科⽬数
select name,avg(score) as score,sum(score<60) as gk from tb_student group by name having gk >= 2;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。