使用的是MySQL数据库
1. 聚合函数 实现汇总数据查询
聚合函数是数据库内置函数中的一部分,其取系列值并聚合它们,导出一个单一值。 聚合函数只运行非空值。 WHERE子句中无法使用聚合函数。
SELECT
MAX ( invoice_total) AS highest,
MIN ( invoice_total) AS lowest,
AVG ( invoice_total) AS average,
SUM ( invoice_total * 1.1 ) AS total,
COUNT ( DISTINCT client_id) AS count_of_clients
FROM invoices
SELECT
'First half of 2019' AS date_range,
SUM ( invoice_total) AS total_sales,
SUM ( payment_total) AS total_payments,
SUM ( invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE invoice_date BETWEEN '2019-01-01' AND '2019-06-30'
2. GROUP BY 子句
SELECT
client_id,
SUM ( invoice_total) AS total_sales
FROM invoices
WHERE invoice_date > '2019-07-01'
GROUP BY client_id
ORDER BY total_sales DESC ;
SELECT
state,
city,
SUM ( invoice_total) AS total_sales
FROM invoices
JOIN clients USING ( client_id)
GROUP BY state, city;
3. HAVING 子句
HAVING子句和WHERE子句的区别: (1)HAVING子句可以在分组之后筛选数据;(2)且只能使用SELECT子句中出现的列(指表中真实存在的数据列);(3)HAVING子句中可以直接使用聚合函数,即使该聚合函数没有存在于SELECT子句中;(4)HAVING子句针对的是分组。 (1)WHERE子句只能在分组之前筛选数据;(2)可以使用任何列;(3)WHERE子句不能使用聚合函数;(4)WHERE子句针对的是行。
SELECT
client_id,
SUM ( invoice_total) AS total_sales,
COUNT ( * ) AS number_of_invoices
FROM invoices
GROUP BY client_id
HAVING total_sales > 500
AND number_of_invoices > 5
SELECT
c. customer_id,
c. first_name,
c. last_name,
state,
SUM ( ci. quantity* ci. unit_price) AS total_spent
FROM customers c
JOIN orders o
USING ( customer_id)
JOIN order_items ci
USING ( order_id)
WHERE state = 'VA'
GROUP BY c. customer_id,
c. first_name,
c. last_name
HAVING total_spent > 100
4. ROLLUP 运算符 WITH ROLLUP(MySQL特有)
在GROUP BY子句最后添加WITH ROLLUP,且添加ROLLUP运算符,分组的列名不可以用别名。 ROLLUP运算符只能应用于聚合值的列。 在现实工作中应用广泛,但不是标准的SQL语言,只有MySQL独有。
SELECT
client_id,
SUM ( invoice_total) AS total_sales
FROM invoices
GROUP BY client_id WITH ROLLUP
SELECT
state,
city,
SUM ( invoice_total) AS total_sales
FROM invoices
JOIN clients USING ( client_id)
GROUP BY state,
city WITH ROLLUP
SELECT
pm. name AS payment_method,
SUM ( p. amount) AS total
FROM payment_methods pm
JOIN payments p
ON ( pm. payment_method_id = p. payment_method)
GROUP BY pm. name WITH ROLLUP ;