mysql基础进阶——数据汇总

199 阅读2分钟

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