日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

      歡迎訪問 生活随笔!

      生活随笔

      當(dāng)前位置: 首頁(yè) >

      mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序

      發(fā)布時(shí)間:2023/12/10 39 豆豆
      生活随笔 收集整理的這篇文章主要介紹了 mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

      SQL語(yǔ)句書寫順序和執(zhí)行順序

      (7) SELECT

      (8) DISTINCT

      (1) FROM

      (3) JOIN

      (2) ON

      (4) WHERE

      (5) GROUP BY

      (6) HAVING

      (9) ORDER BY

      (10) LIMIT

      書寫順序從上向下依次書寫,即:

      SELECT?→FROM?→?JOIN?→?ON?→?WHERE?→?GROUP BY?→?HAVING?→?ORDER BY→?LIMIT

      而執(zhí)行順序按照左側(cè)編號(hào)進(jìn)行。即:

      FROM?→?ON?→?JOIN?→?WHERE?→?GROUP BY?→?HAVING?→?SELECT?→DISTINCT?→?ORDER BY→?LIMIT

      MySql執(zhí)行順序理解

      加載 from關(guān)鍵詞后面跟的表,計(jì)算笛卡爾積,生成虛擬表vt1。這也是sql執(zhí)行的第一步:表示要從數(shù)據(jù)庫(kù)中執(zhí)行哪些表。

      篩選關(guān)聯(lián)表中滿足on表達(dá)式的數(shù)據(jù),保留主表數(shù)據(jù),并生成虛擬表vt2。join表示要關(guān)聯(lián)的表,on代表連接條件。

      如果使用的是外連接,執(zhí)行on的時(shí)候,會(huì)將主表中不符合on條件的數(shù)據(jù)也加載進(jìn)來,作為外部行。

      如果from子句中涉及多張表,則重復(fù)第一步到第三步,直至所有的表都加載完畢,更新vt3。

      執(zhí)行where表達(dá)式,篩選出符合條件的數(shù)據(jù)生成vt4。

      執(zhí)行 group by 子句進(jìn)行分組。分組會(huì)把子句組合成唯一值并且每個(gè)唯一值只包含一行,生成vt5。一旦執(zhí)行g(shù)roup by,后面的所有步驟只能操作vt5中的列(group by的子句包含的列)和聚合函數(shù)。

      溫馨提示:這一步開始才可以使用select中的別名,它返回的是一個(gè)游標(biāo),而不是一張表,所以在where中不可以使用select中的別名,而having卻可以。

      執(zhí)行聚合函數(shù),例如sum、avg等,生成vt6。

      執(zhí)行having表達(dá)式,篩選vt6中的數(shù)據(jù)。having是唯一一個(gè)可以在分組后執(zhí)行的條件篩選表達(dá)式,生成vt7。

      執(zhí)行SELECT,從vt7中篩選列,生成vt8。

      執(zhí)行distinct,對(duì)vt8去重,生成vt9。

      其實(shí)執(zhí)行過group by后就沒必要再去執(zhí)行distinct,因?yàn)榉纸M后,每組只會(huì)有一條數(shù)據(jù),并且每條數(shù)據(jù)都不相同。

      按照order_by_condition 對(duì)vt9進(jìn)行排序,此處亦可以使用別名。這個(gè)過程比較耗費(fèi)資源。

      執(zhí)行 limit 語(yǔ)句,取出指定條數(shù)的結(jié)果集返回給客戶端。

      實(shí)例

      select g.student_id, sum(成績(jī)) as sum成績(jī)

      from t_grade g INNER JOIN t_student s on g.student_id = s.id

      where s.clasz = '高一1班'

      group by g.student_id

      having sum成績(jī) > 600

      order by sum成績(jī)

      在上面的MySQL代碼示例中,SQL 語(yǔ)句的執(zhí)行順序如下:

      首先執(zhí)行 FROM 子句, 從表 t_grade 和 t_student 組裝數(shù)據(jù)源的數(shù)據(jù),執(zhí)行一個(gè)笛卡爾乘積,此時(shí)生成虛擬表 vt1。

      接下來便是應(yīng)用on篩選器,on 中的邏輯表達(dá)式將應(yīng)用到 vt1 中的各個(gè)行,篩選出滿足 on 邏輯表達(dá)式的結(jié)果集,生成虛擬表 vt2。

      由于是 inner join,故把兩張表過濾的行添加進(jìn)來,生成虛擬表vt3。

      執(zhí)行 WHERE 子句, 篩選 vt3中高一1班所有數(shù)據(jù)。

      執(zhí)行 GROUP BY 子句, 按 student_id 列進(jìn)行分組。

      溫馨提示:這一步開始才可以使用select中的別名,它返回的是一個(gè)游標(biāo),而不是一張表,所以在where中不可以使用select中的別名,而having卻可以。

      使用聚合函數(shù) sum() 計(jì)算各位同學(xué)的總成績(jī)。

      執(zhí)行 HAVING 子句, 篩選課程總成績(jī)大于 600 分的學(xué)生。

      知識(shí)擴(kuò)展

      on和where的區(qū)別

      簡(jiǎn)單地說,當(dāng)有外關(guān)聯(lián)表時(shí),on主要是針對(duì)外關(guān)聯(lián)表進(jìn)行篩選,主表保留;當(dāng)不是外關(guān)聯(lián)表時(shí),二者作用相同。例如在左外連時(shí),首先執(zhí)行on,篩選掉外連表中不符合on表達(dá)式的數(shù)據(jù),而where的篩選是對(duì)on關(guān)聯(lián)后的結(jié)果集進(jìn)行篩選。

      limit 分頁(yè)

      若每頁(yè)顯示條目數(shù)記為pageSize,顯示的頁(yè)數(shù)記為page,則有:

      SELECT * FROM table_name LIMIT (page-1)* pageSize, pageSize

      結(jié)束語(yǔ)

      了解了MySQL中SQL的執(zhí)行順序,對(duì)我們開發(fā)者大有裨益,可以寫出更健壯的代碼。

      本文總結(jié)了mysql的書寫順序和執(zhí)行順序,理解這些有助于優(yōu)化sql語(yǔ)句,有助于掌握 MySQL 中的 sql 語(yǔ)句從寫出來到最終執(zhí)行的軌跡,有助于深入和細(xì)致的認(rèn)識(shí) sql,提高數(shù)據(jù)庫(kù)理解能力。同時(shí),對(duì)于復(fù)雜sql的執(zhí)行過程、編寫都會(huì)有一定程度的意義。

      以上就是這篇文章的全部?jī)?nèi)容了,希望本文對(duì)大家的學(xué)習(xí)或者工作具有一定的參考和學(xué)習(xí)價(jià)值;如果有疑問,大家可以在評(píng)論區(qū)留言交流,也希望大家多多點(diǎn)贊關(guān)注。謝謝大家對(duì)樓蘭的胡楊的支持!

      Reference

      總結(jié)

      以上是生活随笔為你收集整理的mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

      如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。