MySQL 学习笔记(17)— SQL 执行顺序
生活随笔
收集整理的這篇文章主要介紹了
MySQL 学习笔记(17)— SQL 执行顺序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
以查詢語句為例,我們看下面的查詢語句:
(6)SELECT [DISTINCT | ALL] col1, col2, agg_func(col3) AS alias
(1) FROM t1 JOIN t2
(2) ON (join_conditions)
(3) WHERE where_conditions
(4) GROUP BY col1, col2
(5)HAVING having_condition
(7) UNION [ALL]...
(8) ORDER BY col1 ASC,col2 DESC
(9)OFFSET m ROWS FETCH NEXT num_rows ROWS ONLY;
以上是 SQL 中各種關(guān)鍵字的編寫順序,前面括號內(nèi)的數(shù)字代表了它們的邏輯執(zhí)行順序。也就是說, SQL 并不是按照編寫順序先執(zhí)行 SELECT ,然后再執(zhí)行 FROM 子句。從邏輯上講, SQL 語句的執(zhí)行順序如下:
- 首先,
FROM和JOIN是SQL語句執(zhí)行的第一步。它們的邏輯結(jié)果是一個笛卡爾積,決定了接下來要操作的數(shù)據(jù)集。注意邏輯執(zhí)行順序并不代表物理執(zhí)行順序,實際上數(shù)據(jù)庫在獲取表中的數(shù)據(jù)之前會使用ON和WHERE過濾條件進(jìn)行優(yōu)化訪問; - 其次,應(yīng)用
ON條件對上一步的結(jié)果進(jìn)行過濾并生成新的數(shù)據(jù)集; - 然后,執(zhí)行
WHERE子句對上一步的數(shù)據(jù)集再次進(jìn)行過濾。WHERE和ON大多數(shù)情況下的效果相同,但是外連接查詢有所區(qū)別,我們將會在下文給出示例; - 接著,基于
GROUP BY子句指定的表達(dá)式進(jìn)行分組;同時,對于每個分組計算聚合函數(shù) agg_func 的結(jié)果。經(jīng)過GROUP BY處理之后,數(shù)據(jù)集的結(jié)構(gòu)就發(fā)生了變化,只保留了分組字段和聚合函數(shù)的結(jié)果; - 如果存在
GROUP BY子句,可以利用HAVING針對分組后的結(jié)果進(jìn)一步進(jìn)行過濾,通常是針對聚合函數(shù)的結(jié)果進(jìn)行過濾; - 接下來,
SELECT可以指定要返回的列;如果指定了DISTINCT關(guān)鍵字,需要對結(jié)果集進(jìn)行去重操作。另外還會為指定了AS的字段生成別名; - 如果還有集合操作符(
UNION、INTERSECT、EXCEPT)和其他的SELECT語句,執(zhí)行該查詢并且合并兩個結(jié)果集。對于集合操作中的多個SELECT語句,數(shù)據(jù)庫通常可以支持并發(fā)執(zhí)行; - 然后,應(yīng)用
ORDER BY子句對結(jié)果進(jìn)行排序。如果存在GROUP BY子句或者DISTINCT關(guān)鍵字,只能使用分組字段和聚合函數(shù)進(jìn)行排序;否則,可以使用FROM和JOIN表中的任何字段排序; - 最后,
OFFSET和FETCH(LIMIT、TOP)限定了最終返回的行數(shù)。
總結(jié)
以上是生活随笔為你收集整理的MySQL 学习笔记(17)— SQL 执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原清则流清的下一句是什么啊?
- 下一篇: 都不值到要看什么电影了,推荐电影?