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

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

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

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

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

SQL執(zhí)行順序

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

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

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

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

查詢語(yǔ)句都是從from開(kāi)始執(zhí)行的,在執(zhí)行過(guò)程中,每個(gè)步驟都會(huì)為下一個(gè)步驟生成一個(gè)虛擬表,這個(gè)虛擬表將作為下一個(gè)執(zhí)行步驟的輸入。

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

MySQL的執(zhí)行順序

SELECT語(yǔ)句定義

一個(gè)完整的SELECT語(yǔ)句包含可選的幾個(gè)子句。SELECT語(yǔ)句的定義如下:

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

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

一個(gè)SELECT語(yǔ)句中,子句的順序是固定的。例如GROUP BY子句不會(huì)位于WHERE子句的前面。 

SELECT語(yǔ)句執(zhí)行順序

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

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

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

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

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 語(yǔ)句的執(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 列進(jìn)行分組

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

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

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

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

總結(jié)

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

相關(guān)文章

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

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

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

    貌似很強(qiáng)的mysql備份策略分享

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

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

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

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

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

    Mysql給普通分頁(yè)查詢結(jié)果加序號(hào)實(shí)操

    這篇文章主要介紹了Mysql給普通分頁(yè)查詢結(jié)果加序號(hào)實(shí)操,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    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)生的原因和解決方法

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

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

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)中遇到no?database?selected問(wèn)題的解決辦法,這是MySQL數(shù)據(jù)庫(kù)的錯(cuò)誤提示,意思是沒(méi)有選擇數(shù)據(jù)庫(kù),在使用MySQL命令行操作時(shí)需要先選擇要操作的數(shù)據(jù)庫(kù),否則就會(huì)出現(xiàn)這個(gè)錯(cuò)誤,需要的朋友可以參考下
    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的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評(píng)論

赤水市| 始兴县| 保山市| 信宜市| 托克托县| 大新县| 紫云| 禄劝| 清流县| 泸水县| 永顺县| 宜黄县| 五莲县| 聊城市| 靖宇县| 会宁县| 宁国市| 河间市| 泽普县| 永登县| 太仓市| 楚雄市| 崇阳县| 洛宁县| 赞皇县| 红桥区| 鄂温| 梁河县| 汪清县| 丁青县| 化隆| 山东省| 万源市| 张家口市| 炉霍县| 闻喜县| 香格里拉县| 廊坊市| 枞阳县| 大英县| 姚安县|