1.聚合函数
说明:
用户在使用查询语句时经常要做一些简单的计算,例如要求符合某一查询要求的记录数,求某个关系中所有记录在某属性上的总和或平均值等。为了方便就需要用到聚合函数。
MySQL聚合函数
| 函数名 | 功能 |
|---|---|
| AVG() | 求平均值 |
| COUNT() | 对列计数 |
| MAX() | 求最大值 |
| MIN() | 求最小值 |
| SUM() | 求总和 |
注意:
- 只运行非空数值,如果列中有空值 它不会被算在函数里
- 如果指定DISTINCT短语,则表示在计算时要取消指定列的重复值,不指定DISTINCT或者指定ALL(默认值),则表示不取消重复值。
实例:
SELECT
MAX(invoice_total) AS highest,
MIN(invoice_total) AS lowest,
AVG(invoice_total) AS average,
SUM(invoice_total) AS total,
COUNT(invoice_total) AS number_of_invoices,
-- 查看存在空值的返回记录
COUNT(payment_date) AS count_of_paymentd,
-- 如果想得到表格中所有记录条目,不管是不是空值
COUNT(*) AS total_records,
COUNT(client_id) AS client_id,
-- 去除重复记录
COUNT(DISTINCT client_id) AS dis_asclient_id
FROM invoices
2.GROUP BY子句
说明: GROUP BY子句将查询结果按某一列或者多行的值分组,值相同的为一组。
目的: 为了细化聚合函数的作用对象。如果未对查询结果分组,聚合函数将作用整个查询结果。
实例:
-- 在发票记录表中按不同顾客分组统计总销售额
SELECT
client_id,
SUM(invoice_total) AS total_sales
FROM invoices
GROUP BY client_id
3.HAVING子句
HAVING 和 WHERE 都是是条件筛选语句,条件的写法相通,数学、比较(包括特殊比较)、逻辑运算都可以用(如 AND、REGEXP 等等)
两者区别:
- HAVING是在分组后对数据进行过滤
- WHERE是在分组前对数据进行过滤
- HAVING后面可以使用聚合函数
- WHERE后面不可以使用聚合函数
实例:
-- 筛选出总发票金额大于500的顾客
SELECT
client_id,
SUM(invoice_total) AS total_sales
FROM invoices
GROUP BY client_id
HAVING total_sales > 500
4.ROLLUP运算符
说明: GROUP BY …… WITH ROLL UP 自动汇总型分组,若是多字段分组的话汇总也会是多层次的,注意这是MySQL扩展语法,不是SQL标准语法
实例:
-- 分组查询各州、市的总销售额(发票总额)以及州层次和全国层次的两个层次的汇总额
SELECT
state,
city,
client_id,
SUM(invoice_total) AS total_sales
FROM invoices i
JOIN clients c USING (client_id)
GROUP BY client_id WITH ROLLUP