mysql命令书写顺序_MySQL SQL语句书写顺序和执行顺序
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招行信用卡账单分期手续费是多少 招行信用
- 下一篇: PHP mysql数据迁移,如何自动化P