mysql join 有多少种

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql join 有多少种相关的知识,希望对你有一定的参考价值。

    内连接

    mysql中,

       inner join...on 

       join...on 

       逗号...where

       cross join...on

    是一样的含义。

    但是在标准SQL中,它们并不等价。

    外链接

    外链接包括left [outer] join 和right [outer] join ,左连接和右连接

    RIGHT JOIN的作用与LEFT JOIN的作用类似。要使代码可以在数据库内移植,建议您使用LEFT JOIN代替RIGHT JOIN

    自然连接

    NATURAL [LEFT] JOIN:这个句子的作用相当于INNER JOIN,或者是在USING子句中包含了联结的表中所有公共字段的Left JOIN(左联结)。

参考技术A left join , inner join , right join

MySQL:在 JOIN 中扫描了多少表行?

【中文标题】MySQL:在 JOIN 中扫描了多少表行?【英文标题】:MySQL: How many table rows are scanned in JOIN? 【发布时间】:2020-07-09 14:23:07 【问题描述】:

如果我有三个表,每个表有 1000 行,编号从 1 到 1000,那么 MySQL 在以下 JOINs 查询期间进行了多少次比较:

SELECT *
FROM table_1 t1 
JOIN table_2 t2 ON t1.id_1 = t2.id_2
JOIN table_3 t3 ON t2.id_2 = t3.id_3;

SELECT *
FROM table_1 t1 
JOIN table_2 t2 
JOIN table_3 t3
WHERE t1.id_1 = t2.id_2 AND t2.id_2 = t3.id_3;

请注意,任何表都没有索引。这两个查询有区别吗?我在想,在第二个查询中,它的目的是让 MySQL 创建所有三个表的笛卡尔积,然后过滤掉匹配条件的行(必须扫描 1000 X 1000 X 1000 行)但在内部它被转换为第一个查询,它将在第一个 JOIN 中扫描 1000 X 1000 行,然后在第二个 JOIN 中扫描另外 1000 X 1000 行。结果应该是相同的(1000 行三列的数字 1 到 1000 相同)。

是哪一个? 1000 X 1000 X 1000 行或 1000 X 1000 + 1000 X 1000 行

阅读 Paul DuBois 的 MySQL 的“查询优化”一章(第 4 版,第 306 页)后出现的问题:

【问题讨论】:

无论有无索引,DBMS 都使用从给定表达式的朴素嵌套/逻辑评估顺序到算法的重新排列来实现查询。如果您使用谷歌加入优化,手册会进行微不足道的优化以以相同的方式实现这些。如果您要问这样的问题,那必须是在您研究了手册和教科书的主题之后,或者您只是要求我们重写它们。 ON vs WHERE 优化也是一个常见问题解答。如果你不知情,“我在想”是没有意义的。 How to Ask help center 对于代码问题,请给出minimal reproducible example 的相关部分——包括 SQL 计划。 如果您对该演示文稿有疑问,请提供上下文并提出问题。否则(无论如何)我希望你能按照我的 cmets 行事。 PS 同样,即使没有索引,MySQL 也可以有统计、约束等来实现/优化/计划查询。如果您按照我的建议搜索了该手册,您还会看到确认这些查询始终被同等对待。 请use text, not images/links, for text--including tables & ERDs。转述或引用其他文本。只提供您需要的东西并将其与您的问题联系起来。仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图片中包含图例/键和说明。 我认为这本书是在理论上讲...如果我们必须连接三个集合,每个集合都由整数 1 到 1000 组成,有两种方法可以找到所有三个集合中的元素的所有组合相同的 1, 1, 1, 2, 2, 2....一,你可以找到所有可能的组合(10^9),然后扫描它们,找到那些特定的 1000 个组合(书建议这)。另一种是,对于第一组中的 1000 个项目中的每一个,扫描第二组(1000 行)和第三组(另外 1000 行)以查找前导 1000 x (1000 + 1000) 次扫描的匹配元素; 第二个是MySQL“会”做的事情,但如果没有关于表结构、索引、引擎等的具体细节就不可能说出来......@philipxy,你的答案是错误的,请参阅上面的评论...... 【参考方案1】:

这两个查询的处理方式相同。

为了清晰ON 应该说明这些表是如何关联的; WHERE 应该过滤。

但是,对于优化,这些等价于JOIN

对于LEFT JOIN,您将条件放在哪里确实很重要。

作为对您问题的补充,...如果表的行数不同,优化器可能会从最小的表开始。

查看此内容以了解如何计算行数:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#handler_counts

请提供SHOW CREATE TABLE以便我们了解id_1

在没有索引的情况下运行这样的代码是愚蠢的。

预期的输出是什么?像这样?

+---+---+---+
| n | n | n |
+---+---+---+
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |
...

【讨论】:

三个表的行数相同。我的主要问题是扫描的行数? @oneCoderToRuleThemAll 编辑您的帖子以明确提出您的问题。 @oneCoderToRuleThemAll - 我在答案中添加了一些内容。能提供完整的测试用例吗?我给你拿号码。

以上是关于mysql join 有多少种的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之LEFT JOIN中使用ON和WHRERE对表数据

MySQL中(insert/update/delete)到底有多少种写法?

MySQL中(insert/update/delete)到底有多少种写法?

MySQL Inner Join 有限制吗?

left join一些小坑

mysql中text可以存储多少个字