SQL中的Where,Group By,Order By和Having


說到SQL語句,大家最開始想到的就是他的查詢語句:

select * from tableName;

這是最簡單的一種查詢方式,不帶有任何的條件。

當然在我們的實際應用中,這條語句也是很常用到的,當然也是最簡單的。在考慮到性能的時候,我們一般不這么寫!具體怎么寫,請關注后續的文章。。。

下面我們着重的看下文章標題所提到的幾個子句。

一、Where

在英文中翻譯為:在哪里,在什么地方。

在SQL語句中又該如何進行翻譯呢?

如下一句:

select * from tableName where id="2012";

就是尋找表tableName中,id=2012的記錄。

這里的where對查詢的結果進行了篩選。只有滿足where子句中條件的記錄才會被查詢出來。

對於where子句沒什么高深的東西,而且也是最常見的東西,大家都太熟了。在這里不進行過多的介紹哈!

二、Group By

group by子句,我們放在select子句中的列必須也要放在group by子句中,除非在select子句中不指定任何列。 這句總感覺有問題?請大牛指點。

我們先看上面的這個表格,假如現在讓你找出Apple在China,Japan,USA的平均價格,你怎么辦?

我們可以這么做:select avg(price) from tablename where fruitname="apple";

Group By 一般是和一些聚合函數一起使用,比如上面我們用到的求平均的函數avg,還有求和sum,求個數count,求最大max,求最小min and so on.

對於上表,求每種水果的最大的價格:select fruitname,productplace,max(price) from tablename group by fruitname

Group By 還有一個重要的合作對象,他就是having

三、Having

我們用Group By 進行分組后,如何對分組后的結果進行一個篩選呢?having來幫您解決這個難題。

1.首先看一個例子:求平均價格在3.0以上的水果

如果我們使用這個:

select fruitname,avg(price) from tablename where avg(price)>=3.0 group by fruitname ;

這樣能否達到我們的要求呢?

答案是否定的,因為where子句不能使用聚合函數。為了解決這個問題,我們來用下我們的殺手鐧,他就是Having;

改寫如下:select fruitname,avg(price) from tablename group by fruitname having avg(price)>=3.0;

2.我們繼續看Having的另外一個匪夷所思

select fruitname,avg(price) from tablename group by fruitname having price<2.0;

這個查詢的結果你們覺得會是什么呢?

沒錯,就是 orange 0.8 ;只有這一條記錄

為什么呢?為什么Apple沒有被查到呢,因為apple的有的價格超出了2.0.

另外運算符in也可以用在having 子句。

select fruitname,avg(price) from tablename group by fruitname having fruitname in ("orange","apple");

四、Order By

Order By是對查詢的結果進行一個再排序的過程,一般放在查詢語句的最后,可以是單列,也可以實現多列的排序。

分為升序asc和降序desc,默認的為升序。

Order By單列的排序比較簡單,多列的也不麻煩。

select * from tablename group by friutname order by fruitname asc,price desc.


轉自:http://blog.csdn.net/qitian0008/article/details/7840845


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM