自己原文公众号:
https://mp.weixin.qq.com/s/3QNx3z1Q4TAMmrHC8qh3Rw
先上一下实验数据。
再上一句SQL:
SELECT
*
FROM
h1,
h3
WHERE
h1.id = h3.id
AND (h1.name) IN (SELECT
h1.name
FROM
h1,
h3
WHERE
h1.id = h3.id
AND (h1.name) IN (SELECT
h1.name
FROM
h1,
h3
WHERE
h1.id = h3.id AND h1.id IN (1)
GROUP BY h1.id , h1.name)
GROUP BY h1.id , h1.name)
AND h1.id IN (1);

为什么会写成这样?连美化都美化不出来?
别问我,我也不知道。只有你想不到的没有做不到的。写出这样的人也不容易,但是呢,好像无用功太多了。
我只是将实际的表名换了一下,数据也换了一下。
执行结果如图:
看一下,他就一行,但是由于层层嵌套。扫描了4行。

等价改写以后:
SELECT
*
FROM
h1,
h3
WHERE
h1.id = h3.id
AND h1.id IN (1);

一般来说真实环境的数据绝对不是1行这样的数据,那么嵌套起来扫描的就多了很多了。
需求来了不是来就写,写一定要等价,其实日常中我发现很多SQL其实不是和需求等价的。只是你觉得或者我以为,虽然结果一样但是实际过程完全不一样。
