# 1.汇总数据函数
1.AVG() -- 求平均值 我们可以求某个字段所有行的平均值,例如:
SELECT
AVG(prod_price)
FROM
products;
2
3
4
运行结果如下:
我们可以给平均值起一个名字,例如:
SELECT
AVG(prod_price) avg_price
FROM
products;
2
3
4
运行结果如下:
我们还可以对符合条件的行求平均值,例如:
SELECT
AVG(prod_price)
FROM
products
WHERE
vend_id = 'BRS01';
2
3
4
5
6
运行结果如下:
这里有两点要说明下:1.AVG() 会忽略列值为NULL的行。2.AVG()只能用来确定特定数值列的平均值。
2.COUNT() -- 计数 我们使用COUNT()函数进行计数。 COUNT() 函数有两种使用方式: (1). 使用 COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。 (2). 使用 COUNT(column)对特定列中具有值的行进行计数,忽略 NULL 值。 例如:
SELECT
COUNT(*)
FROM
customers;
2
3
4
运行结果如下:
SELECT
COUNT(cust_email)
FROM
customers;
2
3
4
运行结果如下:
如果指定列名,则 COUNT()函数会忽略指定列的值为 NULL 的行,但如果COUNT()函数中用的是星号(*),则不忽略。
3.MAX() -- 求最大值
SELECT
MAX(prod_price)
FROM
products;
2
3
4
运行结果如下:
4.MIN() -- 求最小值
SELECT
MIN(prod_price)
FROM
products;
2
3
4
运行结果如下:
MAX(),MIN()函数会忽略值为NULL的行。
5.SUM() -- 求和
# 所有订单的金额之和。
SELECT
SUM(quantity * item_price)
FROM
orderitems;
2
3
4
5
运行结果如下:
汇总函数用来汇总数据,这些函数都很高效,一般比自己在程序中计算要快得多,所以能用汇总函数解决的我们就不要自己在程序中计算。
# 2.分组
假设我们要求每个供应商的商品价格的平均值,如果一个供应商一个供应商的计算,显然过于麻烦。这时候我们可以使用GROUP BY子句。
SELECT
vend_id,
AVG(prod_price)
FROM
products
GROUP BY
vend_id;
2
3
4
5
6
7
运行结果如下:
在使用 GROUP BY 时,除计算语句外,SELECT 语句中的每一列都必须在 GROUP BY 子句中给出。GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前。
像对行进行过滤一样,我们也可以对分组进行过滤。与过滤行不同的是,过滤分组不能使用 WHERE 子句,因为 WHERE 子句没有分组的概念,我们可以使用另外一个子句 HAVING。WHERE 用来过滤行,HAVING 用来过滤分组。WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。 例如:
# 每个供应商供应商品的平均价格。
SELECT
vend_id,
AVG(prod_price) AS avg_price
FROM
products
GROUP BY
vend_id;
2
3
4
5
6
7
8
运行结果如下:
使用 having 进行过滤
# 使用 having 进行过滤
SELECT
vend_id,
AVG(prod_price) AS avg_price
FROM
products
GROUP BY
vend_id
HAVING
avg_price > 5;
2
3
4
5
6
7
8
9
10
运行结果如下:
# 每个供应商的商品数
SELECT
vend_id,
count(*)
FROM
products
GROUP BY
vend_id;
2
3
4
5
6
7
8
运行结果如下:
每个供应商商品价格的最大值
# 每个供应商商品价格的最大值
SELECT
vend_id,
MAX(prod_price)
FROM
products
GROUP BY
vend_id;
2
3
4
5
6
7
8
运行结果如下:
每个供应商商品价格的最小值
# 每个供应商商品价格的最小值
SELECT
vend_id,
MIN(prod_price)
FROM
products
GROUP BY
vend_id;
2
3
4
5
6
7
8
运行结果如下:
每个订单的金额
# 每个订单的金额
SELECT
order_num,
SUM(quantity * item_price)
FROM
orderitems
GROUP BY order_num;
2
3
4
5
6
7
运行结果如下:
#SQL 子句的顺序
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
2
3
4
5
6
7
小结:
# 3.课后题
下列哪一个函数可以求平均值?
A. COUNT()
B. MAX()
C. AVG()
D. SUM()