引言
在 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/
本文链接地址:MySQL 中的派生表,英雄不问来路,转载请注明出处,谢谢。
有话想说:那就赶紧去给我留言吧。
文章评论