前两篇文章对数据库有了基本了解,对基本的操作数据库和表的建立、更新、删除,还有一些简单的查询语句的理解。这一篇进一步对SQL的汇总分析学习,经过这篇学习,我们就可以对业务数据进行分析啦!

一共分为六个部分:

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

一.汇总分析




sql server查询结果分组合并 sql分组汇总查询_sql 查询总和


A. count()函数:求某列的行数。

count(column_name)函数返回指定列的值得数目(null不计入):


SELECT COUNT(column_name) 
FROM table_name ;


求teacher表中教师数,count(教师姓名)会排除null值


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_02


count(*) 函数返回表中的记录数(null计入,计算所有行数):


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_03


COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目(即重复值不重复计数,student中有两个小明数据):


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_04


B.sum()函数返回数字列的总和:


SELECT SUM(column_name) 
FROM table_name ;


求score表中学生成绩总和


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_05


C.AVG() 函数返回数字列的平均值:


SELECT AVG(column_name) 
FROM table_name ;


求score中学生成绩的平均值


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_06


D.MIN() 函数返回所选列的最小值。


SELECT MIN(column_name) 
FROM table_name ;


求score表中最低成绩


sql server查询结果分组合并 sql分组汇总查询_sql 降序_07


E.MAX() 函数返回所选列的最大值。


SELECT MAX(column_name) 
FROM table_name;


求score表中最高成绩


sql server查询结果分组合并 sql分组汇总查询_sql 降序_08


F. 练习面试题:

查询课程编号为“0002”的总成绩:


SELECT SUM(成绩)
FROM score
WHERE 课程号='0002';


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_09


查询选了课程的学生人数:


SELECT COUNT(DISTINCT 学号)
FROM score
WHERE 课程号 is not NULL;


sql server查询结果分组合并 sql分组汇总查询_sql 降序_10


二、分组

在SQL中我们用group by语句来对数据按某个条件进行分组:

A. GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组,语法如下:


SELECT column_name
FROM table_name
GROUP BY column_name;


分析方法步骤:1.按某个条件进行数据分组;2.对分组数据应用函数;3.组合结果展示最终数据。具体如下


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_11


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_12


注意:凡是在group by后面出现的字段,必须同时在select后面出现;凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面。

B. 分组面试题:

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


SELECT 课程号,MAX(成绩),MIN(成绩)
FROM score
GROUP BY 课程号;


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_13


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


SELECT 课程号,COUNT(学号) as 学生人数
FROM score
GROUP BY 课程号;


sql server查询结果分组合并 sql分组汇总查询_sql 降序_14


查询男生、女生人数


sql server查询结果分组合并 sql分组汇总查询_sql 分组统计_15


三、对分组结果指定条件

A. HAVING关键字

GROUP BY主要作用是用来进行分组聚合,此外还常与HAVING关键字一起使用,用来对分完组后的数据进一步的筛选。

注意:在 SELECT 查询中,HAVING 子句必须紧随 GROUP BY 子句,并出现在 ORDER BY 子句之前。带有 HAVING 子句的 SELECT 语句的语法如下所示:


SELECT column1,column2 --查询结果
FROM table1,table2 -- 从哪张表中查找数据
WHERE [conditions] -- 查询条件
GROUP BY column1,column2 -- 分组
HAVING [conditions] -- 对分组结果指定条件


从student表中查询数据,按性别分组,筛选出学生人数大于2的分组


SELECT 性别,COUNT(姓名) as 学生人数
FROM student
GROUP BY 性别
HAVING COUNT(姓名)>2;


sql server查询结果分组合并 sql分组汇总查询_sql 分组统计_16


B.分组结果条件面试题:

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


SELECT 学号,AVG(成绩) as 平均成绩
FROM score
GROUP BY 学号
HAVING 平均成绩>60;


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_17


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


SELECT 学号,COUNT(课程号)as 选修课程数
FROM score
GROUP BY 学号
HAVING 选修课程数>=2;


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_18


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


SELECT 姓名,COUNT( 姓名)as 学生人数
FROM student
GROUP BY 姓名
HAVING 学生人数>=2;


sql server查询结果分组合并 sql分组汇总查询_sql 分组统计_19


四、用SQL解决业务问题

下面我们运用前面学习的汇总语句来尝试解决业务问题了呢。我们可以理解为三个步骤:

  • 把业务问题解读成通俗易懂的大白话
  • 写出分析思路
  • 写出对应的SQL语句

实际案例来看一下,如何使用这个思路来解决问题:

A. 假设老板现在要求你计算各科的平均成绩?

我们可以按上面步骤,先在草稿纸上写出问题对应的分析思路和对应sql:

  1. 翻译成大白话

计算各科的平均成绩 ——> 计算每门课程的平均成绩

2. 写出分析思路

以上提炼关键词:各科、平均成绩

  • 从哪张表——>score
  • 各科
  • 平均成绩——> 对(每门课程)成绩求平均值
  • 查询结果:课程号,平均成绩

3. 写出对应的SQL语句

下面我们按照上面的分析思路结合SQL的运行顺序来写出对应的SQL子句


SELECT 课程号 ,AVG(成绩 ) as 平均成绩 --查询结果
FROM score                         --从哪张表中查数据
(where 没有)                        -- 查询条件
GROUP BY 课程号                     --分组
(having 没有);                      --分组结果指定条件


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_20


B. 接下来,老板让你进一步筛选出平均成绩大于等于80分的:

关键词:课程号、平均成绩——>对分组结果指定条件>=80,


SELECT 课程号 ,AVG(成绩 ) as 平均成绩
FROM score
GROUP BY 课程号
HAVING 平均成绩>=80;


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_21


五、对查询结果排序

在处理数据时我们经常需要对数据进行排序,在SQL中,ORDER BY 关键字用于对结果集进行排序。

  • ORDER BY就是对需要排序的列按升序(ASC)或降序(DESC)排列后显示数据。
  • 默认情况下按升序(ASC)排序记录,降序的情况下必须写DESC。

此时,SQL语句的运行顺序为:


(5)SELECT  <list1,list2...>
(1)FROM [table]
(3)WHERE <condition>
(2)GROUP BY <list1>
(4)HAVING <condition>
(6)ORDER BY <list1>


A. 求出各科的平均成绩,并按升序排列


SELECT 课程号 ,AVG(成绩 ) as 平均成绩
FROM score
GROUP BY 课程号
ORDER BY 平均成绩;


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_22


B.如果要排序的列里面有空值呢?如何对空值(null)进行排序?

对teacher教师表的教师姓名进行排序


SELECT *
FROM teacher 
ORDER BY 教师姓名;


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_23


C.如果一个数据有几万条甚至十几万条,我们为了提高效率,只想返回其中一部分数据使用limit语句。

选择成绩最高的前两名:


SELECT *
FROM score 
order by 成绩 desc
LIMIT 2;


sql server查询结果分组合并 sql分组汇总查询_sql 降序_24


D. 运行顺序面试题:

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


SELECT 课程号,成绩
FROM score 
WHERE 成绩<60
ORDER BY 课程号 DESC;


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_25


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


SELECT 课程号,avg(成绩) as 平均成绩 
FROM score
GROUP BY 课程号 
ORDER BY 平均成绩 ASC, 课程号 DESC;


sql server查询结果分组合并 sql分组汇总查询_sql 降序_26


检索课程号为“0003”且分数小于90的学生学号,结果按按分数降序排列


SELECT 课程号,成绩
FROM score 
WHERE 课程号='0003' and 成绩<90
ORDER BY 成绩 DESC;


统计每门课程的学生选修人数(超过2人的课程才统计),要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序


SELECT 课程号,COUNT(学号) as 选修人数
FROM score 
GROUP BY 课程号
HAVING 选修人数>2
ORDER BY 选修人数 DESC,
课程号 ASC;


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_27


查询1门及以上不及格课程的同学的学号及不及格课程的平均成绩


select 学号, avg(成绩) as 平均成绩,count(课程号) as 不及格课程数
from score
where 成绩 <60
group by 学号
having count(课程号)>=1;


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_28


6.如何看懂报错信息

学了这么多,做了这么多联系,是不是经常在运行时出现报错信息呢?你看懂了吗?现在我们就一起来学习如何看懂报错信息。


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_29


  1. [err]
  2. 报错信息:下划线处则代表语句出错的具体位置。
  3. 具体错误:having子句运行在select前,调用‘平均成绩’sql无法判断此信息,应改为avg(成绩)

接下来我们依然来到我们的SQLZOO,完成我们的巩固联系:


sql server查询结果分组合并 sql分组汇总查询_sql 分组统计_30


1.select from nobel


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_31


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_32


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_33


sql server查询结果分组合并 sql分组汇总查询_sql 降序_34


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_35


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_36


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_37


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_38


sql server查询结果分组合并 sql分组汇总查询_sql 降序_39


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_40


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_41


sql server查询结果分组合并 sql分组汇总查询_sql 降序_42


sql server查询结果分组合并 sql分组汇总查询_sql 降序_43


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_44


2.sum and count


sql server查询结果分组合并 sql分组汇总查询_sql 分组统计_45


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_46


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_47


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_48


sql server查询结果分组合并 sql分组汇总查询_sql按时间排序_49


sql server查询结果分组合并 sql分组汇总查询_sql server查询结果分组合并_50


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_51


sql server查询结果分组合并 sql分组汇总查询_sql 查询总和_52