【问题标题】:When is CROSS JOIN useful?CROSS JOIN 什么时候有用?
【发布时间】:2015-10-20 11:31:40
【问题描述】:

当我阅读有关CROSS JOIN 的文档时,我想知道,因为它似乎毫无意义。您只需使用逗号 , 即可。我测试了它(几次),这些查询的结果完全一样:

// one
SELECT * FROM table1 CROSS JOIN table2

// two
SELECT * FROM table1, table2

无论如何,我想知道:使用CROSS JOIN 代替, 有什么合乎逻辑的理由吗?

【问题讨论】:

  • 如果我们认为 table_reference 项目列表中的每个逗号都等效于内部连接,则这是一个保守的扩展。
  • 始终使用明确的JOIN 语法。切勿在 FROM 子句中使用逗号。两者在语法上是等价的,但显式连接更清晰、更强大。
  • 还要注意,从 MySQL 5.0.12 开始,隐式连接逗号 , 运算符的优先级低于显式连接(包括 CROSS JOIN)。这可能会影响查询的结果,这些查询在没有使用括号() 的明确优先级的情况下连接表——例如见here

标签: mysql comma cross-join


【解决方案1】:

除了在from 子句中不使用逗号以及始终使用显式join 语法这一简单规则之外,还有一个很好的理由。问题在于这两个查询之间的区别:

select *
from table1, table2;

select *
from table1 table2;

它们做的事情非常不同,而且很难发现差异(尤其是在更复杂的查询中)。如果您在 FROM 子句中从未使用逗号,那么您的查询将更易于阅读,并且不易出现拼写错误和其他问题。

【讨论】:

    【解决方案2】:

    考虑以下...

    EXPLAIN EXTENDED
    SELECT * FROM my_table, my_table x;
    
    SHOW WARNINGS; (reformatted for clarity)
    
    select test.my_table.id AS id
         , test.my_table.car_id AS car_id
         , test.my_table.car_model AS car_model
         , test.my_table.car_features AS car_features
         , test.x
         . id AS id
         , test.x.car_id AS car_id
         , test.x.car_model AS car_model
         , test.x.car_features AS car_features 
      from test.my_table 
      join test.my_table x 
    

    【讨论】:

    • @eggyal 我的意思是逗号连接具体化为显式连接。没有错误;这正是 MySQL 生成的(只是重新格式化了一点)
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2016-09-05
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多