多年来,我了解到当表连接时,主表中的一行在应用条件后连接到目标表中的一行,即查询结果将< =主表中的行。但是我已经看到主表中的一行可以连接多次条件允许。例如,如果没有重复行形成主表
,则下面的查询计数函数将无法工作 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是否会采取类似于正则表达式引擎对字符串执行模式的步骤?
答案 0 :(得分:2)
"如何"实现连接实际上并不重要。 SQL是描述性语言,而不是过程语言。查询引擎可以决定"如何"。该查询描述了"什么"。
内连接的概念定义相当简单。它是两组的笛卡尔积,符合on
和where
条款的条件。
大多数人都不会考虑笛卡尔积。嵌套循环是等效的。逻辑是这样的:
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表。通常(不完整列表):
根据表的大小,列统计信息,过滤器的选择性(在哪里),数据库可以使用其中一个。如果列统计和&amp ;;它甚至可以随时间变化。价值分布发生变化。
如果您想了解这些策略是什么,以及每个策略何时方便,您都可以开始使用
EXPLAIN <sql>
了解MySQL针对您的特定查询使用的策略。然后,您可以阅读有关数据库理论的内容,以了解详细信息。