select語句中的列(非聚合函數列),必須出現在group by子句中。
group by子句中的列,不一定要出現在select語句中。
聚合函數只能出現select語句中或者having語句中,一定不能出現在where語句中。
where語句中的條件只能是數據庫中已經存在的字段。
SQL語句的執行順序:
示例SQL:
SELECT * FROM user LEFT JOIN order ON user.id = order.uid
WHERE order.price > 5000
GROUP BY user.name
HAVING count(1) > 8
ORDER BY user.name
LIMIT 0,10
執行順序:
- FROM(將最近的兩張表,進行笛卡爾積)---VT1(VT--->virtual table 虛表)
- ON(將VT1按照它的條件進行過濾)---VT2
- LEFT JOIN(保留左表的記錄)---VT3
- WHERE(過濾VT3中的記錄)--VT4…VTn (根據where的條件個數來看 一個條件產生一個虛表)
- GROUP BY(對VT4的記錄進行分組)---VT5
- HAVING(對VT5中的記錄進行過濾)---VT6
- SELECT(對VT6中的記錄,選取指定的列)--VT7
- ORDER BY(對VT7的記錄進行排序)--遊標
- LIMIT(對排序之後的值進行分頁)
WHERE條件執行順序(影響性能)
不同數據庫where條件的執行順序不同:
1.MySQL:從左到右的執行WHERE條件
2.Oracle:從右到左的執行 WHERE條件
3.postgreSQL:從左到右的執行WHERE條件
因此:
寫WHERE條件的時候,優先級高的部分要去編寫過濾力度最大的條件語句。