表连接如何在Mysql中真正起作用?

时间:2018-03-18 06:03:46

标签: mysql sql

多年来,我了解到当表连接时,主表中的一行在应用条件后连接到目标表中的一行,即查询结果将< =主表中的行。但是我已经看到主表中的一行可以连接多次条件允许。例如,如果没有重复行形成主表

,则下面的查询计数函数将无法工作
 SELECT node.name, (COUNT(parent.name) - 1) AS depth
 FROM nested_category AS node,
 nested_category AS parent
 WHERE node.lft BETWEEN parent.lft AND parent.rgt
  GROUP BY node.name
  ORDER BY node.lft;

产生此结果

          +----------------------+-------+
          | name                 | depth |
          +----------------------+-------+
          | ELECTRONICS  |     0 |
          | TELEVISIONS    |     1 |
          | TUBE                  |     2 |
          | LCD                    |     2 |
          | PLASMA            |     2 |
          | PORTABLE ELECTRONICS |     1 |
          | MP3 PLAYERS          |     2 |
          | FLASH                |     3 |
          | CD PLAYERS           |     2 |
          | 2 WAY RADIOS         |     2 |
          +----------------------+-------+

我知道我可能会问一些非常基本的东西,但是在最简单的连接中,如何将行连接在一起,mysql是否会采取类似于正则表达式引擎对字符串执行模式的步骤?

2 个答案:

答案 0 :(得分:2)

"如何"实现连接实际上并不重要。 SQL是描述性语言,而不是过程语言。查询引擎可以决定"如何"。该查询描述了"什么"。

内连接的概念定义相当简单。它是两组的笛卡尔积,符合onwhere条款的条件。

大多数人都不会考虑笛卡尔积。嵌套循环是等效的。逻辑是这样的:

for each row1 in table1
    for each row2 in table2
        output row1 || row2 if the on/where conditions are true

外连接扩展了这个概念,即使on / where条件不正确,也允许来自一个或两个表的行在结果集中。

没有任何关于"查询结果将< =主表中的行的概念。"对于一些数据结构 - 特别是加入维度表的事实表 - 您将获得该行为。但是,这是因为数据模型是为此目的而设计的,而不是因为SQL以这种方式工作。

答案 1 :(得分:1)

我的两分钱。我同意“如何”并不重要,因为SQL是一种描述性语言。嗯......在系统成功并且数据库增长(很多)时,如果你的查询变得很慢(我的经验),那就不重要了。

如果您需要了解SQL缓慢或无响应的原因,您需要了解数据库的工作原理。数据库使用多种策略来加入JOIN表。通常(不完整列表):

  • 嵌套循环加入“NLJ”:这是你提到的那个。
  • 合并加入:并排加入表格。
  • 哈希加​​入:哈希一个表,然后在另一个表上执行扫描。
  • N-Ary加入:类似于NLJ,但同时包含两个以上的表格。

根据表的大小,列统计信息,过滤器的选择性(在哪里),数据库可以使用其中一个。如果列统计和&amp ;;它甚至可以随时间变化。价值分布发生变化。

如果您想了解这些策略是什么,以及每个策略何时方便,您都可以开始使用

EXPLAIN <sql>

了解MySQL针对您的特定查询使用的策略。然后,您可以阅读有关数据库理论的内容,以了解详细信息。