使用MYSQL Union 查出多行转一行

在实际的数据库操作中,有时候我们会遇到需要将多行数据合并成一行的情况,这时可以使用MYSQL的Union语句来实现。本文将介绍如何使用Union语句实现多行数据转一行,并给出具体的代码示例。

什么是Union语句

Union语句用于合并两个或多个SELECT语句的结果集,并去重。当我们有多个查询结果需要合并时,可以使用Union语句将它们合并成一个结果集。

如何使用Union查出多行转一行

下面以一个简单的例子来说明如何使用Union语句将多行数据转换成一行数据。假设我们有一个学生表和一个成绩表,学生表包含学生的基本信息,成绩表包含学生的各科成绩。现在我们要查询每个学生的姓名和各科成绩,并将其合并成一行数据。

创建示例表

首先我们需要创建示例表,包括学生表和成绩表。

-- 创建学生表
CREATE TABLE students (
    id INT,
    name VARCHAR(50)
);

-- 插入数据
INSERT INTO students (id, name) VALUES (1, 'Alice');
INSERT INTO students (id, name) VALUES (2, 'Bob');

-- 创建成绩表
CREATE TABLE scores (
    student_id INT,
    subject VARCHAR(50),
    score INT
);

-- 插入数据
INSERT INTO scores (student_id, subject, score) VALUES (1, 'Math', 90);
INSERT INTO scores (student_id, subject, score) VALUES (1, 'English', 85);
INSERT INTO scores (student_id, subject, score) VALUES (2, 'Math', 88);
INSERT INTO scores (student_id, subject, score) VALUES (2, 'English', 92);

使用Union语句查询多行转一行

接下来我们使用Union语句查询多行转一行的数据。

SELECT
    s.name,
    GROUP_CONCAT(
        CONCAT(subject, ':', score)
        ORDER BY subject
        SEPARATOR ', '
    ) AS scores
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.id;

在上面的查询语句中,我们使用GROUP_CONCAT函数将每个学生的各科成绩合并成一行,并使用ORDER BY控制成绩的顺序,使用SEPARATOR指定每个成绩之间的分隔符。最后使用GROUP BY将结果按学生分组。

总结

通过上面的示例,我们可以看到如何使用Union语句查出多行转一行的数据。在实际应用中,可以根据具体的需求和数据结构进行调整和优化。希望本文对你有所帮助。


gantt
    title 使用Union查出多行转一行示例
    section 创建示例表
    创建表结构和插入数据: done, 2022-10-01, 1d
    section 使用Union语句查询多行转一行
    查询并合并数据: done, 2022-10-02, 1d