一、对表进行聚合查询

通过SQL对数据进行某种操作或者计算时需要使用函数,例如,计算表中全部暑假行数时,可以使用count函数,该函数使用count(计数)来命名的,下面是5个常用的函数

count :计算表中的记录数(行数)
sum :计算表中数值列的数据合计值
avg :计算表中数值列的数据平均值
max :求出表中任意数据的最大值
min :求出表中任意数据的最小值

上面用于合计的函数称为聚合函数或者是集合函数

#使用count函数计算数据全部行数
select count(*) from  showIn

在使用count(*)计算行数的时候会把空行也计算进去的,如果不想要计算空行即NULL的话,可以直接写上列名,那这个就不会吧空行计算出来了

select count(name) from showIn

mysql 聚合函数 mysql聚合函数的用法_聚合函数


聚合函数会将NULL排除在外,但是count(*)例外,并不会排除NULL

max/min函数几乎使用于所有的数据类型的列,sum/avg函数只适用于数字类型的列

使用聚合函数删除重复值

某些数据存在多行数据相同的情况,如果在计算行数的时候会把相同的数据也一起统计进去,比如想要计算种类数的时候,会把相同的给计算进去,所有这里就需要使用DISTINCT关键字作为参数,去掉重复的数据

select count(distinct show_name ) from stds

对于统计的show_name行数会先去掉重复的数据再统计行数

除了对count函数使用DISTINCT关键字之外,其他的聚合函数也可以使用DISTINCT关键字

select sum(DISTINCT show_id) from stds
二、对表进行分组
  • 使用group by 子句可以像切蛋糕那只要在将表进行分割,通过使用聚合函数和group by 子句,可以根据“商品种类”或者是“登记日期”等将表分割后再进行聚合
  • 聚合键中包含NULL时,在结果中会以“不确定”行的形式表现出来
  • 使用group by子句需要注意以下几点
    只能写在select子句之中
    group by子句不能使用select子句中列的别名
    group by子句的聚合结果是无序的
    where子句中不能使用聚合函数

group by子句

select <列名1>,<列名2>…
 from <表名>
 group by <列名1>,<列名2>…;

会把group by后面的列作为分组依据,分别获取出来对应的数据

group by子句一定要写在from语句之后,如果有where子句需要些在where子句之后

聚合函数与where子句的执行结果
select show_name 
from stds
where show_id = 3
group by show_class
三、为聚合结果指定条件(having)
  • 使用count函数等对表中的数据进行聚合操作时,为其制定条件的不是where子句,而是having子句
  • 聚合函数可以在select子句、having子句和order by子句中使用
  • having 子句要写在group by子句之后
  • where子句用来制定数据行的条件,having子句用来指定分组的条件

having子句是为group by子句指定条件选定特定组的方法,where是指定记录行的条件,不能用来指定组的条件。

通过商品类进行聚合分组后的结果中,取出“包含数据的行数为2行”的组

select show_id ,count(*)
from stds 
group by show_calss
having count(*) = 2;

使用having子句时select语句的顺序
select—from----where----group by —having

四、对查询结果进行排序(order by)

通常情况下,从表格中抽取数据时,如果没有特别指定顺序,那么最终的排列顺序便是无序的,所以如果想要抽取出来的数据按照一定的顺序进行排序的话就可以使用order by子句

  • 使用order by子句对查询结果进行排序
  • 在order by子句中列名后面使用关键字asc可以进行升序排序,使用desc关键字可以进行降序排序
  • order by子句中可以指定多个排序项
  • 排序键中包含NULL时,会在开头或者末尾进行汇总
  • order by子句中可以使用select子句中定义的列的别名
  • order by子句中可以使用select子句中未出现的列或者聚合函数
  • order by子句中不能使用编号

order by子句语法

select <列名1>,<列名2>...
from <表名>
order by <列名1>,<列名2>...

无论哪种情况,order by子句都要写在select语句末尾,这是因为对数据进行排序操作时必须在结果即将返回时执行,order by子句书写的列名称为排序键

使用having 子句时select语句执行顺序如下:
select–from子句–where子句–group by子句–having 子句 --order by子句

指定升序或者降序
默认使用order by子句获取出来的数据是升序排序的,如果想要指定的数据降序或者是排序,可以添加上desc和asc关键字

select <列名1>,<列名2>...
from <表名>
order by <列名1>,<列名2>... desc/asc(降序/升序)

NULL的排列顺序

在前面我们学习过不能对NULL使用比较运算符,也就是说不能对NULL和数字进行排序,也不能与字符串和日期比较大小,,因此,对于含有NULL的列作为排序键时,NULL会在结果的开头或末尾汇总显示

在排序键中使用显示用别名

在前面介绍的group by中不能使用别名,但是在order by中是可以使用别名的,因此下面的语句是正确的

select show_id as id ,show_name as name
from stds
order by id

order by 子句可以使用的列

order by子句可以使用存在于表中,但是并不包含在select子句中的列

下满虽然show_class不存在select子句中,但是show_class存在于表格中,所以这个并不会出现错误

select show_id,show_name
from stds
order by show_class

除此之外,还可以使用聚合函数,以班级人数进行排序

select show_id,show_name
from stds
group by show_class
order by count(*)