SQL server T-sql語句查詢執行順序


前言

數據庫的查詢執行,毋庸置疑是程序員必備的技能之一,然而數據庫查詢執行的過程絢爛多彩,卻是很少被人了解,今天我們來深入了解下sql查詢的來龍去脈,為查詢的性能優化打個基礎

這篇博客,摒棄查詢優化性能,作為其基礎,只針對查詢流程講解剖析。

本片博客闡述的過程為

1、上一個標識過的sql語句,展示查詢執行的流程

2、上一個流程圖

3、做一個例子逐步深入分析,幫助理解

4、做一個裝逼的總結

sql查詢語句的處理步驟,代碼清單

--查詢組合字段
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
--連表
(1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>
        (1-A)<left_table><apply_type> apply <right_table_expression> as <alias>
        (1-P)<left_table> pivot (<pivot_specification>) as <alias>
        (1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查詢條件
(2)where <where_pridicate>
--分組
(3)group by <group_by_specification>
--分組條件
(4)having<having_predicate>
--排序
(6)order by<order_by_list>

說明:

1、順序為有1-6,6個大步驟,然后細分,5-1,5-2,5-3,由小變大順序,1-J,1-A,1-P,1-U,為並行次序。如果不夠明白,接下來我在來個流程圖看看。

2、執行過程中也會相應的產生多個虛擬表(下面會有提到),以配合最終的正確查詢。

sql查詢語句的處理步驟,流程圖

 

221335571249071

實例准備,創建表,插入數據,寫要分析的實例查詢語句

1、首先創建2各表

221356460622813

3、編寫咱們要解析的查詢語句,即本篇要查詢的實例語句。

select top(4)  status , max(m.id) as maxMemberID
from [dbo].[Member] as m right outer join [dbo].[Order] as o 
on m.id=o.member_id 
where m.id>0 group by status having status>=0 order by maxMemberID asc

實例語句分步驟分析

第一步,從from開始。

1.1、加載左表

from [dbo].[Member] as m 

查詢結果:member表中的所有數據

1.2、這里應該是 right outer join ,但是這里在sql中被定義分解為2個步驟,即join ,right outer join 。表達式關鍵字從左到右,依次執行。

join [dbo].[Order] as o 

查詢結果:存入虛擬表vt1,為兩個表的笛卡爾集合。這里你或許不明白什么叫笛卡爾集合,我打個比方給說說,還望不要嫌棄,就是小朋友握手問題,A班里有3個學生(看作一個表的三條數據),B班里有2個學生(看作另外一個表的2條數據).B班小朋友跟A班小朋友搞聯歡晚會,首先要每個人都要確保跟另外一個班的同學握一下手,那么交叉出來的集合就是(2*3=6)有6條不同的軌跡。這個軌跡的集合就是笛卡爾集合。如果你還不明白,我再說下,就是m(5條數據)表中的第一條數據跟o(7條數據)表中的所有數據握下手,有7條,然后依次類推共有35條不同的數據。這里的null值也是要加進來的。

1.3、on 篩選器

on m.id=o.member_id 

查詢結果:

從上一步的笛卡爾集合35條數據中刪除掉不匹配的行,就得到啦5條數據,存入虛擬表Vt2

1.4、添加外部行(outer row)

right outer join [dbo].[Order] as o 

查詢結果為:

右表(order)作為保留表,把剩余的數據重新添加到上一步的虛擬表中vt2,生成虛擬表vt3.

第二部,進入where階段

where m.id>0

查詢結果:存入虛擬表vt4,為篩選的條件為true的結果集,這里加入一個記憶點,就是,where的篩選刪除為永久的,而on的篩選刪除為暫時的,因為on篩選過后,有可能會經過outer添加外部行,重新把數據加載回來,而where則不能。

第三部,group by分組

group by status

查詢結果:存入vt5,以status列的數值開始分組,即status列,值一樣的分為一組,這里的兩個null在三值邏輯中被視為true。三值邏輯:true,false,null。此三值,null為未知,是數據的邏輯特色,有的地方兩個null相等為ture,在有些地方則為false。這個你百度下看看有很多講解。

第四步,having篩選器

having status>=0

查詢結果:篩選分好組的組數據,把不滿足條件的刪除掉

第五步,select查詢挑揀計算列

5.1、計算表達式

select status , max(m.id)

查詢結果:從分過組的數據中計算各個組中的最大m.id,列出要篩選顯示的列。

5.2、distinct過濾重復

5.3、top 結合order by 篩選 多少行,但這里的數據沒有排序只是把多少行數據列出來而已。

第六部,order by 排序顯示。

原文地址http://www.cnblogs.com/knowledgesea/p/4177830.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM