您好,登录后才能下订单哦!
# MySQL中的count()、union()和group by语句的用法
## 一、引言
MySQL作为最流行的开源关系型数据库之一,其强大的数据统计和聚合功能在实际开发中应用广泛。本文将深入探讨三个核心数据处理语句:`count()`聚合函数、`union()`集合操作以及`group by`分组语句。通过原理分析、语法详解和实战案例,帮助开发者掌握这些关键技术的应用场景和优化技巧。
## 二、count()函数详解
### 2.1 基本语法与功能
`count()`是MySQL中最常用的聚合函数,用于统计符合条件的记录数:
```sql
SELECT COUNT(expression) FROM table_name WHERE conditions;
COUNT(*)
统计所有行数(包含NULL值)
SELECT COUNT(*) FROM employees;
COUNT(1)
与COUNT(*)效率基本相同,统计所有行
SELECT COUNT(1) FROM employees WHERE department = 'IT';
COUNT(column_name)
统计特定列非NULL值的数量
SELECT COUNT(email) FROM users; -- 不统计NULL邮箱
COUNT(DISTINCT)
统计不重复值的数量
SELECT COUNT(DISTINCT department) FROM employees;
-- 使用覆盖索引优化
CREATE INDEX idx_department ON employees(department);
SELECT COUNT(department) FROM employees;
UNION
用于合并多个SELECT结果集:
SELECT column1 FROM table1
UNION [ALL]
SELECT column2 FROM table2;
特性 | UNION | UNION ALL |
---|---|---|
去重 | 是 | 否 |
排序 | 隐式 | 无 |
性能 | 较慢 | 更快 |
场景:合并不同年份的销售数据
-- 基础用法(自动去重)
SELECT product_id FROM sales_2022
UNION
SELECT product_id FROM sales_2023;
-- 保留所有记录(包括重复)
SELECT order_id, amount FROM online_orders
UNION ALL
SELECT order_id, amount FROM offline_orders;
-- 错误示例:列数不匹配
SELECT id, name FROM users
UNION
SELECT id FROM products;
SELECT column1, aggregate_function(column2)
FROM table
GROUP BY column1;
数据分类汇总
SELECT department, COUNT(*) as emp_count
FROM employees
GROUP BY department;
多列分组
SELECT department, gender, AVG(salary)
FROM employees
GROUP BY department, gender;
配合HAVING筛选
SELECT product_type, SUM(sales)
FROM orders
GROUP BY product_type
HAVING SUM(sales) > 10000;
聚合函数 | 描述 | 示例 |
---|---|---|
SUM() | 求和 | SUM(revenue) |
AVG() | 平均值 | AVG(score) |
MAX() | 最大值 | MAX(temperature) |
MIN() | 最小值 | MIN(price) |
GROUP_CONCAT() | 连接字符串 | GROUP_CONCAT(username) |
索引优化:为GROUP BY列创建索引
ALTER TABLE orders ADD INDEX idx_category(category);
减少分组列:只选择必要的分组字段
使用WHERE先过滤:减少处理数据量
控制结果集大小:合理使用LIMIT
-- 统计各部门不同性别员工数和平均工资
SELECT
department,
gender,
COUNT(*) AS employee_count,
AVG(salary) AS avg_salary,
MAX(salary) AS max_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department, gender
HAVING COUNT(*) > 3
ORDER BY avg_salary DESC;
-- 合并线上线下订单统计
SELECT
'Online' AS channel,
product_category,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM online_orders
GROUP BY product_category
UNION ALL
SELECT
'Offline' AS channel,
product_category,
COUNT(*),
SUM(amount)
FROM offline_orders
GROUP BY product_category
ORDER BY channel, total_amount DESC;
-- 测试不同COUNT写法性能
EXPLN ANALYZE SELECT COUNT(*) FROM large_table;
EXPLN ANALYZE SELECT COUNT(1) FROM large_table;
EXPLN ANALYZE SELECT COUNT(id) FROM large_table;
问题现象:COUNT(DISTINCT)返回异常值
解决方案:
-- 检查数据完整性
SELECT COUNT(*), COUNT(DISTINCT column) FROM table;
-- 对于大表考虑使用近似统计
SELECT TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'large_table';
优化方案: 1. 使用UNION ALL替代UNION(如无需去重) 2. 为各SELECT语句单独优化 3. 添加适当的索引
-- 优化前
SELECT * FROM table1 WHERE condition1
UNION
SELECT * FROM table2 WHERE condition2;
-- 优化后
SELECT * FROM table1 WHERE condition1 AND indexed_column = value
UNION ALL
SELECT * FROM table2 WHERE condition2 AND indexed_column = value;
强制排序方案:
SELECT department, COUNT(*)
FROM employees
GROUP BY department
ORDER BY COUNT(*) DESC;
SELECT
department,
gender,
COUNT(*) AS count
FROM employees
GROUP BY department, gender WITH ROLLUP;
SELECT
department,
name,
salary,
COUNT(*) OVER (PARTITION BY department) AS dept_count
FROM employees;
SET @group_by = 'department';
SET @sql = CONCAT('SELECT ', @group_by, ', COUNT(*) FROM employees GROUP BY ', @group_by);
PREPARE stmt FROM @sql;
EXECUTE stmt;
COUNT()选择:
UNION准则:
GROUP BY优化:
通过灵活组合这三个强大的功能,可以解决MySQL中绝大多数数据统计和分析需求。建议在实际应用中根据数据特性和业务需求选择最佳实现方式。
附录:相关官方文档参考
- MySQL COUNT() Function
- UNION Syntax
- GROUP BY Modifiers
“`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。