单表和多表语法之间的区别?

时间:2015-01-17 22:18:19

标签: mysql sql syntax

我试图了解MYSQL如何确定单表和多表语法,但我无法找到此信息。 documentation解释了MYSQL如何处理这两者,但它并没有解释是什么决定了它们。

文档说:

  

您可以在DELETE语句中指定多个表来删除行   来自一个或多个表,取决于特定条件   WHERE子句。但是,您不能在a中使用ORDER BY或LIMIT   多表DELETE。

以此查询为例:

DELETE table FROM table
INNER JOIN other ON other.column = table.column
WHERE other.column2 = ?
LIMIT 1

这是单个还是多个表语法?有一个JOIN,所以你可以倾向于多个,但它只能从一个表中删除。我怀疑的是,确定多个WHERE子句用于多个表时。如果您可以在答案中包含两者的示例,那将非常感激!

编辑:
我问这个问题是因为在使用DELETE执行某些LIMIT查询时出现错误,您无法使用LIMIT多表语法。

编辑#2: 简而言之,如果要在ORDER BY查询中加入表格,则无法使用LIMITDELETE

2 个答案:

答案 0 :(得分:1)

MySQL's documentation states the following

关于"单表" synatax:

  

如果指定了ORDER BY子句,则按指定的顺序删除行。 LIMIT子句限制了可以删除的行数。

关于"多表"语法:

  

对于多表语法,DELETE从每个tbl_name中删除满足条件的行。在这种情况下,不能使用ORDER BY和LIMIT。


有些测试揭示了ORDER BY限制的问题。

这是一个有效的单表DELETE语句ORDER BY

DELETE FROM table
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2

对于另一个表使用显式连接条件的类似查询导致ORDER BY上的语法错误,尽管只有一个表被删除:

DELETE table1 
FROM table1 JOIN table2 ON table1.id = table2.id
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2
  

您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以获得正确的语法,以便在时间戳限制2' ORDER BY timestamp LIMIT 2'在第1行

使用隐式连接指定相同的查询失败的方式相同

DELETE table1 
FROM table1, table2
WHERE
  table1.id = table2.id
  AND somecol = 'someval'
ORDER BY timestamp LIMIT 2
  

您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以获得正确的语法,以便在时间戳限制2' ORDER BY timestamp LIMIT 2'在第1行

在联接(多表)语句中删除DELETE之后没有表进行删除,因此它看起来更像单表语法也是语法错误

DELETE /* no table named here */
FROM table1 JOIN table2 ON table1.id = table2.id
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2
  

您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在#< WHERE somecol附近使用正确的语法

它是DELETE子句中指定的表:

最后,使用只有一个表,但使用多表语法(在DELETE关键字后面命名一个表)允许{{ 1}},所以这里的真正识别差异似乎是在ORDER BY子句中命名的表,以区分多表和单表:

此查询仅涉及一个表(没有连接),但会产生语法错误:

DELETE
  

您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以便在#OR; ORDER BY id LIMIT 1附近使用正确的语法

答案 1 :(得分:0)

如果您仅从1个表中指定DELETE并且JOIN语句中没有DELETE,那么它就是单表语法。否则,它是一个多表语法。我很确定这是doc页面的含义。

我认为这种解释的证据就是页面上写着:

  

table_references子句列出了连接中涉及的表。它的语法在第13.2.8.2节“JOIN语法”中描述。

请注意,在单表语法中没有table_references元素。