MySQL GROUP BY 和 GROUP_CONCAT 使用方法总结

GROUP BY 基本用法

  • 作用:将查询结果按指定列进行分组
  • 语法:SELECT column_list FROM table_name GROUP BY column_name
  • 注意事项:SELECT 子句中的非聚合列必须出现在 GROUP BY 子句中

GROUP_CONCAT 基本用法

  • 作用:将分组内的值连接成一个字符串
  • 语法:GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC]] [SEPARATOR str_val])
  • 默认分隔符:逗号 ,

具体示例及执行结果

示例1:基本 GROUP BY 分组统计
-- 创建示例表
CREATE TABLE `employees` (
    `department` VARCHAR(50),
    [name] VARCHAR(50),
    `salary` INT
);

INSERT INTO `employees` VALUES 
('IT', 'Alice', 8000),
('IT', 'Bob', 7500),
('HR', 'Charlie', 6000),
('HR', 'David', 6500),
('IT', 'Eve', 9000);

-- 按部门分组统计员工数量和平均工资
SELECT 
    `department`,
    COUNT(*) as employee_count,
    AVG(`salary`) as avg_salary
FROM `employees`
GROUP BY `department`;

执行结果:

department | employee_count | avg_salary
IT         | 3              | 8166.6667
HR         | 2              | 6250.0000
示例2:GROUP_CONCAT 基本用法
-- 按部门分组并连接员工姓名
SELECT 
    `department`,
    GROUP_CONCAT([name] as employees
FROM `employees`
GROUP BY `department`;

执行结果:

department | employees
IT         | Alice,Bob,Eve
HR         | Charlie,David
示例3:GROUP_CONCAT 高级用法
-- 使用 DISTINCT、ORDER BY 和自定义分隔符
SELECT 
    `department`,
    GROUP_CONCAT(DISTINCT [name] ORDER BY `salary` DESC SEPARATOR '; ') as employees_by_salary
FROM `employees`
GROUP BY `department`;

执行结果:

department | employees_by_salary
IT         | Eve; Alice; Bob
HR         | David; Charlie
示例4:设置 GROUP_CONCAT 最大长度
-- 查看当前最大长度设置
SELECT @@group_concat_max_len;

-- 设置最大长度并测试长字符串连接
SET SESSION group_concat_max_len = 1000;

关键特性说明

  • GROUP_CONCAT 默认受 group_concat_max_len 系统变量限制(默认1024字符)
  • 可以使用 DISTINCT 去除重复值
  • 支持 ORDER BY 对连接前的数据排序
  • 可通过 [SEPARATOR] 参数自定义分隔符

注意:以上内容由大模型生成,注意识别!

更多推荐