日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql 语法执行顺序

發布時間:2023/12/20 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql 语法执行顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

熟悉Mysql 語法的小伙伴們都知道sql的語法順序,如下:

select[distinct] from join(如left join) on where group by having union order by limit

如果有去查閱一些文檔或書籍,應該就知道sql在執行的過程過其實并沒有按照上訴的語法順序執行的,它內部機制中會對語法進行解析,處理,優化 后生成查詢計劃,然后交給查詢執行引擎 調用相應的存儲引擎處理,如下:

這里主要是對最終的語法執行順序進行一個分析,其他部分以后進行分析或者感興趣的可以查找一些相關資料

🤔思考:那么語法的最終執行順序應該是如何?什么關鍵字先被處理呢?為什么要知道執行順序?知道了執行順序對我們寫sql有什么幫助呢?

不多說,先直接看下順序,以下是語法的執行順序:?

from on join where group by having select distinct union order by

下面我們來具體分析一下查詢處理的每一個階段:

  • FROM: 首先會執行from語句,把數據庫的表文件加載到內存中。若有多張表,則多表計算笛卡爾積。產生虛表VT1(virtual table)
  • ON: 對虛表VT1進行ON篩選,篩選出那些符合的行并且在內存中生成一張臨時虛表VT2中。
  • JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會作為外部行添加到虛擬表VT2中,產生虛擬表VT3, rug from子句中包含兩個以上的表的話,那么就會對上一個join連接產生的結果VT3和下一個表重復執行步驟1~3這三個步驟,一直到處理完所有的表為止。
  • WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合的記錄才會被插入到虛擬表VT4中。
  • GROUP BY: 根據group by子句中的列,對VT4中的記錄進行分組操作,產生VT5.
  • CUBE | ROLLUP: 對表VT5進行cube或者rollup操作,產生表VT6. (注CUBE|ROLLUP 是對數據的聚合操作)
  • HAVING: 對虛擬表 VT6 應用having過濾,只有符合的記錄才會被 插入到虛擬表 VT7 中。
  • SELECT: 執行select操作,選擇指定的列,插入到虛擬表VT8中。
  • DISTINCT: 對VT8中的記錄進行去重。產生虛擬表VT9.
  • ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進行排序操作,產生虛擬表VT10.
  • LIMIT:取出指定行的記錄,產生虛擬表VT11, 并將結果返回。

看完之后,相信都對sql語句有了新的認識,我們在編寫sql的時候能更少的出錯,并能編寫更加優雅的代碼。除此之外我們還可以知道哪些信息呢?對索引的使用相信大家也應該有更多的想法了,剩下的就是在實踐中一步步摸索。

?

?

總結

以上是生活随笔為你收集整理的Mysql 语法执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。