最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中SQL的執(zhí)行順序詳解

 更新時間:2025年05月13日 16:32:36   作者:duck不必鴨鴨  
這篇文章主要介紹了MySQL中SQL的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

MySQL中SQL的執(zhí)行順序

在日常的開發(fā)工作中,我們經(jīng)常會自己手寫一些sql語句,但是對于這些sql語句是怎么執(zhí)行的,執(zhí)行的順序又是怎么樣的呢?想必各位大佬對此也是了解的,所以對sql語言的執(zhí)行順序有一定的了解的話,會更好的理解一些sql語句,從而更好的寫sql語句,也有助于SQL的調(diào)優(yōu)。就比如說,先使用子查詢對數(shù)據(jù)進行過濾后在進行join操作還是直接使用join操作之后,再進行數(shù)據(jù)過濾。

SQL執(zhí)行順序

下面是一條我們經(jīng)常會用到也經(jīng)常會手寫的一條sql語句。

select distinct
    查詢列表(要查的字段),
    max(), avg().... 聚合函數(shù)
from
    左邊的表們s
連接類型(left|inner) join 
    右邊的表們s
on 
    連接條件
where
    篩選條件
group by
    分組的列表(按什么字段分組)
having
    having_condition
order by
    排序的字段
limit
	pageSize

下面是sql語句的執(zhí)行順序

語法格式語法含義執(zhí)行順序
select查詢語句8
distinct去重9
sum(), avg()…聚合函數(shù)6
from tableA主表1
join tableB連接3
on連接條件2
where過濾條件4
group by分組5
havinghaving條件7
order by排序10
limit分頁11

查詢語句都是從from開始執(zhí)行的,在執(zhí)行過程中,每個步驟都會為下一個步驟生成一個虛擬表,這個虛擬表將作為下一個執(zhí)行步驟的輸入。

  • 首先對from子句中的前兩個表執(zhí)行一個笛卡爾乘積,此時生成虛擬表 vt1(選擇相對小的表做基礎(chǔ)表)。
  • 接下來便是應(yīng)用on篩選器,on 中的邏輯表達(dá)式將應(yīng)用到 vt1 中的各個行,篩選出滿足on邏輯表達(dá)式的行,生成虛擬表 vt2 。
  • 如果是outer join 那么這一步就將添加外部行,left outer jion 就把左表在第二步中過濾的添加進來,如果是right outer join 那么就將右表在第二步中過濾掉的行添加進來,這樣生成虛擬表 vt3 。
  • 如果 from 子句中的表數(shù)目多余兩個表,那么就將vt3和第三個表連接從而計算笛卡爾乘積,生成虛擬表,該過程就是一個重復(fù)1-3的步驟,最終得到一個新的虛擬表 vt3。
  • 應(yīng)用where篩選器,對上一步生產(chǎn)的虛擬表引用where篩選器,生成虛擬表vt4。
  • 注意where與on的區(qū)別:先執(zhí)行on,后執(zhí)行where;on是建立關(guān)聯(lián)關(guān)系在生成臨時表時候執(zhí)行,where是在臨時表生成后對數(shù)據(jù)進行篩選的。
  • group by 子句將中的唯一的值組合成為一組,得到虛擬表vt5。如果應(yīng)用了group by,那么后面的所有步驟都只能得到的vt5的列或者是聚合函數(shù)(count、sum、avg等)。原因在于最終的結(jié)果集中只為每個組包含一行。這一點請牢記。
  • 應(yīng)用avg或者sum選項,為vt5生成超組,生成vt6.
  • 應(yīng)用having篩選器,生成vt7。having篩選器是第一個也是為唯一一個應(yīng)用到已分組數(shù)據(jù)的篩選器。
  • 處理select子句。將vt7中的在select中出現(xiàn)的列篩選出來。生成vt8.
  • 應(yīng)用distinct子句,對vt8進行去重,生成vt9。
  • 應(yīng)用order by子句。按照order_by_condition排序vt9,此時返回的一個游標(biāo),而不是虛擬表。
  • 應(yīng)用limit選項。生成vt10返回結(jié)果給請求者即用戶。

MySQL的執(zhí)行順序

SELECT語句定義

一個完整的SELECT語句包含可選的幾個子句。SELECT語句的定義如下:

<SELECT clause> 
[<FROM clause>] 
[<WHERE clause>] 
[<GROUP BY clause>] 
[<HAVING clause>] 
[<ORDER BY clause>] 
[<LIMIT clause>] 

SELECT子句是必選的,其它子句如WHERE子句、GROUP BY子句等是可選的。 

一個SELECT語句中,子句的順序是固定的。例如GROUP BY子句不會位于WHERE子句的前面。 

SELECT語句執(zhí)行順序

SELECT語句中子句的執(zhí)行順序與SELECT語句中子句的輸入順序是不一樣的,所以并不是從SELECT子句開始執(zhí)行的,而是按照下面的順序執(zhí)行:

開始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句->最終結(jié)果

每個子句執(zhí)行后都會產(chǎn)生一個中間結(jié)果,供接下來的子句使用,如果不存在某個子句,就跳過

對比了一下,MySQL和sql執(zhí)行順序基本是一樣的, 標(biāo)準(zhǔn)順序的 SQL 語句為:

select empName, max(salary) as maxSalary 
from t_emp 
where empName is not null 
group by empName 
having max(salary) > 2000 
order by maxSalary

在上面的示例中 SQL 語句的執(zhí)行順序如下:

(1). 首先執(zhí)行 FROM 子句, 從 t_emp 表組裝數(shù)據(jù)源的數(shù)據(jù)

(2). 執(zhí)行 WHERE 子句, 篩選 t_emp 表中所有數(shù)據(jù)不為 NULL 的數(shù)據(jù)

(3). 執(zhí)行 GROUP BY 子句, 把 t_emp 表按 empName 列進行分組

? (注:這一步開始才可以使用select中的別名,他返回一個游標(biāo),而不是一個表,所以在where中不可以使用select中的別名,而having卻可以使用)

(4). 計算 max() 聚集函數(shù), 按 maxSalary 求出總薪酬中最大的一些數(shù)值

(5). 執(zhí)行 HAVING 子句, 篩選員工的總薪酬大于 2000的.

(7). 執(zhí)行 ORDER BY 子句, 把最后的結(jié)果按 maxSalary 進行排序.

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql如何查詢兩個日期之間最大的連續(xù)登錄天數(shù)

    mysql如何查詢兩個日期之間最大的連續(xù)登錄天數(shù)

    在現(xiàn)在的很多網(wǎng)站中都有這樣一個功能。記錄用戶的連續(xù)登陸天數(shù),所謂的連續(xù)在線是指相鄰兩天都登錄過,不一定一直在線,但是只要有過登錄即可。這篇文章主要介紹的是利用sql語句如何查詢在兩個日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來一起看看吧。
    2016-10-10
  • 貌似很強的mysql備份策略分享

    貌似很強的mysql備份策略分享

    貌似很強的mysql備份策略,號稱天下無敵,哈哈,有需要的朋友參考下吧
    2013-02-02
  • MySQL分區(qū)表分區(qū)策略詳解

    MySQL分區(qū)表分區(qū)策略詳解

    這篇文章主要介紹了MySQL分區(qū)表分區(qū)策略詳解,分區(qū)是一種表的設(shè)計模式,通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個小表。但是對于應(yīng)用程序來講,分區(qū)的表和沒有分區(qū)的表是一樣的,需要的朋友可以參考下
    2023-07-07
  • MySQL常用日期時間函數(shù)示例詳解

    MySQL常用日期時間函數(shù)示例詳解

    MySQL提供了大量的日期和時間函數(shù),這些函數(shù)用于在查詢中處理和操作日期與時間值,這篇文章主要介紹了MySQL常用日期時間函數(shù),需要的朋友可以參考下
    2024-06-06
  • Mysql給普通分頁查詢結(jié)果加序號實操

    Mysql給普通分頁查詢結(jié)果加序號實操

    這篇文章主要介紹了Mysql給普通分頁查詢結(jié)果加序號實操,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用

    DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用

    本篇文章小編為大家介紹,DBA應(yīng)該知道的一些關(guān)于SQL Server跟蹤標(biāo)記的使用。需要的朋友參考下
    2013-04-04
  • MySQL死鎖產(chǎn)生的原因和解決方法

    MySQL死鎖產(chǎn)生的原因和解決方法

    死鎖是指兩個或兩個以上的進程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進下去.此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,本文就給大家介紹一下MySQL死鎖產(chǎn)生的原因和解決方法
    2023-07-07
  • MySQL數(shù)據(jù)庫中遇到no?database?selected問題解決辦法

    MySQL數(shù)據(jù)庫中遇到no?database?selected問題解決辦法

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫中遇到no?database?selected問題的解決辦法,這是MySQL數(shù)據(jù)庫的錯誤提示,意思是沒有選擇數(shù)據(jù)庫,在使用MySQL命令行操作時需要先選擇要操作的數(shù)據(jù)庫,否則就會出現(xiàn)這個錯誤,需要的朋友可以參考下
    2024-03-03
  • mysql source 命令導(dǎo)入大的sql文件的方法

    mysql source 命令導(dǎo)入大的sql文件的方法

    本文將詳細(xì)介紹mysql source 命令導(dǎo)入大的sql文件的方法;需要的朋友可以參考下
    2012-11-11
  • mysql常用函數(shù)之group_concat()、group by、count()、case when then的使用

    mysql常用函數(shù)之group_concat()、group by、count()、case whe

    本文主要介紹了mysql常用函數(shù)之group_concat()、group by、count()、case when then的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論

涡阳县| 大同县| 察雅县| 尚义县| 杭州市| 全椒县| 方城县| 东山县| 彭山县| 澎湖县| 辽源市| 朔州市| 彰化市| 天津市| 丁青县| 婺源县| 马鞍山市| 平度市| 邹城市| 米易县| 内黄县| 汤原县| 册亨县| 项城市| 大田县| 石屏县| 南木林县| 黔西县| 张家港市| 满洲里市| 屯昌县| 兰坪| 宜君县| 尚志市| 海口市| 连江县| 莎车县| 庆安县| 新建县| 綦江县| 天柱县|