select 列a,聚合函數 from 表名 where 過濾條件 group by 列a having 過濾條件
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個結果集排序。
例子:
完成一個復雜的查詢語句,需求如下:
按由高到低的順序顯示個人平均分在70分以上的學生姓名和平均分,為了盡可能地提高平均分,在計算平均分前不包括分數在60分以下的成績,並且也不計算賤人(jr)的成績。
分析:
1.要求顯示學生姓名和平均分
因此確定第1步
1
|
select
s_name,
avg
(score)
from
student
|
2.計算平均分前不包括分數在60分以下的成績,並且也不計算賤人(jr)的成績
因此確定第2步
1
|
where
score>=60
and
s_name !=’jr’
|
3.顯示個人平均分
相同名字的學生(同一個學生)考了多門科目 因此按姓名分組
確定第3步
1
|
group
by
s_name
|
4.顯示個人平均分在70分以上
因此確定第4步
1
|
having
avg
(s_score)>=70
|
5.按由高到低的順序
因此確定第5步
1
|
order
by
avg
(s_score)
desc
|
前面也記錄一篇
http://www.2cto.com/database/201212/179348.html
五、索引
1.索引是單獨的
數據庫對象,索引也需要被維護。
2.索引可以提高查詢速度,但會降增刪改的速度。
3.通過一定的查詢觸發,並不是越多越好。
什么時候不適合用索引?
1.當增刪改的操作大於查詢的操作時。
2.查詢的語句大於所有語句的三分之一時。
1
2
|
創建索引語法:
create
index
索引名
on
表明 (列名)
刪除索引語法:
drop
index
索引名
|