查詢語句中select from where group by having order by的執行順序

查詢語句中select from where group by having order by的執行順序
 
1.查詢中用到的關鍵詞主要包含六個,而且他們的順序依次爲 
select--from--where--group by--having--order by 
 
其中select和from是必須的,其餘關鍵詞是可選的,這六個關鍵詞的執行順序 
與sql語句的書寫順序並非同樣的,而是按照下面的順序來執行 
from--where--group by--having--select--order by, 
from:須要從哪一個數據表檢索數據 
 
where:過濾表中數據的條件 
group by:如何將上面過濾出的數據分組 
having:對上面已經分組的數據進行過濾的條件 
 
select:查看結果集中的哪一個列,或列的計算結果 
order by :按照什麼樣的順序來查看返回的數據 
 
2.from後面的表關聯,是自右向左解析的 
而where條件的解析順序是自下而上的。 
 
也就是說,在寫SQL文的時候,儘可能把數據量小的表放在最右邊來進行關聯(用小表去匹配大表), 
而把能篩選出小量數據的條件放在where語句的最左邊 (用小表去匹配大表)
 

當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序 sql

 使用count(列名)當某列出現null值的時候,count(*)仍然會計算,可是count(列名)不會。 數據庫

2、數據分組(group by ): 函數

select 列a,聚合函數(聚合函數規範) from 代表 where 過濾條件 group by 列a 對象

group by 字句也和where條件語句結合在一塊兒使用。當結合在一塊兒時,where在前,group by 在後。即先對select xx from xx的記錄集合用where進行篩選,而後再使用group by 對篩選後的結果進行分組。 blog

3、使用having字句對分組後的結果進行篩選,語法和where差很少:having 條件表達式 排序

須要注意having和where的用法區別: 索引

1.having只能用在group by以後,對分組後的結果進行篩選(即便用having的前提條件是分組)。 select

2.where確定在group by 以前,即也在having以前。 sql語句

3.where後的條件表達式裏不容許使用聚合函數,而having能夠。 語法

4、當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序是: 

1.執行where xx對全表數據作篩選,返回第1個結果集。 

2.針對第1個結果集使用group by分組,返回第2個結果集。 

4.針對第2個結集執行having xx進行篩選,返回第3個結果集。

3.針對第3個結果集中的每1組數據執行select xx,有幾組就執行幾回,返回第4個結果集。 

 5.針對第4個結果集排序。 

例子: 

完成一個複雜的查詢語句,需求以下: 

按由高到低的順序顯示我的平均分在70分以上的學生姓名和平均分,爲了儘量地提升平均分,在計算平均分前不包括分數在60分如下的成績,而且也不計算賤人(jr)的成績。 分析: 

1.要求顯示學生姓名和平均分 

所以肯定第1步select s_name,avg(score) from student 

2.計算平均分前不包括分數在60分如下的成績,而且也不計算賤人(jr)的成績 

所以肯定第2步 where score>=60 and s_name!=’jr’ 3.顯示我的平均分 

相同名字的學生(同一個學生)考了多門科目 所以按姓名分組 肯定第3步 group by s_name 4.顯示我的平均分在70分以上 

所以肯定第4步 having avg(s_score)>=70 5.按由高到低的順序 

所以肯定第5步 order by avg(s_score) desc 

5、索引  

1.索引是單獨的數據庫對象,索引也須要被維護。 2.索引能夠提升查詢速度,但會降增刪改的速度。 3.經過必定的查詢觸發,並非越多越好。 何時不適合用索引? 

1.當增刪改的操做大於查詢的操做時。 2.查詢的語句大於全部語句的三分之一時。 

建立索引語法:create index 索引名 on 代表 (列名) 刪除索引語法:drop index 索引名

相關文章
相關標籤/搜索