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之後