1. 書寫順序
select->distinct->from->join->on->where->group by->having->order by->limit
2. 執行順序
from->on->join->where->group by->sum、count、max、avg->having->select->distinct->order by->limit
3. 詳細說明
from: 需要從哪個數據表檢索數據;
join: 對需要關聯查詢的表進行關聯;
關聯查詢時,數據庫會選擇一個驅動表,然后用此表的記錄去關聯其他表;
left join一般以左表為驅動表(right join一般為右表),inner join一般以結果集少的表為驅動表;
left join某些情況下會被查詢優化器優化為inner join.
on: 關聯條件
where: 過濾表中數據的條件;
執行順序: 自下而上、從右到左.
注: 對數據庫記錄生效,
無法對聚合結果生效,
可以過濾掉最大數量記錄的條件必須寫在where子句末尾,
不能使用聚合函數(sum、count、max、avg).
group by: 如何將上面過濾出的數據分組;
執行順序: 從左往右.
注: 盡量在group by之前使用where過濾,避免之后使用having過濾.
avg: 求平均值;
having: 對上面已經分組的數據進行過濾的條件;
注: 對聚合結果過濾,因此很耗資源,可以使用聚合函數.
例: 篩選統計人口數量大於100W的地區.
select region,sum(population),sum(area) from bbc group by region having sum(population)>1000000
不能用where篩選超過100W的地區,因為不存在這樣的一條記錄.
select: 查看結果集中的哪個列或列的計算結果;
distinct: 對結果集重復值去重;
order by: 按照什么樣的順序來查看返回的數據;
執行順序: 從左到右.
注: 很耗資源.
limit: 截取出目標頁數據.