我想知道为什么像 select * as t
这样的语句会出现在 mysql 子查询中,如下所示。
下面根据 created_time
列删除表中最旧的 3 行。
为什么这样说
DELETE FROM mytable WHERE id = ANY
( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3')as t)
不是
DELETE FROM mytable WHERE id = ANY
(SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3)
?
对我来说,第二种形式是有道理的。它不起作用,我想了解为什么第一个是必要的。具体来说,t
是什么,as t
有什么作用?
最佳答案
在许多数据库中,from
子句中的子查询需要有一个明确的别名。 as
是可选的。我通常对列使用 as
而对表不使用它:
DELETE FROM mytable
WHERE id = ANY ( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3') t)
为什么需要子查询是 MySQL 的变幻莫测。它不允许 delete
或 update
中的表引用出现在子查询子句中。哦,它确实允许在子查询内的子查询子句中使用它。因此,很容易解决此限制。
关于Mysql 子查询语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14963031/