📜  SQL | From 子句中的子查询(1)

📅  最后修改于: 2023-12-03 14:47:36.627000             🧑  作者: Mango

SQL | From 子句中的子查询

概述

在 SQL 中,子查询(Subquery)是指在主查询中嵌套的另一个查询语句。常见的使用场景是在 FROM 子句中使用子查询来生成虚表(Derived Table)。

在本篇文章中,我们将介绍在 FROM 子句中使用子查询的语法、使用示例以及注意事项。

语法

在 FROM 子句中使用子查询的语法如下:

SELECT [列名1], [列名2], ..., [列名N]
FROM (SELECT [列名1], [列名2], ..., [列名N] FROM [表名] WHERE [条件]) AS [虚表名]

其中,子查询的语法为:

SELECT [列名1], [列名2], ..., [列名N] FROM [表名] WHERE [条件]
使用示例

我们通过一个使用示例来理解在 FROM 子句中使用子查询的用法。假设我们有两个表,一个是学生表,一个是成绩表。学生表中包含学生的姓名和学号,成绩表中包含学生的学号、课程名称和分数。

我们现在需要从这两个表中查询出所有每个学生的平均分,并按照平均分从高到低排序。我们可以使用以下 SQL 语句:

SELECT 学生表.姓名, AVG(成绩表.分数) AS 平均分
FROM 学生表, (SELECT 学号, 课程名称, 分数 FROM 成绩表) AS 成绩表
WHERE 学生表.学号 = 成绩表.学号
GROUP BY 学生表.姓名
ORDER BY 平均分 DESC;

这里的子查询为 (SELECT 学号, 课程名称, 分数 FROM 成绩表),我们在 FROM 子句中使用这个子查询生成了一个虚表 成绩表。在主查询中,我们通过 WHERE 学生表.学号 = 成绩表.学号 将学生表和成绩表联接起来。

最终,我们得到了每个学生的平均分,并按照平均分从高到低排序的结果。

注意事项

在使用子查询时,需要注意以下几点:

  • 子查询中的 SELECT 语句必须返回一个结果集;
  • 子查询中的 WHERE 子句可以使用主查询中的列或者子查询中的列;
  • 子查询中的列不能用于主查询中的列进行运算,例如不能使用 SELECT (SELECT COUNT(*) FROM 表名) + 1 FROM 表名
  • 子查询中的 LIMIT 子句只会影响子查询的结果,不会影响主查询的结果。
总结

在 FROM 子句中使用子查询是 SQL 中常见的语法。我们可以使用这种语法生成虚表,并在主查询中使用联接等操作来得到我们想要的结果。然而,在使用子查询时需要注意返回的结果集、子查询中的列以及 LIMIT 子句等问题。