order by 和 group by 的區別
order by 和 group by 的區別:
1,order by 從英文里理解就是行的排序方式,默認的為升序。 order by 后面必須列出排序的字段名,可以是多個字段名。
2,group by 從英文里理解就是分組。必須有“聚合函數”來配合才能使用,使用時至少需要一個分組標志字段。
注意:聚合函數是---sum()、count()、avg()等都是“聚合函數”
自己慢慢去理解的過程。。。。
為什么group by必須要用聚合函數?自己不斷在數據庫語句寫了,摸索了半個小時,,真是愚鈍
數據庫表:
各種語句的測試:
select product from orders 查詢所有product列,包括重復的
select product from orders GROUP BY product:查詢結果只輸出product不同的元素列,不包括重復的
select product,price from orders 查詢所有的product列值,包括重復的。如果兩個bb合在一起的話,那么price就查不出來 了,如下:
group by product 將product 相同的元素聚合在一起,去掉重復列,那么price將沒有意義
只有 聚合在一起的東西才有意義,如聚合在一起的price之和(sum(price))就有意義了,有點感覺了
select product,sum(price) from orders GROUP BY product :這樣才不會報錯。
select product,sum(price) from orders GROUP BY product
//依照前面的(GROUP BY product)就是按 product分組,那么重復的aa就會聚集在一起,那么如果要繼續查找 select product,price 繼續查找price的話,price就不存在了。。因為重復的aa聚合在一起了。所以只能用一些聚合函數來玩,sum(price)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
那么我group by之后還要篩選一下sum(price) >100的product呢?
一開始我直接這么寫的,很正常的思路啊、、
select product,sum(price) from orders where sum(price) GROUP BY product
然后查了一波資料,才知道where后面不能接聚合函數?????!!!!
具體原因:https://blog.csdn.net/w2232097312/article/details/52211201
簡短來說是因為:聚合函數是針對結果集進行的,但是where條件並不是在查詢出結果集之后運行,所以主函數放在where語句中,會出現錯誤
那么只能用另外一種方法:havaing。having就是專門為了應付這種情況而發明出來的。。。
select product,sum(price) from orders GROUP BY product HAVING sum(price)>100
換種寫法,答案就出來了。。。
其他 擴展問題。。。
group by不能跟where一起用嗎?
可以。注意:where肯定在group by 之前。
一,group by 字句也和where條件語句結合在一起使用。當結合在一起時,where在前,group by 在后。即先對select xx from xx的記錄集合用where進行篩選,然后再使用group by 對篩選后的結果進行分組 使用having字句對分組后的結果進行篩選。
二,需要注意having和where的用法區別:
1.having只能用在group by之后,對分組后的結果進行篩選(即使用having的前提條件是分組)。
2.where肯定在group by 之前。
3.where后的條件表達式里不允許使用聚合函數,而having可以。
三,當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序是:
1.執行where xx對全表數據做篩選,返回第1個結果集。
2.針對第1個結果集使用group by分組,返回第2個結果集。
3.針對第2個結果集中的每1組數據執行select xx,有幾組就執行幾次,返回第3個結果集。
4.針對第3個結集執行having xx進行篩選,返回第4個結果集。
5.針對第4個結果集排序。
再來個order by這就是理解的過程。。。
select product,sum(price) from orders GROUP BY product HAVING sum(price)>100 ORDER BY sum(price);
---------------------
原文:https://blog.csdn.net/sinat_40692412/article/details/81200133