求MySQL 中JOIN 的详细用法

包括内连接外连接 交叉连接 还有left 什么的

1. Nested-Loop Join 翻译过来就是嵌套循环连接,简称 NLJ。
这种是 MySQL 里最简单、最容易理解的表关联算法。
比如,拿语句 select * from p1 join p2 using(r1) 来说,
先从表 p1 里拿出来一条记录 ROW1,完了再用 ROW1 遍历表 p2 里的每一条记录,并且字段 r1 来做匹配是否相同,以便输出;再次循环刚才的过程,直到两表的记录数对比完成为止。
2. Block Nested-Loop Join ,块嵌套循环,简称 BNLJ
那 BNLJ 比 NLJ 来说,中间多了一块 BUFFER 来缓存外表的对应记录从而减少了外表的循环次数,也就减少了内表的匹配次数。还是那上面的例子来说,假设 join_buffer_size 刚好能容纳外表的对应 JOIN KEY 记录,那对表 p2 匹配次数就由 1000 次减少到 1 次,性能直接提升了 1000 倍。
3. 最近 MySQL 8.0.18 发布,终于推出了新的 JOIN 算法 — HASH JOIN。
MySQL 的 HASH JOIN 也是用了 JOIN BUFFER 来做缓存,但是和 BNLJ 不同的是,它在 JOIN BUFFER 中以外表为基础建立一张哈希表,内表通过哈希算法来跟哈希表进行匹配,hash join 也就是进一步减少内表的匹配次数。当然官方并没有说明详细的算法描述,以上仅代表个人臆想。那还是针对以上的 SQL,我们来看下执行计划。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-13
/*左外联接*/
SELECT DISTINCT v.vend_id,p.prod_name
FROM vendors AS v
LEFT OUTER JOIN products AS P
ON v.vend_id=p.prod_id
AND p.prod_price>30;

/*右外联接*/
SELECT DISTINCT v.vend_id,vend_name,vend_city,p.prod_name,p.prod_id,p.prod_price
FROM vendors AS v
RIGHT OUTER JOIN products AS P
ON v.vend_id=p.prod_id
AND p.prod_price>30;

/* 内联接 */
SELECT DISTINCT v.vend_id,p.prod_name
FROM vendors AS v
INNER JOIN products AS P
ON v.vend_id=p.prod_id
AND p.prod_price>30;

/*自然联接《外联接》*/
SELECT DISTINCT v.vend_id,p.prod_name
FROM vendors AS v ,products AS p
WHERE v.vend_id=p.prod_id
AND p.prod_price>30;
就这些 看你能看懂不?
至于那交叉联接就木知了。。本回答被提问者采纳
相似回答