如何评估此查询?并加入语法

时间:2013-12-12 19:04:21

标签: mysql sql join syntax evaluation

如何评估此查询? (我要问的是:db-engine将用于收集数据的逻辑是什么?)?

A:

SELECT tableA.* FROM tableA
LEFT JOIN tableB ON tableB.key1 = tableA.key1
INNER JOIN tableC ON tableC.key2 = tableB.key2

B:

SELECT tableA.* FROM tableA
INNER JOIN tableC 
LEFT JOIN tableB
ON (tableB.key1 = tableA.key1) AND (tableC.key2 = tableB.key2)

C:
连接多个表的语法是什么? (例如A和B)

d:
连接顺序背后的逻辑是什么?
(如何在查询中组合不同的连接(左和内)?)

ANY酮

1 个答案:

答案 0 :(得分:1)

SELECT tableA.* FROM tableA
LEFT JOIN tableB ON tableB.key1 = tableA.key1
INNER JOIN tableC ON tableC.key2 = tableB.key2

由于没有使用括号,因此应从左到右进行评估,因此:

SELECT tableA.* 
FROM 
(tableA LEFT JOIN tableB ON tableB.key1 = tableA.key1)
        INNER JOIN tableC ON tableC.key2 = tableB.key2

这意味着您首先从表A中选择所有记录,如果存在,则匹配来自B的记录(外部联接)。然后,该结果集与C连接,但由于您加入了B.Key,所有之前B = null的记录现在将消失。 我很确定第一个连接可以是内部连接,给出相同的结果。

SELECT tableA.* FROM tableA
INNER JOIN tableC 
LEFT JOIN tableB
ON (tableB.key1 = tableA.key1) AND (tableC.key2 = tableB.key2)

现在我们首先将来自A的每条记录与来自C(笛卡尔积)的每条记录交叉连接。 那个(可能是巨大的,可能没有意义的)结果集我们用来自B的数据扩展我们可以找到它(意味着我们在B与A或B匹配的地方添加记录)。

一般来说,在连接多个表时,只需逐步进行,并始终尝试实现您正在加入的内容。如有疑问,请使用括号:)