如何替换某列元素值_如何用SQL做汇总分析

本文围绕SQL展开,介绍了汇总分析,如COUNT、SUM等聚集函数的使用;分组操作GROUP BY的要点;对分组结果筛选的HAVING子句,对比了其与WHERE的区别;还阐述了用SQL解决业务问题的思路、查询结果排序ORDER BY的规则,以及如何看懂SQL报错信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章结构

  1. 汇总分析
  2. 分组
  3. 对分组结果制定条件
  4. 用SQL解决业务问题
  5. 对查询结果进行排序
  6. 如何看懂报错信息

一.汇总分析

聚集函数:聚集函数会对NULL以外的对象进行汇总。但是只有COUNT函数例外,使用COUNT(*)可以查出包含NULL在内的全部数据的行数[输入的是列名的时候NULL不统计],注意:其他函数并不能将星号作为参数。

COUNT: COUNT() 函数返回符合指定条件的行数

SQL COUNT() 函数_w3cschool​www.w3cschool.cn
a6c96c6fd8bdaae19bc3373d38ceb075.png

19b1da05bad1f357f6c7f844c63a6399.png

1.查询某列的行数[NULL不计数],count输入参数为列名。

8a60c23dda4f539283669637ba1460c6.png
表-teacher

1ebdea7cf85ad4f0483e0c8c62f35de5.png

2.查询所有记录数(行数)

0cebc73dbe86ef0be8085cc761661242.png

SUM函数:函数返回数字列的总和。

实例1:求学号为'0001'的学生的课程总成绩。

474234b18bb09ca11cd3312dee79d7fc.png
表-score

aac079659d86f420c27a287e4d0edf57.png

AVG函数:函数返回数字列的平均值。

实例1:求学号为'0001'的学生的课程平均成绩。

70a879da6a86855bb045db8fc7dcc246.png

MAX/MIN函数函数返回所选列的最大值/最小值。

实例1:求课程号为'0002'的课程最高分和最低分。

b8b18e617baf72b057e3a4b0fa01d7dc.png

注意:聚集函数,如果以列名为参数,那么在计算之前就已经把NULL 排除在外了。因此,无论有多少个 NULL 都会被无视,被无视和等于0是不同的,具体自己体会AVG函数中二者的区别。

函数小练习:

1.查询课程编号为'0002'的总成绩.

45badb03c9720da72c7ea886bbcb14b7.png

2.查询选了课程的学生人数.

be0d657b4bd0ac9e5bea499bf91bb781.png

二.分组

GROUP BY:主要是用来通过对某个字段进行分组查询,使用 GROUP BY 子句时,会将表中的数据分为多个组分别进行处理。

1a08471863ecca4c12ae6dcd5e4f49ce.png

3d1ddaee81d05d66fbb770921f9ab195.png

9dde1fb9f7427b6b12f35fd891175512.png

d14a4ca95abec27be566b69a6cd6b837.png

注意:因为聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数,要么为GROUP BY语句的参数,要么为一个常数否则会出错。

3b6e2785e206efcc6eb8df1bff4d24e2.png

select子句后面接无论是列名,还是其他聚合函数,都要做到每行输出的元素做到一一对应。因为按continent分组之后再组合后的结果,每个continent都只有一个值,但是一个continent肯定不止一个country,所以会出一对多的情况【一对多的数据往往需要分组】,于是会报错,GROUP BY后的数据,应该是搭配聚集函数使用,才能一对一(聚集函数只有一个返回值)。【mysql不会报错】

分组练习题:

1.查询各科成绩最高和最对分。

a927dd239efa5ab4b7045b213c46525a.png
表-score

38c8a42cf60463060eaa6fa1a68e7975.png

2.查询每门课程选修的学生数量。

f7a6813845431796e2b2b9de5828e3c8.png

3.查询男生人数,女生人数。

f96412a52a1c23c66d1ba5641c5f59df.png
表-student

ed305df67712c95d9a6ca9a51c7affb2.png

3.查询选择了课程'0002'男生人数,女生人数。

e45cb98fe165ae5ececf41155a806133.png

6fbf344146bc2a7c8083e891f7b364a4.png

三.对分组结果指定条件[HAVING]。

HAVING通常是对GROUP BY后的数据进行筛选的[基本上都和聚集函数搭配使用]。

650c9d056309edc9cb2e1c9ba0a097d5.png

dd37494f8c4329209add667d8d068100.png

补充资料:

(1)聚函数:诸如(COUNT,MAX,MIN,SUM,AVG)等基于整列数据进行计算的返回单一值的函数。

(1)HAVING是先分组再筛选记录,WHERE在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选。

dead446d21f810ebd4a23053f579afca.png

(2)具体来说:聚集函数也叫列函数,它们都是基于整列数据进行计算的,而WHERE子句则是对数据行进行过滤的。聚集函数要对全列数据进行计算,因而使用它的前提是:结果集已经确定!而WHERE子句还处于“确定”结果集的过程中,因而不能使用聚集函数。与WHERE子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的HAVING子句。为什么?因为在水平方向上根据外部指定条件的筛选(也就是对行的筛选),WHERE子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过HAVING子句配合聚集函数来完成。其次,WHERE子句运行效率比HAVING子句也要快。

(3)使用 COUNT 函数等对表中的数据进行聚合操作时,DBMS 内部就会进行排序处理。排序处理是会大大增加机器负担的高负荷的处理 。通过 WHERE 子句指定条件时,由于排序之前就对数据进行了过滤,因此能够减少排序的数据量。但 HAVING 子句是在排序之后才对数据进行分组的,因此与在 WHERE 子句中指定条件比起来,需要排序的数据量就会多得多。

转自:

优快云-专业IT技术社区-登录​blog.youkuaiyun.com

练习题:

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

86988ffa99c7ae83454e50489077cdc6.png

2.查询至少选修两门课程的学生的学号。

fef78c0012b701cd51a130e6b8f34148.png

3.查询同名同姓的学生名单并统计同名人数。

6906595c123470f51e8ea958da009228.png

四.用SQL解决业务问题

[磨刀不误砍柴工]

  1. 翻译成大白话
  2. 写出分析思路
  3. 写出对应的SQL语句

21a051bffb8ac6324dbf8a9daa284779.png

五.对查询结果进行排序

  • ORDER BY在SELECT语句之后运行.
  • ORDER BY子句中可以使用SELECT子句中定义的列的别名。
  • ORDER BY子句中可以使用SELECT子句中未出现的列或者聚合函数。
  • ORDER BY子句中如果同时指定多个排序键。规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的键。

1a33f36ed7b7a8ac4b7e84c9821b4413.png

图片出自:

SQL ORDER BY 关键字​www.w3cschool.cn
a6c96c6fd8bdaae19bc3373d38ceb075.png

排序应用:查看空值情况。

f57c9f7a20755bfa2f19a0ef01c0c8b3.png

limit:从查询结果中取出指定行,一般来说,limit是对查询结果做限定,一般是最后运行。

d0667c986392e16777ccc57155bde46f.png

练习题:

1.查询不及格的课程并且按照课程号从大到小排列。

713379166f572b3615e34eba73d95be1.png

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

79a76aab53d80bda5cea99c75452a3ad.png

3.查询两门以上不及格课程的同学的学号及不及格课程的平均成绩。

b5a47e852878137b4d4e53c82725c25a.png
我们可以发现:如果存在限制条件,它限制的主体,通常来说是要输出内容的主体之一。

补充:Sql语句运行顺序

fa8bffd4a0e5a4e9a8c38167ad34b081.png

六.如何看懂sql报错信息。

1.在GROUP BY 中使用了 SELECT里别名,SELECT 子句在 GROUP BY 子句之后执行。在执行 GROUP BY 子句时, SELECT 子句中定义的别名, DBMS 还并不知道。

2.在SELECT子句中书写了多余的列,在使用 COUNT 这样的聚合函数时, SELECT 子句中的元素有严格的限制。 使用聚合函数时,SELECT 子句中只能存在以下三种元素。

2f62430ffd7f0fd4a5114b87a5c95ee5.png

3.在WHERE中使用聚合函数。

4.HAVING 子句和包含 GROUP BY 子句时的 SELECT 子句一样,能够使用的要素有一定的限制,限制内容也是完全相同的。 HAVING 子句中能够使用的 3 种要素如下所示。

3fd8e746b58c447eede117085394cee2.png

如:①HAVING COUNT(*)= 2 这样的条件,其中 COUNT(*)是聚合函数, 2 是常数,全都满足上述要求。②或者后面接的时GROUP BY子句中的列名。

七.Sqlzoo练习

select from nobel:

d4dfd40ba755ac05a76b0a1d99063752.png

12438146019e6d476624ff853ff09978.png

4e844e30523050fbff4daf7e2f28034c.png

1ff43e3dbb150210743cc8414ee59e92.png

2af09fc48601fdad5a490ab76928fdbc.png

36f47bd59af20651a2da27055f5c5575.png

dbcb12af0b93d82836d184c23692e6ec.png

728e909f67dda3bad1b0530118c09f0a.png

383ca29c3d975851e2bfda3d0fbecc5e.png

3c423dc32525ec7bbdc140306d0c4647.png

f0702c369838d62769aa759fd06dacb3.png

SUM and COUNT:

b957ef6915d3a1a4a8f09b7f8ddccf5b.png

c40e6573f192b7fa50013c557dff6689.png

8a37813a77c4ce90de616f24d922771f.png

ffc8aa6a90e1e51233c19eafcf3ac587.png

e1a9d53886d8f5e4b8ed82703d451243.png

650c9d056309edc9cb2e1c9ba0a097d5.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值