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:谢谢,这正是我的想法;)想象:你进入迷宫,在路上——不像忒修斯——你斩断了线。不要指望安全地出来。