在进行MySQL查询时,我们有时候会遇到需要在同一条SQL语句中获取不同的结果集的情况。这种需求可能是由于业务需求复杂、数据分析需要多个视角等原因。在这种情况下,我们就需要使用MySQL中的UNION或者UNION ALL操作符来实现查询多个结果集并合并结果。

UNION和UNION ALL的区别

在使用UNION和UNION ALL时,需要了解它们之间的区别。UNION操作符用于合并两个或多个SELECT语句的结果集,并去除重复的行。而UNION ALL操作符也用于合并结果集,但不去除重复的行,保留所有的行。

接下来,我们通过一个示例来演示如何在同一条SQL语句中查出不同的结果。

示例

假设我们有一个学生表students,包含学生的姓名和成绩。我们需要查询不同科目的前三名学生。我们可以使用UNION ALL操作符来实现这个需求。

首先,我们创建students表并插入一些示例数据:

CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    subject VARCHAR(50),
    score INT
);

INSERT INTO students (name, subject, score) VALUES
('Alice', 'Math', 95),
('Bob', 'Math', 90),
('Charlie', 'Math', 85),
('Alice', 'English', 88),
('Bob', 'English', 92),
('Charlie', 'English', 80);

然后,我们可以使用以下SQL语句查询不同科目的前三名学生:

(SELECT name, subject, score
FROM students
WHERE subject = 'Math'
ORDER BY score DESC
LIMIT 3)
UNION ALL
(SELECT name, subject, score
FROM students
WHERE subject = 'English'
ORDER BY score DESC
LIMIT 3);

运行以上SQL语句,我们就可以得到不同科目的前三名学生的结果集。

饼状图示例

接下来,我们使用mermaid语法中的pie标识来展示不同科目的前三名学生成绩占比情况:

pie
    title Top 3 Students by Subject
    "Math" : 50
    "English" : 50

甘特图示例

同时,我们使用mermaid语法中的gantt标识来展示学生成绩分布情况:

gantt
    title Students' Scores Distribution
    section Math
    Alice : 95, 1, 10
    Bob : 90, 11, 20
    Charlie : 85, 21, 30

    section English
    Alice : 88, 1, 10
    Bob : 92, 11, 20
    Charlie : 80, 21, 30

通过以上示例,我们展示了如何在同一条SQL语句中查出不同的结果,并使用饼状图和甘特图来可视化展示数据。在实际应用中,我们可以根据具体需求灵活运用UNION或UNION ALL操作符来处理复杂的数据查询。MySQL的强大功能可以帮助我们更高效地处理各种数据分析和业务需求。