MySQL 如何在MySQL中使用带FROM子句的子查询?

MySQL 如何在MySQL中使用带FROM子句的子查询?

在MySQL中,子查询是指在一个查询内部嵌套另一个查询,从嵌套的查询中检索出所需要的数据。而在使用子查询时,带FROM子句的子查询是其中一种非常常见的形式。本文将会详解如何在MySQL中使用带FROM子句的子查询。

阅读更多:MySQL 教程

什么是带FROM子句的子查询?

带FROM子句的子查询是指嵌套在FROM子句中的SELECT查询。它在MySQL中的语法是这样的:

SELECT …
FROM (SELECT …
            FROM …
            WHERE …) AS alias
WHERE …;

其中,内部的SELECT查询返回一个数据集,外部的SELECT查询使用这个数据集来进行比较筛选,并给这个数据集起了一个别名。

下面我们来看一些具体的示例。

示例

示例1 – 使用带FROM子句的子查询进行子总计算

我们有一个数据库表格,其中记录了不同人在不同工作日中的所工作的小时数。我们想要查询每个人工作的总时间,以及所有人工作的总时间。如何在MySQL中完成这个任务?

首先我们需要创建一个测试数据表:

CREATE TABLE work_hours (
    name VARCHAR(50),
    work_date DATE,
    hours FLOAT
);

然后插入一些数据:

INSERT INTO work_hours VALUES
('Alice', '2022-01-01', 8),
('Alice', '2022-01-02', 6),
('Bob', '2022-01-01', 7),
('Bob', '2022-01-03', 5),
('Charlie', '2022-01-02', 6),
('Charlie', '2022-01-03', 8);

其中,每条记录包括“姓名”、“工作日期”和“工作小时数”三个字段。

接下来,我们使用一个带FROM子句的子查询来查询每个人工作的总时间和所有人工作的总时间。代码如下:

SELECT 
    name, 
    SUM(hours) AS total_hours,
    (SELECT SUM(hours) FROM work_hours) AS all_hours
FROM work_hours
GROUP BY name;

结果会显示:

+---------+-------------+----------+
| name    | total_hours | all_hours|
+---------+-------------+----------+
| Alice   |          14 |       40 |
| Bob     |          12 |       40 |
| Charlie |          14 |       40 |
+---------+-------------+----------+

其中,第一列是姓名,第二列是每个人工作的总时间,第三列是所有人工作的总时间。

代码解释:

  • 外部的SELECT查询从work_hours表格中检索记录,并将每个姓名以及每个姓名的总工作时间返回;
  • 我们使用了GROUP BY子句来对结果进行分组,以便能够得到每个姓名的总工作时间;
  • 内部的SELECT查询从work_hours表格中检索记录,并将所有人的工作时间进行求和。

示例2 – 使用带FROM子句的子查询来查询关联表格

我们有两个数据库表格,一个记录了网站中的文章,另一个记录了用户对这些文章的评论。我们想要查询每篇文章的评论总数。如何在MySQL中完成这个任务?

我们可以使用一个带FROM子句的子查询,来查询每篇文章的评论总数:

SELECT 
    articles.title AS article_title, 
    (SELECT COUNT(*) FROM comments WHERE comments.article_id = articles.id) AS comment_count
FROM articles;

这个查询会查询出所有的文章,并显示每篇文章的标题以及评论总数。如果某篇文章没有任何评论,则评论总数为0。

示例3 – 使用带FROM子句的子查询来查询最新评论

我们有两个数据库表格,一个记录了网站中的文章,另一个记录了用户对这些文章的评论。我们想要查询每篇文章的最新评论。如何在MySQL中完成这个任务?

我们可以使用一个带FROM子句的子查询,来查询每篇文章的最新评论时间以及评论内容。代码如下:

SELECT 
    articles.title AS article_title,
    (SELECT MAX(comments.created_at) FROM comments WHERE comments.article_id = articles.id) AS latest_comment_time,
    (SELECT comments.content FROM comments WHERE comments.created_at = latest_comment_time AND comments.article_id = articles.id) AS latest_comment
FROM articles;

这个查询会查询出所有的文章,并显示每篇文章的标题、最新评论时间以及最新评论内容。

代码解释:

  • 外部的SELECT查询从articles表格中检索记录,并将每篇文章的标题返回;
  • 我们使用两个带FROM子句的子查询来查询每篇文章的最新评论时间以及最新评论内容;
  • 子查询1返回某篇文章的最新评论时间,并给它起了一个别名latest_comment_time;
  • 子查询2返回某篇文章的最新评论内容,并只查询出那些评论时间等于latest_comment_time的评论;
  • 我们使用了WHERE子句来过滤具有特定文章id的评论。

结论

在MySQL中使用带FROM子句的子查询可以帮助我们方便地进行多种多样的查询。无论是计算总和还是查询关联表格,都可以使用带FROM子句的子查询来完成。因此,熟练地掌握这种查询方式将会是每个MySQL开发人员的必备技能之一。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程