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

詳細(xì)講一講MySQL中Select語(yǔ)句的執(zhí)行順序

 更新時(shí)間:2026年01月15日 09:36:43   作者:練拳百萬(wàn)陳平安  
SQL和MySQL的語(yǔ)句執(zhí)行順序是數(shù)據(jù)庫(kù)操作中的關(guān)鍵概念,理解這一順序有助于編寫(xiě)更高效、更精確的查詢,這篇文章主要介紹了MySQL中Select語(yǔ)句執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下

MySQL中關(guān)鍵字段的執(zhí)行順序

一句話概括MySQL數(shù)據(jù)庫(kù)中的select查詢語(yǔ)句各個(gè)子句的執(zhí)行順序:
from >> (xxx join) >> where > group by >> 聚合 >>having >> select>> order by >> limit ,union關(guān)鍵字的執(zhí)行順序是不定的,需要具體情況具體分析;

一個(gè)豐滿的SQL舉例

查詢語(yǔ)句都是從from開(kāi)始執(zhí)行的,每個(gè)步驟都會(huì)為下一個(gè)步驟生成一個(gè)虛擬表

(9) SELECT (10) DISTINCT <select_list>
(1) FROM <left_table> <right_table>
(3) <join_type> JOIN <right_table>
(2)  ON <join_condition>
(4).......join thirdTable on ......
(5) WHERE <where_condition>
(6) GROUP BY <group_by_list>
(7) WITH {CUBE|ROLLUP}
(8) HAVING <having_condition>
(11) ORDER BY <order_by_list>
(12) LIMIT <limit_number>

上述的SQL的查詢過(guò)程

1:from執(zhí)行from子句,前兩個(gè)表執(zhí)行第一個(gè)笛卡爾乘積,此時(shí)生成第一個(gè)虛擬表

什么是笛卡兒積?
當(dāng)兩張表進(jìn)行連接查詢,沒(méi)有任何條件限制的時(shí)候,最終查詢結(jié)果條數(shù),是兩張表?xiàng)l數(shù)的乘積,這種現(xiàn)象被稱為:笛卡爾積現(xiàn)象

2:上述形成的虛擬表各行基于on表達(dá)式進(jìn)行篩選,留下符合的生成新的虛擬表

3:將在第二步中形成的虛擬表按照Left或者Right或者Outer關(guān)鍵字,這樣生成新的虛擬表

具體過(guò)程是這樣的
Left JOIN把左表記為基礎(chǔ)保留表,缺失的數(shù)據(jù)使用外部行的方式向虛擬表中進(jìn)行插入,右表部分為Null,形成新的虛擬表
RIGHT JOIN把右表記為基礎(chǔ)保留表,缺失的數(shù)據(jù)使用外部行的方式向虛擬表中進(jìn)行插入,左表部分為Null,形成新的虛擬表

4:超過(guò)兩表關(guān)聯(lián)的情況下,上述新生成的虛擬表和第三個(gè)表計(jì)算笛卡爾乘積,生成虛擬表,重復(fù)1-3的步驟,最終得到一個(gè)新的虛擬表

5:應(yīng)用where篩選器,對(duì)上一步生產(chǎn)的虛擬表引用where篩選器,進(jìn)行最終的數(shù)據(jù)過(guò)濾,生成新的虛擬表;

6:group by后邊列中值一樣的歸為一組組合成為一組,得到新的虛擬表

7:應(yīng)用cube或者rollup選項(xiàng),生成超組,執(zhí)行分組之后的聚合函數(shù),生成新的虛擬表

在這里就不難理解,為什么不能使用計(jì)算表達(dá)式或者別名進(jìn)行分組,因?yàn)?/p>

8:having篩選已分組數(shù)據(jù),生成新的虛擬表

9:處理select子句,保留select后邊定義的列,生成新的虛擬表

10:應(yīng)用distinct子句,移除相同的行,生成新的虛擬表。
事實(shí)上如果應(yīng)用了group by子句那么distinct是多余的,原因同樣在于,分組的時(shí)候是將列中唯一的值分成一組,同時(shí)只為每一組返回一行記錄,那么所以的記錄都將是不相同的;

11:應(yīng)用order by子句,此時(shí)返回的一個(gè)游標(biāo),而不是虛擬表。
正因?yàn)榉祷刂凳怯螛?biāo),那么使用order by 子句查詢不能應(yīng)用于表表達(dá)式,排序是很需要成本的,除非你必須要排序,否則最好不要指定order by,在這一步中是第一個(gè)也是唯一一個(gè)可以使用select列表中別名的步驟。

12: Limit篩選返回的數(shù)據(jù)條數(shù)

對(duì)于包含outer join子句的查詢,到底在on篩選器還是用where篩選器指定邏輯表達(dá)式呢?

on和where的最大區(qū)別在于,如果在on應(yīng)用邏輯表達(dá)式那么在第三步outer join中還可以把移除的行再次添加回來(lái),而where的移除的最終的;

Group函數(shù)的作用?

如果應(yīng)用了group by,那么后面的所有步驟都只能得到的某一列的第一行的值,或者是聚合函數(shù)(count、sum、avg等)

原因在于最終的結(jié)果集中只為每個(gè)組包含一行。這一點(diǎn)請(qǐng)牢記,如果某一行沒(méi)有使用聚集函數(shù),默認(rèn)返回第一行

是先執(zhí)行g(shù)roup by還是先執(zhí)行select

通過(guò)上面的SQL順序執(zhí)行可知,先進(jìn)行g(shù)roup by 在進(jìn)行select

為什么group by和select同時(shí)使用時(shí),select中的字段必須出現(xiàn)在group by后或者聚合函數(shù)中。

如何實(shí)現(xiàn)數(shù)據(jù)去重

在SQL中可以通過(guò)關(guān)鍵字distinct去重,也可以通過(guò)group by分組實(shí)現(xiàn)去重,但實(shí)際上,如果數(shù)據(jù)量很大的話,使用distinct去重的效率會(huì)很慢,使用Group by去重的效率會(huì)更高,而且,很多distinct關(guān)鍵字在很多數(shù)據(jù)庫(kù)中只支持對(duì)某個(gè)字段去重,無(wú)法實(shí)現(xiàn)對(duì)多個(gè)字段去重,如Postgresql數(shù)據(jù)庫(kù)。(測(cè)試數(shù)據(jù)300w+,使用distinct去重需要十幾秒,使用group by去重只需要幾秒)。

應(yīng)用HAVING過(guò)濾中可以使用聚合函數(shù)或者計(jì)算表達(dá)式或者別名進(jìn)行過(guò)濾嗎?

執(zhí)行having的時(shí)候,已經(jīng)執(zhí)行過(guò)第六步的group by以及第七步的的聚合函數(shù)和計(jì)算表達(dá)式的以及別名。所以HAVING過(guò)濾中可以使用聚合函數(shù)或者計(jì)算表達(dá)式或者別名進(jìn)行過(guò)濾嗎

   SELECT * FROM customers c
   LEFT JOIN orders o
   ON c.customer_id = o.customer_id
   WHERE c.city='HangZhou'
   GROUP BY c.customer_id
   HAVING  count(o.order_id) < 2;

哪些Column要放到Group by后邊呢?

這是一個(gè)表

select country ccc,max(count),concat(country,max(count)) bbb,1,concat(country,count) from coutry group by ccc,concat(country,count)

我們?cè)赟elect后邊可以選擇的列包括:自然列,單純聚合函數(shù)、計(jì)算表達(dá)式(不含聚合函數(shù))、常量、計(jì)算表達(dá)式(聚合函數(shù))

其中:

  • group by后邊可放可不放:常量
  • group by必須放:自然列、計(jì)算表達(dá)式(不含聚合函數(shù))
  • group by不允許放:聚合函數(shù)、計(jì)算表達(dá)式(包含聚合函數(shù))

注意:

單純使用case when的話,屬于計(jì)算表達(dá)式(不帶聚合函數(shù))如果使用group by的話,我們是必須和自然列一樣把他放到group by后邊的。

留一個(gè)問(wèn)題:為什么select在order by之前,但是order by可以使用select后并不存在的列進(jìn)行排序呢?

總結(jié)

到此這篇關(guān)于MySQL中Select語(yǔ)句執(zhí)行順序的文章就介紹到這了,更多相關(guān)MySQL Select語(yǔ)句執(zhí)行順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQL慢查詢優(yōu)化方案詳解

    SQL慢查詢優(yōu)化方案詳解

    這篇文章主要介紹了SQL慢查詢優(yōu)化方案詳解,如果你的項(xiàng)目中出現(xiàn)了一些查詢超時(shí)情況,很可能是項(xiàng)目中有了一些慢查詢的情況產(chǎn)生,下面就慢查詢的排查和解決方案進(jìn)行一番分析,需要的朋友可以參考下
    2023-07-07
  • 詳解mysql查詢緩存簡(jiǎn)單使用

    詳解mysql查詢緩存簡(jiǎn)單使用

    這篇文章主要介紹了詳解mysql查詢緩存簡(jiǎn)單使用的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-03-03
  • mysql 查詢當(dāng)天、本周,本月,上一個(gè)月的數(shù)據(jù)

    mysql 查詢當(dāng)天、本周,本月,上一個(gè)月的數(shù)據(jù)

    這篇文章主要介紹了mysql 查詢當(dāng)天、本周,本月,上一個(gè)月的數(shù)據(jù)的sql代碼,在文中還給大家提到了mysql如何查詢當(dāng)天信息,具體內(nèi)容詳情大家參考下本文
    2018-01-01
  • MySQL密碼正確卻無(wú)法本地登錄的解決方法

    MySQL密碼正確卻無(wú)法本地登錄的解決方法

    這篇文章主要介紹了MySQL密碼正確卻無(wú)法本地登錄的解決方法,需要的朋友可以參考下
    2014-12-12
  • MySql恢復(fù)數(shù)據(jù)方法梳理講解

    MySql恢復(fù)數(shù)據(jù)方法梳理講解

    MySQL的binlog日志是MySQL日志中非常重要的一種日志,下面這篇文章主要給大家介紹了關(guān)于mysql如何利用binlog進(jìn)行數(shù)據(jù)恢復(fù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • mysql8.0.21下載安裝詳細(xì)教程

    mysql8.0.21下載安裝詳細(xì)教程

    這篇文章主要介紹了mysql8.0.21下載安裝詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • PHP5 mysqli的prepare準(zhǔn)備語(yǔ)句使用說(shuō)明

    PHP5 mysqli的prepare準(zhǔn)備語(yǔ)句使用說(shuō)明

    mysqli對(duì)prepare的支持對(duì)于大訪問(wèn)量的網(wǎng)站是很有好處的,它極大地降低了系統(tǒng)開(kāi)銷(xiāo),而且保證了創(chuàng)建查詢的穩(wěn)定性和安全性.prepare準(zhǔn)備語(yǔ)句分為綁定參數(shù)和綁定結(jié)果
    2012-12-12
  • mysql5.7.14 解壓版安裝配置方法圖文教程(win10)

    mysql5.7.14 解壓版安裝配置方法圖文教程(win10)

    這篇文章主要為大家詳細(xì)介紹了win10下mysql5.7.14 winx64安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • MySQL?SQL性能分析之慢查詢?nèi)罩?、explain使用詳解

    MySQL?SQL性能分析之慢查詢?nèi)罩?、explain使用詳解

    這篇文章主要介紹了MySQL?SQL性能分析?慢查詢?nèi)罩?、explain使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • linux mint 下mysql中文支持問(wèn)題

    linux mint 下mysql中文支持問(wèn)題

    這篇文章主要介紹了linux mint 下mysql中文支持問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2015-10-10

最新評(píng)論

冷水江市| 铜梁县| 德格县| 韶关市| 繁昌县| 清苑县| 泊头市| 宝丰县| 纳雍县| 门头沟区| 毕节市| 松阳县| 色达县| 石狮市| 巴中市| 乳源| 准格尔旗| 岫岩| 枣阳市| 久治县| 华亭县| 霸州市| 南开区| 蓬溪县| 桂平市| 财经| 青海省| 阿图什市| 黄冈市| 巢湖市| 贡觉县| 崇义县| 泽普县| 株洲县| 乌恰县| 永兴县| 朝阳区| 琼海市| 阿克陶县| 香河县| 婺源县|