设为首页 加入收藏

TOP

MySQL之高级查询解析
2018-08-14 09:11:57 】 浏览:72
Tags:MySQL 高级 查询 解析

GROUP BY

当需要进行分组统计数据的时候,比如语文班、数学班、英语班每个班所有学生的成绩总和,我们需要创建think_student表,字段为:id、class、student、score。

通过新增语句新增如下六条数据填充:

INSERT INTO 'think_student' VALUES('1','语文班','张三','80');
INSERT INTO 'think_student' VALUES('2','数学班','李四','95');
INSERT INTO 'think_student' VALUES('3','英语班','李五','77');
INSERT INTO 'think_student' VALUES('4','语文班','大牛','88');
INSERT INTO 'think_student' VALUES('5','数学班','小牛','97');
INSERT INTO 'think_student' VALUES('6','英语班','中牛','93');

如果我们想获取所有班级分数的总和,SQL语法如下:

SELECT SUM(score) FROM think_student;

如果我们想要获取某一个班级分数的总和,SQL如下:

SELECT SUM(SCORE) FROM think_student WHERE class='语文班';

如果我们想要每个班级的分数的总和,并且一次性显示出来,这时候就需要GROUP BY分组统计来实现,SQL如下:

SELECT class,SUM(score) FROM think_student GROUP BY class;

HAVING

和我们以前用的ON、WHERE一样,是过滤器,只不过这个过滤器可以在虚拟表中的字段进行过滤,主要是对分组条件进行的筛选作用。

我们添加一个上一次成绩的字段:prev_score,分别为:77,96,80,90,95,90。然后,求出本次成绩进步的同学。

//首先求出成绩差,进步的是正值,退步的是负值
SELECT student,score-prev_score FROM think_student;
//通过WHERE过滤掉负值和零的学生
SELECT student,score-prev_score FROM think_student WHERE score-prev_score>0;

//由于score-prev_score作为字段显示不方便,使用AS生成一个虚拟字段
SELECT student,score-prev_score AS diff FROM think_student WHERE score-prev_score>0;
//虚拟字段,采用HAVING过滤
SELECT student,score-prev_score AS diff FROM think_student HAVING diff>0;
//结合分组,找出班级总分超过190的
SELECT class,SUM(score)AS sum FROM think_student GOURP BY class HAVING sum>190;

DISTINCT子句

如果字段指定了DISTINCT子句,那么会创建一个内存临时表,并且对这个列增加一个唯一索引,以此除去重复数据。

//去除相同的数据
SELECT DISTINCT prev_score FROM think_student;
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Mysql导入导出教程 下一篇MySQL之组合查询解析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目