1. 程式人生 > >SQL中Where和Having的區別---正確理解

SQL中Where和Having的區別---正確理解

Where和Having到底有啥區別,相信很多人都有過困擾,本人之前也是似懂非懂,前幾天接了阿里的一個電話面試,資料庫的部分就被這個問題給難倒了,支支吾吾只說了“在不能用where的時候就應該選擇having”,其他的啥也不會了。

今天寫sql時又用了having(雖然還是不太懂這是啥玩意),於是空下來終於狠查一波資料,現在總算有了一些眉目了。

首先從整體宣告的角度來理解:

                                                     “Where”是一個約束宣告,在查詢資料庫的結果返回之前對資料庫中的查詢條件進行約束,即在結果返回之前起作用,且where後面不能使用“聚合函式”;

                                                     “Having”是一個過濾宣告,所謂過濾是在查詢資料庫的結果返回之後進行過濾,即在結果返回之後起作用,並且having後面可以使用“聚合函式”。

因為聚合函式是比較where和having的關鍵,所以先說下聚合函式。所謂聚合函式,是對一組值進行計算並且返回單一值的函式,在sql中常見於下面幾個字眼:sum---求和,count---計數,max---最大值,avg---平均值等。

接下來從使用的角度:

                                      where後面之所以不能使用聚合函式是因為where的執行順序在聚合函式之前,如下面這個sql語句:

                                                 select  sum(score) from student  group by student.sex where sum(student.age)>100;

                                      having既然是對查出來的結果進行過濾,那麼就不能對沒有查出來的值使用having,如下面這個sql語句:

                                                  select  student.id,student.name from student having student.score >90;

下面給出一個where 和 having組合使用的sql語句:

                                      selectsum(score) from student where sex='man'groupby name havingsum(score)>210;