MYSQL UNION 笛卡尔积

MYSQL UNION 笛卡尔积

  1. 想必写这句
select * from tablea ,tableb where tablea.id = tableb.id 

肯定有人写过无数次了吧,肯定还是有人会这样写,并且依然没有看出问题,select * from tablea,tableb 其实可以首先执行这句sql就能发现出现的结果是tablea的每个记录和table中的所有记录都生成一条记录。也就是假如tablea有四条记录,tableb有五条记录,最后会首先生成20条记录。回到开头的sql,再用where 条件去过滤内容,想必大多数人觉得也没啥问题,这个问题在数据量不大的时候,确实没啥问题,但是到了比如表A中有1w数据,表B中有1w数据,这样的会就会产生1亿的数据,然后再用where条件去过渡,可以说大大降低了性能。

  1. 现在我们来谈一谈 怎样避免
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

在每条union 之前的sql中加上过滤条件即可;也可以用是join on

select * from tablea join tableb on tablea.id=tableb.id

这样的话会按照on中的条件,来连接两条数据,大大减少了需要排除的数据,然后可以在where条件中再去过滤数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值