sql優(yōu)化2

  • 一條查詢sql語句的執(zhí)行流程:
  1. FROM <表名>
    選取表,將<left_table>及<right_table>表數(shù)據(jù)通過笛卡爾積生成虛表VT1(此時VT1包括表中所有的字段?),
  2. ON <篩選條件>
    對笛卡爾積的虛表VT1根據(jù)條件進行篩選VT2
  3. JOIN <join, left join, right join...> <join表>
    指定join,保留表中未匹配的行就會作為外部行添加到虛擬表VT2中,產(chǎn)生虛表VT3。例如left join會將左表的剩余數(shù)據(jù)添加到虛表VT2中,生成虛表VT3
  4. WHERE <where條件>
    對上述虛表VT3進行篩選, 將符合<where-condition>的記錄才會被插入到虛表VT4
    此時還沒有進行g(shù)roup by,因此WHERE中出現(xiàn)對統(tǒng)計的過濾是不對的(不可以使用聚合函數(shù)),若需要則在having中實現(xiàn)。
    請思考一下,對于同樣的篩選條件:在on和where 處進行篩選有結(jié)果會有不同?
  5. GROUP BY <分組條件>
    分組, 根據(jù)分組條件,對VT4進行分組操作,生成虛表VT5(若是有g(shù)roup by,那么后面的所有步驟都只能得到的VT4的列及聚合函數(shù)(count、sum、avg等),即VT5虛表只會生成這些)
    注意:所有select的字段,除聚合函數(shù)中的字段外,都必須在group by中出現(xiàn)
  6. HAVING <分組篩選>
    對分組后的結(jié)果進行篩選,即對虛表VT5進行篩選生成VT6
  7. SELECT<返回數(shù)據(jù)列表>
    選擇指定的列,生成虛擬表VT7(再次提醒:若有g(shù)roup by子句中,則此處除了group by子句中的列+聚合函數(shù)除外,不能再出現(xiàn)其它的列。請思考下,為什么不建議Select *from?)
  8. DISTINCT
    數(shù)據(jù)除重,生成VT8
  9. ORDER BY<排序條件>
    將虛表VT8按照<order_by_list>進行排序操作,產(chǎn)生虛擬表VT9,請注意:這是唯一的一個可以使用select列表中別名的步驟
  10. LIMIT <行數(shù)限制>
    取出指定行的記錄,產(chǎn)生虛擬表VT10, 并將結(jié)果返回
  • 擴展:帶有子查詢的執(zhí)行順序(堅持小表驅(qū)動大表的原則)
    1. 不相關(guān)子查詢:子查詢的查詢條件不依賴于父查詢(由里向外 逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件)
    select * from emp where sal = (select max(sal) from emp);
    先執(zhí)行內(nèi)層查詢,作為where 條件再執(zhí)行外層查詢
    2. 相關(guān)子查詢:子查詢的查詢條件依賴于父查詢(先取外層查詢中表的第一個元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,若WHERE子句返回值為真,則取此元組放入結(jié)果表,
    然后再取外層表的下一個元組,重復(fù)這一過程,直至外層表全部檢查完為止)
    select * from dept d where exists(select * from emp e where e.deptno = d.deptno);
    先執(zhí)行外層查詢,再執(zhí)行內(nèi)層查詢
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容