title: mysql必知必会第12章
date: 2021-07-11 09:56:13
tags:
一、聚集函数
我们经常需要汇总数据而不用把它们实际检索出来,为此mysql提供了专门的函数。如果返回实际数据,不仅效率低,还浪费处理资源,带宽资源。
另外:这些函数是高效设计的,一般比你在客户机应用程序中计算的块,所以合理利用。
mysql常用的5个聚集函数(运行在行组上,计算和返回单个值的函数)
1.avg()
```sql
select avg(prod_price) from products;
+-----------------+
| avg(prod_price) |
+-----------------+
| 16.133571 |
+-----------------+
//tips:1、只能用来确定特定数值列的平均值,且必须以列名作为参数。
(但其实参数随便传一个非数值类型但列进去也有数据,但这没意义。)
//2、为了获得多列的平均值,必须使用多个avg函数。
//3、avg函数忽略列值为null的行
```
2.count()
有2种使用方式:
// 第一种:使用count(*)对表(即对所有列)中行的数目进行计数,不管表列中包含的是空值(null)还是非空值。
select count(*) from customers;
+----------+
| count(*) |
+----------+
| 5 |
+----------+
//第二种:使用count(列名)对特定列中具有值的行进行计数,忽略null值。
select count(cust_email) from customers
+-------------------+
| count(cust_email) |
+-------------------+
| 3 |
+-------------------+
mysql> select cust_email from customers;
+---------------------+
| cust_email |
+---------------------+
| ylee@coyote.com |
| NULL |
| rabbit@wascally.com |
| sam@yosemite.com |
| NULL |
+---------------------+
3,4.max()和min()
max()返回指定列中的最大值,要求指定列名。
min()返回指定列中的最小值,要求指定列名。
tips:
- 2个函数都可以对非数值的数据列进行使用,对文本数据列使用时,如果是按照默认的升序排列数据,则max()返回的是最后一行数据。min()则相反。
- 2个函数都忽略列值为null的行。
//遇到了有趣的事情:
select min(prod_price) as prod_price from products;'
+------------+
| prod_price |
+------------+
| 2.50 |
+------------+
1 row in set (0.00 sec)
'> sjdj
'> ;
'> ;
'> n;
'> bye;
'> quit;
'> '
-> ';
'> ';
//最后发现输入 '; 按回车又回来了 mysql> 这种。
5、sum()
sum()函数用来返回指定列值的和(总计)
select sum(quantity) from orderitems where order_num=20005;
+---------------+
| sum(quantity) |
+---------------+
| 19 |
+---------------+
//还可以在里面进行运算。其实所有聚集函数都可以。
select sum(quantity*item_price) from orderitems where order_num=20005;
+--------------------------+
| sum(quantity*item_price) |
+--------------------------+
| 149.87 |
+--------------------------+
聚集不同值
distinct是去重,all是默认的不去重
//计算去重后的数据的均值
mysql> select avg(distinct prod_price) from products where vend_id=1003;
+--------------------------+
| avg(distinct prod_price) |
+--------------------------+
| 15.998000 |
+--------------------------+
//计算数据的均值后再去重,但此时算完后数据行只有一条,去个毛线,所以这个distinct在此条sql中相当于没效果。
mysql> select distinct avg(prod_price) from products where vend_id=1003;
+-----------------+
| avg(prod_price) |
+-----------------+
| 13.212857 |
+-----------------+
select avg( prod_price) from products where vend_id=1003;
+------------------+
| avg( prod_price) |
+------------------+
| 13.212857 |
+------------------+
tips:
distinct不能用于count(*)
不能用于计算或表达式
distinct用在max()、min()中没意义