Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 相同的外部联接相对顺序但不同的绝对顺序_Mysql_Sql - Fatal编程技术网

Mysql 相同的外部联接相对顺序但不同的绝对顺序

Mysql 相同的外部联接相对顺序但不同的绝对顺序,mysql,sql,Mysql,Sql,问题的标题可能会让人困惑,因为我想不出一个简洁的方式来形成这个问题。让我举个例子来描述 我有一个使用MySQL 5.6的查询,大致如下所示: 选择 从…起 A. -左连接a和b1,然后b1和b2 左连接。。。AS b1 在b1.a_id=a.id上 左连接。。。AS b2 关于b2.b1_id=b1.id -左连接a和c1,然后c1和c2 左连接。。。作为c1 关于c1.a_id=a.id 左连接。。。AS c2 关于c2.c1_id=c1.id -内部将a与其他一些表i1、i2、i3连接起来

问题的标题可能会让人困惑,因为我想不出一个简洁的方式来形成这个问题。让我举个例子来描述

我有一个使用MySQL 5.6的查询,大致如下所示:

选择 从…起 A. -左连接a和b1,然后b1和b2 左连接。。。AS b1 在b1.a_id=a.id上 左连接。。。AS b2 关于b2.b1_id=b1.id -左连接a和c1,然后c1和c2 左连接。。。作为c1 关于c1.a_id=a.id 左连接。。。AS c2 关于c2.c1_id=c1.id -内部将a与其他一些表i1、i2、i3连接起来 ... 哪里 ... 让我们将上面查询中的表顺序写为b1b2c1c2i1i2i3。但是,因为这些表的依赖关系树实际上看起来像

a --> b1 -> b2
  |
   -> c1 -> c2
  |
   -> i1
  |
   -> i2
  |
   -> i3

我相信将表格重新排列为c1 c2 b1 b2 i1 i2 i3不会有什么不同,但如果我错了,请纠正我

但是,当我处理查询时,我注意到查询仍然可以与b1 c1 b2 c2 i1 i2 i3、b1 c1 c2 b2 i1 i2 i3甚至i1 b1 i2 c1 i3 b2 i4 c2一起使用。似乎只要保持b1 b2和c1 c2的相对顺序,绝对顺序就不会影响查询结果


我想知道这是否只是巧合,或者实际上是由SQL保证的。

对于内部连接,顺序根本不重要,它是可交换的和关联的

对于外部联接,相对顺序仅在ON子句中的表之间起作用;如果是左联接,则第一个表是联接条件的主表,对于右联接,第二个表是主表

然而,独立联接的相对顺序是不相关的。因此,如果表1是主表,而表2和表3都依赖于主表,那么

FROM table1
LEFT JOIN table2 ON table1.id = table2.t1_id
LEFT JOIN table3 ON table1.id = table3.t1_id


请看EXPLAIN{query}差异。我想你会看到,如果查询在功能上是相同的,那么查询计划将是相同的你说的重新安排是什么意思?SQL是一种声明性语言,而不是命令式语言。优化器可以自由地在内部重新表述、重新排序、重新组合和重构查询,只要它返回您指定的结果。@优化器的意思是重新排列,即按不同的顺序在FROM子句中写入表。我问这个问题是因为我知道外部连接的顺序很重要,但我不知道是绝对顺序重要还是只有相对顺序重要。对于内部连接,顺序根本不重要,它是可交换的和关联的。对于左联接和右联接,相对顺序仅在ON子句中的表之间起作用。但不相关连接的顺序并不重要。@Barmar这正是我要问的。也许可以回答这个问题?我唯一一次看到相对顺序与更简单的引擎相关,比如Derby或HyperSQL。我不确定,但在其中一个表上,优化器遵循查询中键入的表的确切顺序。
FROM table1
LEFT JOIN table3 ON table1.id = table3.t1_id
LEFT JOIN table2 ON table1.id = table2.t1_id