抛弃NOT IN ,走进 LEFT JOIN

1 篇文章 0 订阅
1 篇文章 0 订阅

本篇文章谈Mysql 的子查询和表连接这两个常用的情况。本文会以例子的形式来讲解如何高效得使用子查询和表连接。开讲之前先发个牢骚,说一下观点。

子查询一定慢吗?

当我们用到IN(SELECT ......)、NOT IN (SELECT ......)这两种情况的时候子查询是非常慢的,别的情况不一定,我们会在例子中讲到一种情况。

需求:查询2012-10-07来访问并且2012-10-06没有来访问的用户数量。

1 子查询的写法:

SELECT
 COUNT(DISTINCT usr_idntf)
FROM
 users_wap_total
WHERE
 access_date = '2012-10-07'
AND usr_idntf NOT IN (
 SELECT DISTINCT
  usr_idntf
 FROM
  users_wap_total
 WHERE
  access_date = '2012-10-06'
)本机测试1245.838s

2 表连接的写法:

SELECT
 COUNT(DISTINCT u7.usr_idntf)
FROM
 (
  SELECT
   *
  FROM
   users_wap_total
  WHERE
   access_date = '2012-10-07'
 ) u7
LEFT JOIN (
 SELECT
  *
 FROM
  users_wap_total
 WHERE
  access_date = '2012-10-06'
) u6 ON u7.usr_idntf = u6.usr_idntf
WHERE
 u6.usr_idntf IS NULL 本机测试3.485秒

总结一下表连接写法的思路:总体上是一个左连接。2012-10-07数据表示成左表,2012-10-06数据表示成右表。如果在07表中存在用户访问记录,而在06表中不存在用户访问记录,则07表记录正常显示,06表记录显示为NULL。所以我们只需要查询出06表中用户标识为NULL的07表的用户个数即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值