MySQL - 两个语句之间的区别

Posted

技术标签:

【中文标题】MySQL - 两个语句之间的区别【英文标题】:MySQL - Difference between two statements 【发布时间】:2020-09-28 17:04:48 【问题描述】:

我在文档中注意到了这个 SQL 查询:

UPDATE pages page
LEFT JOIN pages parentpage ON page.pid = parentpage.uid
LEFT JOIN pages grandparentpage ON parentpage.pid = grandparentpage.uid
LEFT JOIN pages grandgrandparentpage ON grandparentpage.pid = grandgrandparentpage.uid
SET page.is_hidden = 0
WHERE page.uid = 5
OR page.pid = 5
OR parentpage.pid = 5
OR grandparentpage.pid = 5
OR grandgrandparentpage.pid = 5;

这不完全一样:

UPDATE pages page
SET page.is_hidden = 0
WHERE page.uid = 5
OR page.pid = 5;

PID 和 UID 被 where 子句过滤为等于 5。因此我不明白,为什么这个 JOIN 很重要。

但也许我没有抓住重点?

感谢任何帮助。

提前致谢。

【问题讨论】:

在更新时左连接是一件奇怪的事情 这不完全一样否。创建 4 个链式行,其中只有 grandgrandparentpage.pid = 5 并比较这些查询的结果。第一次查询将更新所有行,而第二次仅更新 2 行。 @Strawberry 为什么不呢?想象一下只有一行uid = 5,它必须(未)标记为隐藏。只有最左边的表被更新... 似乎您正在处理本质上是分层的数据。在修改任何现有文档时,我会格外小心。 2个更新语句不一样。第一个使用左连接来模拟更新的子父关系 详细解释参考权威文档l为什么你期望你所期望的或者我们无法解决你的误解。 【参考方案1】:

你错过了一些东西。见db-fiddle。第一个 SQL 不仅会更新带有 uid 5 的行,还会更新它的子、孙子和曾孙(如果存在)。

【讨论】:

但是在这里,表是与自身连接的。他们称它为父母、祖父母等,但他们总是使用页表。不是第一个选择(pages 页面)已经涵盖了 pages 表中包含的所有内容吗? pages page => page table with placeholder name page pages parent => page table with placeholder name parent 还是我错了? 想象一下,您有 4 个相同的表(具有重复行的彼此的克隆),名称为 pageparentpagegrandparentpagegrandgrandparentpage,它们正在执行连接。结果会是什么?实际的 SQL 相当于那个场景。【参考方案2】:

它们是不同的,因为第一个查询会更新 pid=5uid=5 行的所有子行、孙行和孙行。第二个将仅更新行本身。

以下是查询有何不同的示例:

|uid|pid| first query                 | second query     |
| 1 | 5 | Yes, page.pid=5             | Yes. page.pid=5  |
| 5 | 6 | Yes, page.uid=5             | Yes. page.uid=5  |
| 6 | 7 | Yes, parentpage.pid=5       | No               |
| 7 | 8 | Yes, grapdppage.pid=5       | No               |
| 8 | 9 | Yes, grandgrandppage.pid=5  | No               |
| 9 | 10| No                          | No               |

【讨论】:

但是父页、祖父页等取自同一个表(页)。它们不是已经被 pages page 覆盖了吗(因为 pages parentpage 仍然是 pages 表)?我必须澄清这是我得到的一个真实例子。那些不是我包括的占位符。在我看来,如果 parentpage grandparentpage 等只是别名(不是吗?),第二个语句已经涵盖了所有内容(或者,就像我问的那样,我(仍然)想念它)......跨度> 不。这种结构称为层次结构。一个条件只覆盖一个级别,因此第一个查询返回 5 个级别,而第二个查询只返回 2 个。两者都没有返回无限深。试试看!

以上是关于MySQL - 两个语句之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

以下两个c语句之间的区别[重复]

MySQL SELECT 语句的两行之间的区别

两个更新 SQL 语句之间的区别? [复制]

MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别

这两个mysql查询之间的区别?

MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别