server取出多个最小值 sql_SQL从0到1:汇总分析

本文详细介绍了SQL的汇总分析,包括count、sum、avg、max和min等函数的使用,并通过实例讲解了分组(Group by)、条件筛选(having)、排序(order by)和解决实际业务问题的方法。同时,还提到了SQL查询中常见的错误及其解决方案,并提供了课后练习题。
摘要由CSDN通过智能技术生成

本文内容目录:

  • 汇总分析
  • 分组
  • 对分组结果指定条件
  • 用SQL解决业务问题
  • 对查询结果排序
  • 看懂SQL报错信息

一、汇总分析

1、常见的汇总函数

count:用于求某列的行数

sum:用于求某列数据的和(只能对数值类型的列计算)

avg:求某列数据的平均值(只能对数值类型的列计算)

max:求某列数据的最大值

min:求某列数据的最小值

函数用于对输入的数据执行某项特定的指令,然后将结果输出。

SELECT COUNT(教师姓名)  -- 输出结果不包括Null值
from teacher;

6e28ead3a882e77d84c2b352dec6d7ec.png
SELECT COUNT(*)  -- 输出结果包括Null值
FROM teacher;

51f92cab3ee90768240097134a735883.png
SELECT sum(成绩)  -- sum/avg只能对数值类型的列计算
FROM score;

f5429806368e742ad44db5fca74e41f0.png
SELECT avg(成绩)  -- 返回成绩列的平均值
from score;

bf7c14ff3598f4eabc4b07998d907832.png
SELECT max(成绩),min(成绩)  -- 查找成绩列中的最大值和最小值
from score;

10dde9524e07e49059edab7568a5962c.png
SELECT COUNT(DISTINCT(姓名))  -- 函数可以结合使用,返回去重后的数值
from student;

2d34669a8fe5396b044ed01083ecea2a.png

练习:

1、查询课程编号为‘0002’的总成绩

SELECT sum(成绩) as 0002总成绩
from score
where 课程号='0002';

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

SELECT COUNT(DISTINCT(学号)) as 学生人数
from score;

二、分组 Group by

SELECT 性别,count(*)  --运行顺序:先运行第2~4行,最后运行第1行
from student
where 出生日期>'1990-01-01'
group by 性别;

400a8371a0c70a66408050ff5a9e89b3.png

练习:

1、查询各科成绩最高分和最低分

SELECT 课程号,max(成绩),min(成绩)
from score
group by 课程号;

98b0f7cfb1c666cf9dea8a846dfdabe0.png

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

SELECT 课程号,count(学号)
from score
group by 课程号;

b9a1960af3964ec944ff2575d832322a.png

3、查询男生、女生人数

SELECT 性别,count(*)
from student
group by 性别;

a0ff50e4f95f51e763224a761a47c360.png

三、对分组结果指定条件 having

select  查询结果
from 从哪张表中查找数据
where  查询条件
group by  分组
having  对分组结果指定条件

-- 运行顺序:先运行2~5行,再运行第1行

练习:

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

SELECT 学号,avg(成绩)
from score
group by 学号
having avg(成绩)>60;

3fc8d8e74205ab519384b138f198ce3e.png

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

SELECT 学号,count(课程号) as 选修课程数目
from score
group by 学号
having count(课程号)>=2;

6c083ee94453134eaf06a79199b95f07.png

3、查询同名同姓学生名单并统计同名

select 姓名 as 同名同名名单,count(姓名) as 人数
from student
group by 姓名
having count(姓名)>1;

93c7a24d6d24f1f4ceb97a6abe81728b.png

四、用SQL解决业务问题

用SQL解决业务问题的步骤:

1、将问题翻译成大白话

2、写出分析思路

3、写出对应的SQL子句

练习:计算每门课程的平均成绩并且平均成绩大于等于80分

SELECT 课程号,avg(成绩) as 平均成绩
from score
group by 课程号
having avg(成绩)>=80;

a8359a124e7de91473eae7c48b98c10a.png

五、对查询结果排序 order by

select  查询结果
from 从哪张表中查找数据
where  查询条件
group by  分组
having  对分组结果指定条件
order by 对查询结果排序    

-- 关键字默认按照升序对记录进行排序,也可以使用升序(asc),降序(desc)进行指定
-- 运行顺序:先运行2~5行,再运行第1行,最后运行第6行

SQL可指定多个排序列名,这种情况下先按第一个列进行排序,当第一个列中有多个相同值时,再按第二个列的顺序进行排序。

SELECT *
from score
ORDER BY 成绩 asc,课程号 desc;

21ac62f65354a2ec533c3b187fd44ba3.png
-- 当用于排序的列中存在空值时,空值会排在前面,可借此观察该列的空值情况
SELECT *
from teacher
ORDER BY 教师姓名;

fd665f8c26cb3a335ed8473624ab1410.png

从查询结果中取出指定行:limit

SELECT *
from score
limit 2;  -- 2指的是只返回前两行的数据

8e969c980790d0f41cf6d99e215f175f.png
select  查询结果
from 从哪张表中查找数据
where  查询条件
group by  分组
having  对分组结果指定条件
order by 对查询结果排序    -- 升序asc,降序desc
limit  从查询结果中取出指定行

-- 运行顺序:先运行2~5行,再运行第1行,最后运行第6、7行

练习:

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

SELECT 课程号,成绩
from score
having 成绩<60
ORDER BY 成绩 desc;

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

SELECT 课程号,avg(成绩) as 平均成绩
from score
GROUP BY 课程号
ORDER BY avg(成绩) asc,课程号 desc;

885a0bffb6d6d0456e9a58646c032420.png

五、如何看懂报错信息

常见错误:

1、在group by中使用了select 里的别名

SELECT 课程号,avg(成绩) as 平均成绩
from score
where 平均成绩>=80
ORDER BY avg(成绩) asc,课程号 desc;

报错信息:

a912e59ed487acb881461aa7c8bb47fa.png

显示无法识别‘平均成绩’,因为where子句执行的时候,select子句尚未执行,因此无法进行正常识别

2、在where中使用聚合函数

SELECT 性别,count(*)
from student
where count(*)
GROUP BY 性别;

报错信息:

8262a39d3449c6d5cd2846fd9aaa33ec.png

六、课后练习

本次练习来自SQLZOO网站的SELECT from nobel 和 SUM and COUNT 部分。

SELECT from nobel 部分:

06e12af7515e5a25a16d8ca95b6514bf.png

e71a441baa1fbda9903a76f5f6ca92d5.png

d42ec6bd797f230336b1b21c7f3998ed.png

d9ef5f7777993afa06d2f698f94c4ec4.png

26f551b285f5937dc72f13fb09056ea1.png

18ad78a98314d8b74af7785ef45bdc15.png

0c63e28a96ecd0a28ee32d9b3337b935.png

6b3fb8324ea872d13cad49c0468336ac.png

fbd6d950ce4ce12413d0f71125904138.png

7d5e0adbf24a942ddf6f97b66455a9e3.png

43608fa8c1f316738b0f3da14531752a.png

9b27f3ccf4436963a352e143ef70bedc.png

6777a72233eaefd578d3b742cea51f48.png


补充知识点:当字符串中包含单引号或双引号时,需要进行转义字符的处理。

0bff9bf69167c9b324521f46f660e8e6.png

a54fbf08eb0836b2e333e71e9f12b66f.png

e1c00bdb5ab1a6acfe308fa4ac9d12ed.png

补充知识:

在排序过程中,如果需要某字符串排在最前或最后,可以引入subject in ('字符串' )来进行一个if的判断,如果是该字符,返回值为1,如果不是该字符,返回值为0,据此可以进行特定顺序的排列。

SUM and COUNT 部分:

64b8f0536a06bb9882ab3b60559ad539.png

924fedcb0020326c43ab033dc31b3436.png

a7826debbf549b97a4343cf9a76bb320.png

ed9b9a8faa6ddcfb1186ede43629dfcf.png

7ebc120b8f22ef0f5130ed271e45dde7.png

a4d03f548bc37234a001da2dc7bf8c01.png

1c48a1f179a413e593e2f01a3001c7f5.png

065cce985f90c5208dc487fc460b8e60.png

972684e7229c829779187a747f79e97c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值