代码之家  ›  专栏  ›  技术社区  ›  RobertPitt

MySql连接的优点/缺点

  •  11
  • RobertPitt  · 技术社区  · 15 年前

    当我从多个表中选择数据时,我经常使用连接,最近我开始使用另一种方法,但我不确定从长远来看会产生什么影响。

    SELECT * FROM table_1 LEFT JOIN table_2 ON (table_1.column = table_2.column)
    

    这是表之间的基本左连接,请看下面的查询。

    SELECT * FROM table_1,table_2 WHERE table_1.column = table_2.column
    

    但是这两种方法有利弊吗?

    5 回复  |  直到 8 年前
        1
  •  10
  •   Community Mohan Dere    5 年前

    第二种方法是内部连接的快捷方式。

     SELECT * FROM table_1 INNER JOIN table_2 ON table_1.column = table_2.column
    

    将只选择两个表中与条件匹配的记录(LEFT JOIN将从左侧的表中选择所有记录,从右侧的表中选择匹配的记录)

    http://dev.mysql.com/doc/refman/5.0/en/join.html

    […]我们认为表引用项列表中的每个逗号都相当于一个内部联接

    以及

    在没有联接条件的情况下,内部联接和(逗号)在语义上是等价的:两者都在指定的表之间生成笛卡尔积(即,第一个表中的每一行都联接到第二个表中的每一行)。

    总的来说,这里提到了很多事情,这应该让你考虑不使用逗号。

        2
  •  3
  •   Thomas    15 年前

    我强烈建议不要使用第二种方法。

    1. 它打破了其他开发人员最不惊讶的规则,他们会怀疑您是否只是不知道有什么更好的,或者是否有一些特定的原因不使用ANSI/ISO格式。
    2. 当您开始尝试将该格式与内部连接以外的其他内容一起使用时,它会使您感到悲伤。
    3. 它使您更难辨别您的意图,特别是在具有许多表的大型查询中。所有这些表都应该是内部联接吗?您是否在Where子句中遗漏了一些内容并创建了交叉连接?你打算做交叉连接吗?等。

        3
  •  2
  •   OMG Ponies    15 年前

    ANSI语法

    两个查询都是连接,都使用ANSI语法,但一个比另一个旧。

    连接使用 JOIN 关键字表示正在使用ANSI-92语法。ANSI-89语法是指在 FROM 子句中找到连接它们的条件 WHERE

    SELECT * 
      FROM table_1 t1, table_2 t2
     WHERE t1.column = t2.column
    

    …将生成与以下相同的查询计划:

    SELECT *
      FROM TABLE_1 t1
      JOIN TABLE_2 t2 ON t2.column = t1.column
    

    苹果变橘子

    另一个区别是这两个查询不完全相同—左[OUTER]联接将从中生成所有行 TABLE_1 TABLE_2 如果基于联接条件(在 ON 条款)。第二个例子是一个内部连接,它将 只有 生成在中具有匹配记录的行 表2 link to a visual representation of JOINs 为了加强区别。。。

    使用ANSI-92语法的主要原因是ANSI-89没有任何外部连接(左、右、全)支持。ANSI-92语法是专门为解决这个缺点而引入的,因为供应商正在实现他们自己的自定义语法。使用的Oracle (+) ;SQL Server在联接条件中的等号旁边使用了星号(即: t1.column =* t2.column

    使用ANSI-92语法的第二个原因是它更显式、更可读,同时将用于连接表的内容与实际过滤分离开来。

        4
  •  0
  •   Hammerite    15 年前

    A JOIN B , A LEFT JOIN B )更可取。这两个原因都是因为它更明确地说明了您在做什么,而且如果您对内部联接使用隐式联接语法,那么您仍然必须对外部联接使用显式语法,因此您的SQL格式将不一致。