[mysql] select的子句 where,group by, having, order by, limit的使用順序及實例

-- 語法:

1
2
3
4
5
6
7
SELECT select_list   
FROM table_name  
WHERE search_condition ]  
GROUP BY group_by_expression ]  
HAVING search_condition ]  
ORDER BY order_expression [ ASC DESC ] ]
[limit m,n]

 -- 思考: oracle 怎麼來限制結果集的行數? limit嗎? --- no, 用 rownumber

  
-- 示例:
-- limit 0,10是從第一條開始,取10條數據
1
2
3
4
5
select classNo  from table_name 
group by classNo  
having(avg(成績)>70)
order by classNo 
limit 0,10

  

 
說明:

1.where 

where後跟條件用來篩選我們所需的行。它後面可以跟的操作符有=、!=、<、>、<=、>=、 in、 like(可以和通配符%結合一起用,效果將會更好) 、between....and........ AND、OR 、NOT 

如:select id,name,score form student where score in (每組裏面的最高分組合); 

2.group by(GROUP BY 語句用於結合合計函數(也叫聚合函數sum count avg max min),根據一個或多個列對結果集進行分組。否則沒有多大的意義)

group by 有一個原則,就是 select 後面的所有列中,沒有使用聚合函數的列,必須出現在 group by 後面
如:我們對文字的分類id進行分組,查詢每組分類的文章數 select articlecategory_id,count(*) from article group by articlecategory_id;
再次提示:
如果你使用了group by,而沒有相應的使用聚合函數那麼結果就沒有意義了,按照實際情況來思考的話就變成了一對多了(也就是一個分組對應多個對象(也就是多行),那麼一個分組對應多行數據的顯示就變成了分組和第一行數據進行顯示了,所以此時我們應該使用聚合函數(聚合函數就是把多個變成一),也就是對多行數據進行篩選,得到我們想要的數據,如:可以使用count計算論壇小組總帖子數,可以使用sum來計算
論壇小組帖子總回覆數,可以使用max來計算論壇小組最多回復的帖子,可以使用min來計算論壇小組最少回覆數(沒有多大意義,商城最便宜的商品就意義了),可以使用avg來計算論壇每週的平均訪問量(商城所有商品的平均價格)等。

3.having 這個是針對查詢的結果進行作用,只能對結果擁有的列進行操作,與where不同的是where是針對原表(就是from後面的那張表的字段)發揮作用。其中having裏面可以使用聚合函數。爲group by子句設置條件,類似於where爲select語句設置條件的方法。having的查找條件可以包括集合函數表達式。除此之外,它的查找條件與where查找條件相同。

select articlecategory_id,count(*) from article group by articlecategory_id having count(*)<5;

4.order by 排序 (可以對多個字段進行排序)

可以針對字段進行排序,order by 字段1 [asc] 升序,[desc] 降序

5.limit 獲取條目的限定

語法 limit offset,N

limit 5 《====》 limit 0,5;

總結:where是針對from後面跟的表進行處理,而group by having order by limit則是針對select後面的字段進行處理。從它們的結構角度來看則:先整體後部分。

出自: http://www.cnblogs.com/billyu/p/5033167.html

發佈了20 篇原創文章 · 獲贊 29 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章