sql select返回多个数值依次赋值_SQL从0到1:汇总分析

本文详细介绍了SQL的基础操作,包括汇总分析(count, sum, avg, max, min函数的使用),分组查询(Group by 和 having 子句的应用),解决实际业务问题,以及查询结果的排序。通过实例练习,帮助读者掌握SQL的核心技能。" 114988979,5561017,青春记忆:月光下的诗篇,"['青春', '写诗', '情感']

本文内容目录:

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

一、汇总分析

1、常见的汇总函数

count:用于求某列的行数

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

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

max:求某列数据的最大值

min:求某列数据的最小值

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

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

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

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

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

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

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

c974f62f6d3176e36628428365c70238.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 性别;

efd050a5eae75d1a7dbd2d9ae7b11997.png

练习:

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

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

688ac86bea71e2daa4f1651bd8f2b1e8.png

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

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

4bb8d3812ebea65a9a72c507b906ab83.png

3、查询男生、女生人数

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

22c0f046436254ca05c132f6dffa4c62.png

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

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

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

练习:

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

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

803c30e4a3078d0281d65f3763749f0b.png

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

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

9f757829e280c5c5c56d5523f063b369.png

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

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

602c4730d4a83f2a99f2d4e9dd65cd5d.png

四、用SQL解决业务问题

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

1、将问题翻译成大白话

2、写出分析思路

3、写出对应的SQL子句

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

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

211eb807d74532e4f0a74d82243bd09b.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;

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

0d54865b9ea4418d60aaa024d83c2a92.png

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

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

7a6247ef538cbeb8262f88321dedcbb9.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;

8e3716c96912ed23fd792d7a171b3e19.png

五、如何看懂报错信息

常见错误:

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

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

报错信息:

08ef9affd0e60b18ef707051c747c605.png

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

2、在where中使用聚合函数

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

报错信息:

7db98f8b906cc90e117cfcf50c46dd85.png

六、课后练习

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

SELECT from nobel 部分:

e7f114e31ee163b07d2934c5f435a4da.png

7eebcaccdd044c96bb3990a99951fe0a.png

26693f1dad9b6f844e3c19f8bf1c7e98.png

ac4d23e03cf08c161c4a1c478d409a8b.png

29d5094c529c598f7dd05919e8fb9ae8.png

002443d29ca6e5fdcb83f9dc16f4bf87.png

38dc6b9a7eeb864b33679cd7633a5179.png

c9845f759a4bda8168a8c29e9975227a.png

df3a4839ca819394856c094fdf32465f.png

0b9334d025ded0bbcbc190f859b3fa66.png

b277eec484de38d33fdb4233c7c41d64.png

002266136e29754e379bae13554311b3.png

bee2bfc7403f40f2cd36b09a7b37d19d.png


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

d1423f437ac0966530e78f3b0f18ec40.png

46b6da1adbb3522b4b20793511fb1c82.png

214e42f073d2ebba57f1bffa7a2fcc15.png

补充知识:

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

SUM and COUNT 部分:

3ecda3bb5307a48619b2f9e5b7378219.png

377d7eedeab4f0cff735fc032631acaa.png

3e223ee93defdfb94a2932b04168ac72.png

c31d0b966f1c28c67b21c8e5c1361444.png

be6731fb33eed6e80535f04b83c1f6dd.png

d48439ae7b2cd5d185630ecccca0ac22.png

ea9605a6342c9837bd6628c6e1b9588e.png

a870e8507f9ea252bfad7310f5e9d6f3.png

daebf15971828c27737178a99c28e708.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值