mysql基础汇总_MySQL基础知识—汇总查询

一、汇总函数

汇总函数也就是聚合函数,是将多行结果汇总为一行输出,下图是常见的汇总函数:

qae67f.jpg

qae67f.jpg

接着我们对上面的函数一个个进行学习,看看他们具体的使用是怎么样的

count函数:

SELECT COUNT(教师姓名)

FROM teacher;

QnUbEf.jpg

QnUbEf.jpg

输出结果为什么是4个呢?这是因为教师号0003的教师名称就是Null,不是真正意义上的空值,他算一个数据,会被计数;教师号0004的教师名称是空格,也是一个字符串,只是肉眼看不到,它也算是一个数据;教师号0005的教师名称是(Null),它才是真正意义上的空值,才是真正代表什么也没有。因此5个数据中只有最后一个教师姓名的数据是为空,因此查询结果是4个。

下面再看一个例子:

SELECT COUNT(*)

FROM teacher;

IJ7JRj.jpg

IJ7JRj.jpg

*代表是全部,因此count函数计数的是全部行,包括空值的行,最后的查询结果为5。

注意:除了COUNT(*)例外,其余所有的汇总函数会将NULL数据排除之后再进行计算。

sum函数:(只能对数值类型的列进行计算)

SELECT SUM(成绩)

FROM score;

NVvQrq.jpg

NVvQrq.jpg

avg函数:(只能对数值类型的列进行计算)

SELECT AVG(成绩)

FROM score;

VrUrai.jpg

VrUrai.jpg

max函数和min函数(几乎适用于所有数据类型的列):

SELECT MAX(成绩),MIN(成绩)

FROM score;

nQfEna.jpg

nQfEna.jpg

需要注意的是:

将MAX()函数应用于文本数据时,会返回该列按照升序排列的最后一行

将MIN()函数应用于文本数据时,会返回该列按照升序排列的第一行。

比如:MAX(姓名),MIN(姓名),返回的结果分别是马云和李猴子

如果我不想重复计算相同的数据,那么在计数的列名前面加distinct

SELECT COUNT(DISTINCT 姓名)

FROM student;

iMreyq.jpg

iMreyq.jpg

接下来我们进行习题练习:

查询课程学号为‘0002’的总成绩

SELECT SUM( 成绩 )

FROM score

WHERE 学号 = '0002';

查询选了课程的学生人数

SELECT COUNT(DISTINCT 学号) AS 学生人数

FROM score;

注意:

1、所有的汇总函数都可以使用DISTINCT,在汇总函数的参数中使用DISTINCT,可以删除重复数据

二、分组(GROUP BY子句)

我想将student表中的数据按照性别进行分组统计男生和女生各有多少人,那么查询语法为:

SELECT 性别,COUNT(*) AS 学生人数 -- 统计出所有行男女性别的个数FROM student -- 从student的表中查询GROUP BY 性别;-- 对性别进行分组

iaINRj.jpg

iaINRj.jpg

对某列进行分组,那么该列的列名就被称为聚合建,上面的例子中,“性别”这一列就是聚合建。

使用GROUP BY子句常见易错知识点:

1、使用GROUP BY子句中,SELECT子句中不能出现聚合键之外的列名。总结一下就是SELECT子句中只能存在下面三种元素:

常数

汇总函数

GROUP BY子句中指定的列名(聚合键)

2、GROUP BY子句不能使用SELECT子句中定义的别名,

因为SQL在执行中是先执行GROUP BY子句,后执行SELECT子句,所以在SELECT子句中定义的别名在SQL执行GROUP BY子句时,他是不知道这别名代表是什么东西。

3、GROUP BY子句的结果是无序的

接下来我们进行习题练习:

查询各科成绩最高和最低的分

SELECT 课程表,MAX(成绩) AS 最高分,MIN(成绩) AS 最低分

FROM score

GROUP BY 课程表;

查询每门课程被选修的学生数

SELECT 课程表,COUNT(学号) AS 学生人数

FROM score

GROUP BY 课程表;

查询男生、女生人数

SELECT 性别,COUNT(性别) AS 学生人数

FROM student

GROUP BY 性别;

三、对分组结果指定条件(HAVING子句)

如果我想从student表中只查询出男生的人数,而不要女生的人数。

SELECT 性别,COUNT(性别) AS 学生人数

FROM student

GROUP BY 性别

HAVING COUNT(*)>1;-- 行数大于1

63aeae.jpg

63aeae.jpg

注意:

1、HAVING子句和SELECT子句一样,只能存在下面三种元素:

常数

汇总函数

GROUP BY子句中指定的列名(聚合键)

2、聚合键所对应的条件建议写在WHERE子句中,而不是HAVING子句中,这样可以提高运算速度,SQL语句也更容易理解。他们两者的作用区别 可以理解为:

WHERE子句=指定行所对应的的条件

HAVING子句=指定组所对应的条件

接下来我们进行习题练习:

查询平均成绩大于60分学生的学号和平均成绩

SELECT 学号,AVG(成绩)

FROM score

GROUP BY 学号

HAVING AVG(成绩) > 60;

查询至少选修两门功课的学生的学号

SELECT 学号,COUNT(课程号) AS 选修课程数

FROM score

GROUP BY 学号

HAVING COUNT(课程号) >= 2;

查询同名同姓学生名单并统计同名人数

SELECT 姓名,COUNT(姓名) AS 同名人数

FROM student

GROUP BY 姓名

HAVING COUNT(姓名) > 1;

查询每门课程的平均成绩,并且平均成绩大于等于60分

SELECT 课程号,AVG(成绩)

FROM score

GROUP BY 课程号

HAVING AVG(成绩)>=60;

四、对查询结果排序(ORDER BY)

将成绩按降序进行排序(从大到小):

SELECT 课程号,成绩

FROM score

ORDER BY 成绩 DESC;

ZJV73e.jpg

ZJV73e.jpg

将成绩按升序进行排序(从小到大):(下面程序不加ASC也是可以的,不加排序条件情况下,默认是从小到大,升序排列)

SELECT 课程号,成绩

FROM score

ORDER BY 成绩 ASC;

AVNf6r.jpg

AVNf6r.jpg

查询每门课程的平均成绩,并且平均成绩大于等于60分,并按降序进行排序(从大到小):

SELECT 课程号,AVG(成绩) AS 平均成绩

FROM score

GROUP BY 课程号

HAVING AVG(成绩)>=60

ORDER BY 平均成绩 DESC;

对多列进行排序,会按列名从左到右排序

SELECT *

FROM score

ORDER BY 成绩 ASC,课程号 DESC;

NFbu2y.jpg

NFbu2y.jpg

上面查询语句中先按成绩升序排列,成绩相同时课程号按照降序排列。

空值(null)的排序(空值会在查询结果的开头或者末尾显示)

SELECT *

FROM teacher

ORDER BY 教师姓名;

ZFVzAf.jpg

ZFVzAf.jpg MYSQL这里NULL是在开头显示

注意:在ORDER BY子句中可以使用聚合函数或者使用SELECT子句中未使用的列

如果查询出来的结果有几万行,我只想看前三行,那么该怎么办?

SELECT *

FROM score

LIMIT 3;

rmiyEz.jpg

rmiyEz.jpg

如果我想查询第4行后面的2行数据,要怎么办?

SELECT *

FROM score

LIMIT 2 OFFSET 4;

uiY7zm.jpg

uiY7zm.jpg

接下来我们进行习题练习:

查询不及格的课程并按课程号从大到小排列

SELECT 课程号,成绩

FROM score

WHERE 成绩<60

ORDER BY 课程号 DESC;

查询每门课程的平均成绩,结果按照平均成绩升序排列,平均成绩相同时,按课程号进行降序排列

SELECT 课程号,AVG(成绩)

FROM score

GROUP BY 课程号

ORDER BY AVG(成绩) ASC,课程号 DESC;

欢迎大家看看我写的其他MySQL基础知识系列文章,希望对你们有所帮助!

1、MySQL基础入门知识

2、MySQL基础知识—简单查询

4、MySQL基础知识—复杂查询

5、MySQL基础知识—多表查询

五、实践出真知

现在我们打开SQLZOO网站:https://sqlzoo.net/,点击下面图片红色框选部分,开始习题练习,进行查询语句的练习:

vEfmmy.jpg

vEfmmy.jpg

第一部分、选择诺贝尔奖

第一题代码:

SELECT yr, subject, winner

FROM nobel

WHERE yr = 1950;

FN3yq2.jpg

FN3yq2.jpg

第二题代码:

SELECT winner

FROM nobel

WHERE yr = 1962 AND subject = 'Literature';

2aEzye.jpg

2aEzye.jpg

第三题代码:

SELECT yr, subject

FROM nobel

WHERE winner = 'Albert Einstein';

RvU3em.jpg

RvU3em.jpg

第四题代码:

SELECT winner

FROM nobel

WHERE yr>=2000 and subject = 'Peace';

eA7Bfm.jpg

eA7Bfm.jpg

第五题代码:

SELECT yr, subject, winner

FROM nobel

WHERE subject='Literature'and yr>=1980 and yr<=1989;

y6fm2u.jpg

y6fm2u.jpg

第六题代码:

SELECT *

FROM nobel

WHERE winner IN ('Theodore Roosevelt','Woodrow Wilson', 'Jimmy Carter','Barack Obama');

NzqIvu.jpg

NzqIvu.jpg

第七题代码:

SELECT winner

FROM nobel

WHERE winner LIKE 'John%';

Fv6Jji.jpg

Fv6Jji.jpg

第八题代码:

SELECT yr,subject,winner

FROM nobel

WHERE (yr='1980'and subject = 'Physics')OR(yr='1984'and subject = 'Chemistry');

nqYZzy.jpg

nqYZzy.jpg

第九题代码:

SELECT yr,subject,winner

FROM nobel

WHERE yr='1980'AND subject NOT IN('Chemistry','Medicine');

rqEnu2.jpg

rqEnu2.jpg

第十题代码:

SELECT yr,subject,winner

FROM nobel

WHERE (yr<1910 and subject='Medicine')OR (yr>='2004'and subject='Literature');

VRjYzy.jpg

VRjYzy.jpg

第十一题代码:

SELECT yr,subject,winner

FROM nobel

WHERE winner IN ('PETER GRÜNBERG');

nyaqQj.jpg

nyaqQj.jpg

第十二题代码:

SELECT yr,subject,winner

FROM nobel

WHERE winner = 'EUGENE O''NEILL'

3AfQbe.jpg

3AfQbe.jpg

第十三题代码:

SELECT winner,yr,subject

FROM nobel

WHERE winner LIKE 'sir%'

ORDER BY yr DESC,winner;

VvmIra.jpg

VvmIra.jpg

第十四题代码:

SELECT winner, subject

FROM nobel

WHERE yr=1984

ORDER BY subject IN ('Physics','Chemistry'),subject,winner

ERfa2i.jpg

ERfa2i.jpg

第二部分、SUM和COUNT

第一题代码:

SELECT SUM(population)

FROM world;

m2YBZb.jpg

m2YBZb.jpg

第二题代码:

SELECT DISTINCT continent

FROM world;

F3yYfu.jpg

F3yYfu.jpg

第三题代码:

SELECT SUM(gdp)

FROM world

WHERE continent = 'Africa';

R3IFZb.jpg

R3IFZb.jpg

第四题代码:

SELECT count(name)

FROM world

WHERE area>=1000000;

iIzAbe.jpg

iIzAbe.jpg

第五题代码:

SELECT sum(population)

FROM world

WHERE name IN ('Estonia','Latvia','Lithuania');

veiaaq.jpg

veiaaq.jpg

第六题代码:

SELECT continent,count(name)

FROM world

GROUP BY continent;

RFJ3Uf.jpg

RFJ3Uf.jpg

第七题代码:

SELECT continent,count(name)

FROM world

WHERE population>=10000000

GROUP BY continent;

M3ai6v.jpg

M3ai6v.jpg

第八题代码:

SELECT continent

FROM world

GROUP BY continent

HAVING sum(population)>=100000000;

zaeAri.jpg

zaeAri.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值