Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Join_Syntax_Evaluation - Fatal编程技术网

Mysql 如何评估这些查询?和,连接语法

Mysql 如何评估这些查询?和,连接语法,mysql,sql,join,syntax,evaluation,Mysql,Sql,Join,Syntax,Evaluation,如何评估这些查询? (我要问的是:db引擎将使用什么逻辑来收集数据?) A: B: C: 连接多个表的语法是什么?(例如A和B) D: 连接顺序背后的逻辑是什么? (不同的联接(左联接和内联接)在查询中应如何组合?) 有人吗 SELECT tableA.* FROM tableA LEFT JOIN tableB ON tableB.key1 = tableA.key1 INNER JOIN tableC ON tableC.key2 = tableB.key2 由于未使用括号,因此应从左至右

如何评估这些查询? (我要问的是:db引擎将使用什么逻辑来收集数据?)

A:

B:

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

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

有人吗

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匹配的地方从B中添加一条记录)


一般来说,当连接多个表时,只需一步一步地进行,并始终尝试了解您正在连接什么。如有疑问,请使用括号:)

B的语法错误。请解释一下你这是什么意思?每个联接都需要在表名后的子句上使用
,正确的语法是:
。。。表1[LEFT | RIGHT | INNER]根据条件连接表2[[LEFT | RIGHT | INNER]根据条件连接表3]
等。只有
交叉连接
没有
关于条件
子句。@kordirko这正是我的问题:它有效。但我不确定这是什么意思。@kordirko-这对于MySQL是不正确的。语法适用于
b
。每个联接不需要一个
ON
子句()。如果没有
ON
子句,连接/内部连接将成为交叉连接
SELECT tableA.* 
FROM 
(tableA LEFT JOIN tableB ON tableB.key1 = tableA.key1)
        INNER JOIN tableC ON tableC.key2 = tableB.key2
SELECT tableA.* FROM tableA
INNER JOIN tableC 
LEFT JOIN tableB
ON (tableB.key1 = tableA.key1) AND (tableC.key2 = tableB.key2)