首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单表和多表语法的区别?

问单表和多表语法的区别?
EN

Stack Overflow用户
提问于 2015-01-17 22:18:19
回答 2查看 2.9K关注 0票数 2

我试图了解MYSQL是如何确定单表和多表语法的,但我找不到这些信息。文档解释了MYSQL如何处理这两者,但它没有解释是什么决定了两者。

文件上说:

可以在DELETE语句中指定多个表,以便根据WHERE子句中的特定条件从一个或多个表中删除行。但是,不能在多表删除中使用ORDER或ORDER.

以这个查询为例:

代码语言:javascript
复制
DELETE table FROM table
INNER JOIN other ON other.column = table.column
WHERE other.column2 = ?
LIMIT 1

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

编辑:

我之所以问这个问题,是因为当使用DELETE执行特定的LIMIT查询时,会出现一个错误,您不能在多个表语法中使用LIMIT。

简单地说,编辑2:,如果要在DELETE查询中连接表,则不能使用ORDER BY或LIMIT。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-17 22:57:32

MySQL的文档声明如下

关于“单表”synatax:

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

关于“多表”语法:

对于多表语法,删除每个tbl_name中符合条件的行。在这种情况下,不能使用。

一些测试揭示了ORDER BY的局限性。

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

代码语言:javascript
复制
DELETE FROM table
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2

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

代码语言:javascript
复制
DELETE table1 
FROM table1 JOIN table2 ON table1.id = table2.id
WHERE somecol = 'someval'
ORDER BY timestamp LIMIT 2

您的SQL语法出现了错误;请检查与您的MariaDB服务器版本相对应的手册,以便在第1行使用接近“按时间戳限制2顺序”的语法。

使用隐式联接指定相同查询的方式相同。

代码语言:javascript
复制
DELETE table1 
FROM table1, table2
WHERE
  table1.id = table2.id
  AND somecol = 'someval'
ORDER BY timestamp LIMIT 2

您的SQL语法出现了错误;请检查与您的MariaDB服务器版本相对应的手册,以便在第1行使用接近“按时间戳限制2顺序”的语法。

在DELETE之后指定在joined (多表)语句中删除的表,因此它看起来更像是单表语法,这也是语法错误。

代码语言:javascript
复制
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”

它是在DELETE子句中命名的表:

最后,只使用一个表,但使用多表语法(以DELETE关键字命名表)不允许使用ORDER BY,因此,此处真正的标识区别似乎是在子句中命名的表,以区分多表和单表:

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

代码语言:javascript
复制
/* name table1 in the DELETE clause */
DELETE table1
/* but not other table is joined */
FROM table1
WHERE somecol = 'someval'
ORDER BY id LIMIT 2

您的SQL语法有错误;请检查与您的MariaDB服务器版本对应的手册,以获得正确的语法,以便使用接近“ORDER限制1”。

票数 1
EN

Stack Overflow用户

发布于 2015-01-17 22:46:00

如果您指定您只从一个表中DELETE,并且DELETE语句中没有涉及到JOIN,那么这是一个单表语法。否则,这是一种多表语法。我很确定这就是doc页面的意思。

我认为这一解释的一个证据是,下面这一页写着:

table_references子句列出了连接中涉及的表。其语法在13.2.8.2节“联接语法”中进行了描述。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28004962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档