----Mysql Select 語句執(zhí)行順序
SQL查詢的大致語法結(jié)構(gòu)如下
(5)select distinct <select_list>
(1) from <left_table> <join_type> join <right_table> on <on_predicate>
(2) where <where_predicate>
(3) group by <group_by_specification>
(4)having <having_predicate>
(6)order by <order _by_list>
(7)limit n,m
查詢處理的順序如下:
1.from
2.on
3.join
4.where
5.group by
6.having
7.select
8.distinct
9.order by
10.limit
這些步驟執(zhí)行時宁改,每個步驟都會產(chǎn)生一個虛擬表朴读,該虛擬表被用作
下一個步驟的輸入盾舌。這些虛擬表對調(diào)用者(客戶端應用程序或者外
部查詢)不可用。只是最后一步生成的表才會返回給調(diào)用者志衣。如果
沒有在查詢中指定某一子句屯援,將跳過相應的步驟
select各個階段分別干了什么:
1.from階段
from階段標識出查詢的來源表,并處理表運算符念脯。在涉及到聯(lián)接運算的查詢中(各種join),主要有以下幾個步驟:
求笛卡爾積弯淘。不論是什么類型的聯(lián)接運算绿店,首先都是執(zhí)行交叉連接(CROSS JOIN),求笛卡兒積(Cartesian product)庐橙,生成虛擬表VT1-J1假勿。
ON篩選器。 這個階段對上個步驟生成的VT1-J1進行篩選态鳖,根據(jù)ON子句中出現(xiàn)的謂詞進行篩選转培,讓謂詞取值為true的行通過了考驗,插入到VT1-J2浆竭。
添加外部行浸须。如果指定了OUTER JOIN惨寿,如LEFT OUTERJOIN、RIGHT OUTER JOIN)删窒,還需要將VT1-J2中沒有找到匹配的行裂垦,作為外部行添加到VT1-J2中,
生成VT1-J3肌索。如果FROM子句包含兩個以上表蕉拢,則對上一個連接生成的結(jié)果表VT1-J3和下一個表重復依次執(zhí)行3個步驟,直到處理完所有的表為止诚亚。
2.where階段
WHERE階段是根據(jù)<where_predicate>中條件對VT1中的行進行篩選晕换,讓條件成立的行才會插入到VT2中。此時數(shù)據(jù)還沒有分組站宗,所以不能在WHERE中出現(xiàn)對統(tǒng)計的過濾闸准。
3.group by
GROUP階段按照指定的列名列表,將VT2中的行進行分組份乒,生成VT3恕汇。最后每個分組只有一行。在GROUP BY階段或辖,數(shù)據(jù)庫認為兩個NULL值是相等的瘾英,因此會將NULL值分到同一個分組中。
4.having
該階段根據(jù)HAVING子句中出現(xiàn)的謂詞對VT3的分組進行篩選颂暇,并將符合條件的組插入到VT4中缺谴。COUNT(expr) 會返回expr不為NULL的行數(shù),count(1)耳鸯、count(*)會返回包括NULL值在內(nèi)的所有數(shù)量湿蛔。
5.select
這個階段是投影的過程,處理SELECT子句提到的元素县爬,產(chǎn)生VT5阳啥。這個步驟一般按下列順序進行:
計算SELECT列表中的表達式,生成VT5-1财喳。
若有DISTINCT察迟,則刪除VT5-1中的重復行,生成VT5-2耳高。
6.order by
根據(jù)ORDER BY子句中指定的列明列表扎瓶,對VT5-2中的行,進行排序泌枪,生成VT6概荷。如果不指定排序,數(shù)據(jù)并非總是按照主鍵順序進行排序的碌燕。NULL被視為最小值误证。
7.limit
取出指定行的記錄继薛,產(chǎn)生虛擬表VT7,并返回給查詢用戶雷厂。LIMIT n, m的效率是十分低的惋增,一般可以通過在WHERE條件中指定范圍來優(yōu)化 WHERE id > ? limit 10。
----結(jié)構(gòu)化查詢語言分類
結(jié)構(gòu)化查詢語言可分為5類
數(shù)據(jù)查詢語言(DQL:Data Query Language):
語句主要包括select,用于從表中檢索數(shù)據(jù)
數(shù)據(jù)操作語言(DML:Data Manipulation Language):
語句主要包括insert,updata和delete,用于添加改鲫,修改和刪除表中的行數(shù)據(jù)诈皿。
事務處理語言(TPL:Transaction Process Language):
語句主要包括commit和rollback,用于提交和回滾
數(shù)據(jù)控制語言(DCL:Data Control Language):
語句主要包括grant和revoke,用于進行授權(quán)和收回權(quán)限
數(shù)據(jù)定義語言(DDL:Data Definition Language):
語句主要包括create,drop,alter,用于定義、銷毀像棘、修改數(shù)據(jù)庫對象稽亏。