小编典典

MySQL JOIN按什么顺序进行评估?

mysql

我有以下查询:

SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123;

我有以下问题:

  1. USING语法与ON语法同义吗?
  2. 这些联接是从左到右评估的吗?换句话说,此查询是否说:x =公司加入了用户;y = x JOIN工作;z = y加入用户帐户;
  3. 如果对问题2的回答为“是”,那么可以安全地假设“公司”表中包含“公司ID”,“用户ID”和“工作ID”列?
  4. 我不明白在引用别名“ j”时,如何使用WHERE子句来选择公司表上的行

任何帮助,将不胜感激!


阅读 327

收藏
2020-05-17

共1个答案

小编典典

  1. USING(字段名)是表示table1.fieldname = table2.fieldname的简写方式。

  2. SQL并未定义完成JOINS的“顺序”,因为这不是语言的本质。显然,必须在语句中指定一个顺序,但是INNER JOIN可以被认为是可交换的:您可以按任何顺序列出它们,您将获得相同的结果。

就是说,当构造一个SELECT … JOIN时,尤其是包括LEFT
JOIN的一个,我发现将第三个JOIN视为将新表与第一个JOIN的结果联接在一起,将第四个JOIN视为对联接的联接是有意义的。第二个JOIN的结果,依此类推。

由于它影响启发式的方式,指定顺序可能会影响查询优化器的行为。

  1. 否。查询的组装方式要求公司和用户都具有公司ID,Jobs具有用户ID和JobID,而useraccounts具有用户ID。但是,只有公司 用户之一需要用户名才能使JOIN起作用。

  2. WHERE子句使用jobs表提供的列来过滤整个结果,即所有JOINed列。

2020-05-17