本篇文章谈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表的用户个数即可。