Mysql 相同的外部联接相对顺序但不同的绝对顺序
问题的标题可能会让人困惑,因为我想不出一个简洁的方式来形成这个问题。让我举个例子来描述 我有一个使用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。但是,因为这些表的依赖关系树实际上看起来像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连接起来
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