Mysql子查询语法

Mysql子查询语法,mysql,sql,syntax,subquery,Mysql,Sql,Syntax,Subquery,我想知道为什么像select*ast这样的语句出现在mysql子查询中,如下所示 下面将根据创建时间列删除表中最早的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 mytab

我想知道为什么像
select*ast
这样的语句出现在mysql子查询中,如下所示

下面将根据创建时间列删除表中最早的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
以及
作为t
做什么?

在许多数据库中,
from
子句中的子查询需要有一个明确的别名。
as
是可选的。我通常将
用作列的
,而将其保留在表中:

DELETE FROM mytable
    WHERE id = ANY ( SELECT * FROM ( SELECT id FROM mytable ORDER BY created_time ASC LIMIT 3') t)

为什么需要子查询是MySQL的一大难题。它不允许子查询子句中出现
delete
update
中的表引用。哦,它确实允许它出现在subquery-in-a-subquery子句中。因此,绕过这个限制是非常容易的

这是一个愚蠢的MySQL限制。第二条语句适用于所有其他DBMS。尽管第一个被接受,我仍然记得它的一些问题。您不能在MySQL的子选择中使用要删除的表,您需要使用join@a_horse_with_no_name:此解决方案未按预期工作的示例:@ypercube:谢谢,这正是我的想法;)想象:你进入迷宫,在路上——不像忒修斯——你斩断了线。不要指望安全地出来。