【问题标题】:How to use mysql JOIN without ON condition?如何在没有 ON 条件的情况下使用 mysql JOIN?
【发布时间】:2013-05-04 11:16:52
【问题描述】:

是否可以在没有ON 语句的情况下编写连接查询?以及这些连接有何不同LEFT JOIN, RIGHT JOIN 的工作原理。

【问题讨论】:

  • ON 子句告诉服务器这些表是如何关联的,不。如果您的不同连接类型都给出相同的结果,那么您在某种程度上做错了,添加一些代码可以帮助我们发现您的问题。与此同时,前往Jeff Atwood's blog 进行 2 分钟的不同连接类型介绍。
  • @fvu 该博文在 cmets & is not helpful 中被其作者驳斥。 MySQL 和 SQLite 都允许 (INNER) JOIN 而不使用 ON。 (像 ON 1=1 一样对待,即像 CROSS JOIN 一样对待。)

标签: mysql join left-join inner-join right-join


【解决方案1】:

MySQL documentation 涵盖了这个主题。

这里有一个概要。当使用joininner join 时,on 条件是可选的。这不同于 ANSI 标准,也不同于几乎任何其他数据库。效果是cross join。同样,您可以将on 子句与cross join 一起使用,这也与标准SQL 不同。

交叉连接创建一个笛卡尔积,即第一个表中的 1 行和第二个表中的 1 行的所有可能组合。具有三行('a'、'b'和'c')的表和具有四行(例如 1、2、3、4)的表的交叉联接将有 12 行。

在实践中,如果要进行交叉连接,请使用cross join

from A cross join B

比:

from A, B

和:

from A join B -- with no on clause

右外连接或左外连接需要on 子句,因此讨论与它们无关。

【讨论】:

    【解决方案2】:

    查看http://www.sitepoint.com/understanding-sql-joins-mysql-database/中的一些示例

    您可以在查询中使用“USING”而不是“ON”

    SELECT * FROM table1 LEFT JOIN table2 USING (id);
    

    【讨论】:

    • 为了进一步说明,两个表中的连接列必须具有相同的名称才能使用 USING
    【解决方案3】:

    有几种方法可以进行交叉连接或笛卡尔积:

    SELECT column_names FROM table1 CROSS JOIN table2;

    SELECT column_names FROM table1, table2;

    SELECT column_names FROM table1 JOIN table2;

    在第三种情况下忽略on 条件会导致交叉连接。

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 1970-01-01
      • 2021-12-27
      • 2018-04-11
      • 2020-07-18
      • 1970-01-01
      • 2015-11-30
      • 2021-01-15
      • 2013-12-23
      相关资源
      最近更新 更多