MySQL的SQL等價改寫

xuexiaogang發表於2021-12-13

自己原文公眾號: 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其實不是和需求等價的。只是你覺得或者我以為,雖然結果一樣但是實際過程完全不一樣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847322/,如需轉載,請註明出處,否則將追究法律責任。

相關文章