009 面試題 SQL語句各部分的執行順序

SQL語句各部分的執行順序
select distinct...from t1 (left/right) join t2  on t1.xx=t2.xx where t1.xx=? and t2.xx=? group by t1.xx having ...order by ... limit ..

where:  篩選條件   分組之前
having: 篩選條件   前提:必然先分組    對分組後的結果再次篩選
where,group by,having三者同時出現,則順序一定為:
	where....group by ... having ....
	
limit用法:
	limit m,n   從索引m處開始,篩選n條件數據 -- 實現分頁
	limit m   從第一條數據開始,篩選前m條


1. from  join   產生虛擬表v1  - 產生的是笛卡爾積
	笛卡爾積:兩表完全連接的結果叫做笛卡爾積,會產生m*n條數據
2. on    根據連接條件進行篩選,基於V1,產生虛擬表v2   
3. left/right join 若是外連接,將主表中的所有數據進行補充到v2表中
4. where   根據查詢條件,從v2中進行數據篩選,產生虛擬表v3
5. group by  對v3分組,產生虛擬表v4
	經常會和聚合函數配合使用,聚合函數的結果在group by之後就會產生
	使用場景: 統計每個班級的學生人數
		select   count(xx)  ....group by bj_id
		    統計每個部門的人數
		select   count(xx)  ... group by d.id
6. having    對分組後的結果再次篩選 ,產生虛擬表v5
7. select    選擇最終要顯示的欄位,產生虛擬表v6
8. distinct  對結果集進行去重,產生虛擬表v7
9. order by  對結果根據某欄位進行升序/降序排列 
10. limit    選擇需要的數據

   where 和having區別:
   	  where是在分組之前進行數據篩選,having是對分組後的結果再次篩選
   	  where,group by,having若同時出現,則三者的順序一定是
   	    where在 group by之前,having在group by之後