mysql (自连接思考)

原始表:product

select *

from product p1 ,product p2;

#这样会产生笛卡尔积

7行×7列=49条数据,里面包含相同的(例如苹果,苹果)

在终端里面运行出来的结果和上面的一样

count(1)和count(*)几乎是没有区别的

  • 如果你写的是 JOIN(即 INNER JOIN)但没有指定 ON 或 USING 条件,那么它会被数据库引擎自动视为 笛卡尔积CROSS JOIN)。
select * from product p1 join product p2;
#关键就在于我们没有使用on

select * from product p1 ,product p2;

问:也就是说如果我是使用的隐式的写法,里面有where 这些限制也不会造成笛卡尔积对吗?

总结来说,用户的问题核心在于理解隐式连接和显式连接在处理条件时的区别,以及如何避免笛卡尔积带来的性能问题。需要明确回答:隐式写法中的WHERE条件并不会避免笛卡尔积的生成,只是后续的过滤步骤,而显式的JOIN语法在连接时就应用了条件,更高效。

1. 隐式连接(逗号语法) + WHERE 条件

sql深色版本SELECT * 
FROM product p1, product p2 
WHERE p1.name = p2.name;
  • 执行过程:先生成笛卡尔积:数据库会先将 p1 和 p2 表的所有行进行全组合(即笛卡尔积),结果数量为 count(p1) * count(p2)。再通过 WHERE 条件过滤:在笛卡尔积的基础上,筛选出满足 p1.name = p2.name 的行。
  • 结果:最终结果集是满足条件的行,但中间过程(笛卡尔积)仍然存在。笛卡尔积的规模取决于表的大小。例如,如果 p1 和 p2 各有 1000 行,则中间结果会生成 100 万行,再通过 WHERE 过滤掉大部分无效数据。

2. 显式 JOIN(INNER JOIN) + ON 条件

sql深色版本SELECT * 
FROM product p1 
INNER JOIN product p2 
ON p1.name = p2.name;
  • 执行过程:直接通过 ON 条件连接:数据库会直接根据 p1.name = p2.name 的条件进行匹配,不会生成完整的笛卡尔积。结果集仅包含满足条件的行。
  • 结果:中间过程避免了笛卡尔积的生成,效率更高。如果 name 字段有索引,数据库优化器可能进一步加速匹配过程。

3. 核心区别

是否生成笛卡尔积

(先生成,再过滤)

(直接按条件匹配)

性能

可能较差(尤其在大表场景下)

更优(直接匹配,减少中间结果集)

可读性

可读性较差(条件混杂在 WHERE 中)

可读性更好(连接逻辑与过滤逻辑分离)

优化器行为

优化器可能无法高效处理隐式连接

优化器更容易生成高效的执行计划

4. 实际影响

  • 隐式连接的陷阱:如果你忘记写 WHERE 条件,会直接返回笛卡尔积,导致结果集爆炸(例如百万级数据)。即使写了 WHERE,数据库仍会先生成笛卡尔积,再过滤,浪费资源。
  • 显式 JOIN 的优势:直接按条件匹配,避免生成笛卡尔积。更符合现代 SQL 标准,代码更清晰。优化器可以更好地识别连接逻辑并进行优化。

也就是说他们设计的算法不一样,虽然结果是一样的,使用显式更加安全高效,不会崩溃。

select distinct p1.name ,p1.price 

from product p1 ,product p2

where p1.price=p2.price and p1.name <> p2.name;

#测试<> 这个!=是一样的吗

select distinct p1.name ,p1.price 

from product p1 ,product p2

where p1.price=p2.price and p1.name != p2.name;

结果是一样的!

distinct是干嘛的?

#没有这个distinct 这个会是什么效果呢?
select  p1.name ,p1.price 

from product p1 ,product p2

where p1.price=p2.price and p1.name != p2.name;

:还是要多实践,实践就能够暴露问题了,以前的很多理所当然!!!

:觉知此事须躬行啊!

:还来的及,加油,未来一定成功!

全部评论
mysql 我还停留在学校学的那么点知识上
点赞 回复 分享
发布于 09-14 20:08 陕西

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务