MySQL 中的派生表

2022年 7月 15日 54点热度 0人点赞 0条评论

file

引言

在 MySQL 源码中经常提到 derived table, 但是一直不太清楚 derived table 到底是个什么东西, 这里特地学一下. 这篇博客讲了派生表是什么, 派生表和临时表的区别, 派生表的使用以及注意事项, 可以帮助我们写 SQL 的时候清楚自己在干啥. 最后研究下了 MySQL 源码中是如何处理派生表的.

如有错误之处请不吝指出.

原文地址: https://blog.duhbb.com/2022/07/15/derived-tables-in-mysql/

欢迎访问我的博客: https://blog.duhbb.com/

MySQL 派生表

MySQL 中的派生表是从 SELECT...FROM 语句返回的虚拟表. 也就是说, 它是一个表达式, 在 SELECT 语句的 FROM 子句范围内生成一个表. 这个概念类似于 临时表. 但是, 派生表比临时表更简单, 因为不需要使用创建临时表所需的所有步骤.

大多数开发人员交替使用术语 派生表子查询. 因此, 我们可以说, 当我们在 SELECT...FROM 子句中使用子查询时, 它被称为派生表.

句法

以下是在 MySQL 中使用派生表的语法

SELECT  ...  FROM  (subquery) [ AS ] table_name (column_list)  WHERE condition;

需要注意的是, 独立子查询是一个子查询, 可以独立于包含该查询的语句执行.

我们还应该考虑派生表必须包含别名表名称, 以便我们稍后在语句中引用它的名称. 如果我们不为派生表提供别名,MySQL 将发出以下错误消息:

Every derived table must have its own alias.

派生表的每一列也必须具有唯一的名称. 让我们在下图的帮助下理解它.

首先, 我们将使用以下语句创建一个表:

CREATE TABLE test1 (s1 INT, s2 CHAR(5), s3 FLOAT);

接下来, 使用以下语句将一些记录填充到此表中:

INSERT INTO  test1  VALUES  (1,  'A' , 10.0), (2,  'B' , 20.0), (3,  'C' , 30.0);

现在, 执行以下语句以了解我们如何在 FROM 子句中使用子查询

SELECT sb1, sb2, sb3
  FROM (SELECT s1 AS sb1, s2 AS sb2, s3*5 AS sb3 FROM test1) AS test1_set
  WHERE sb1 < 4;

让我们再举一个例子, 我们将获得浮点值列的平均值. 执行以下语句:

SELECT AVG(sum_float)
  FROM (SELECT SUM(s3) AS sum_float FROM test1 GROUP BY s1) AS totals;

在上面的语句中, 派生表计算浮点列的总和, 然后从外部查询返回平均值.

限制

MySQL 中的派生表有以下限制:

  • MySQL 不使用相关子查询作为派生表.
  • MySQL 不允许派生表使用对同一 SELECT 语句的其他表的引用.
  • 我们不能在派生表中使用外部引用.

截止到此的内容均翻译和整理自: MySQL Derived Table

MySQL 官方文档

https://dev.mysql.com/doc/refman/8.0/en/derived-tables.html

源码

原文地址: https://blog.duhbb.com/2022/07/15/derived-tables-in-mysql/

欢迎访问我的博客: https://blog.duhbb.com/

本文来自:https://blog.duhbb.com

本文链接地址:MySQL 中的派生表,英雄不问来路,转载请注明出处,谢谢。

有话想说:那就赶紧去给我留言吧。

rainbow

这个人很懒,什么都没留下

文章评论