? ? ? ? 這涉及兩個新SELECT語句子句,分別是GROUP BY子句和HAVING子句症虑。
1. GROUP BY?
例:SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;
輸出結果:
? ? ? ? 分析:GROUP BY子句指示MySQL按vend_id排序并分組數(shù)據莉给。這導致對每個vend_id而不是整個表計算num_prods一次。從輸出中可以看到,供應商1001有3個產品尿这,供應商1002有2個產品缴阎,供應商1003有7個產品允瞧,而供應商1005有2個產品。
使用GROUP BY注意事項:
a.?GROUP BY子句可以包含任意數(shù)目的列蛮拔。這使得能對分組進行嵌套述暂,為數(shù)據分組提供更細致的控制。
b.?如果在GROUP BY子句中嵌套了分組建炫,數(shù)據將在最后規(guī)定的分組上進行匯總畦韭。換句話說,在建立分組時肛跌,指定的所有列都一起計算(所以不能從個別的列取回數(shù)據)艺配。
c.?GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數(shù))。如果在SELECT中使用表達式惋砂,則必須在GROUP BY子句中指定相同的表達式妒挎。不能使用別名。
d.?除聚集計算語句外西饵, SELECT語句中的每個列都必須在GROUP BY子句中給出酝掩。
e.?如果分組列中具有NULL值,則NULL將作為一個分組返回眷柔。如果列中有多行NULL值期虾,它們將分為一組原朝。
f.?GROUP BY子句必須出現(xiàn)在WHERE子句之后, ORDER BY子句之前镶苞。
2. HAVING 過濾分組
? ? ? ? 除了能用GROUP BY分組數(shù)據外喳坠, MySQL還允許過濾分組,規(guī)定包括哪些分組茂蚓,排除哪些分組壕鹉。目前為止所學過的所有類型的WHERE 子句都可以用HAVING來替代。唯一的差別是WHERE過濾行聋涨,而HAVING過濾分組晾浴。
例: SELECT vend_id, COUNT(*) AS orders FROM products WHERE prod_price >=10 GROUP BY vend_id HAVING COUNT(*) >= 2;
分析:WHERE子句過濾所有prod_price至少為10的行。然后按vend_id分組數(shù)據牍白, HAVING子句過濾計數(shù)為2或2以上的分組脊凰。
3. 總結SELECT語句中子句的順序