天天看點

select from where group by having order by的執行順序一、查詢語句中select from where group by having order by的執行順序二、資料分組(group by ):三、使用having字句對分組後的結果進行篩選,文法和where差不多:having 條件表達式四、當一個查詢語句同時出現了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 :按照什麼樣的順序來檢視傳回的資料

  1. from後面的表關聯,是自右向左解析的

    而where條件的解析順序是自下而上的。

也就是說,在寫SQL文的時候,盡量把資料量小的表放在最右邊來進行關聯(用小表去比對大表), 而把能篩選出小量資料的條件放在where語句的最左邊 (用小表去比對大表)

select from where group by having order by的執行順序一、查詢語句中select from where group by having order by的執行順序二、資料分組(group by ):三、使用having字句對分組後的結果進行篩選,文法和where差不多:having 條件表達式四、當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序是:五、索引

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

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

二、資料分組(group by ):

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

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

三、使用having字句對分組後的結果進行篩選,文法和where差不多:having 條件表達式

需要注意having和where的用法差別:

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

2.where肯定在group by 之前,即也在having之前。

3.where後的條件表達式裡不允許使用聚合函數,而having可以。

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

  1. 執行where xx對全表資料做篩選,傳回第1個結果集。
  2. 針對第1個結果集使用group by分組,傳回第2個結果集。
  3. 針對第2個結集執行having xx進行篩選,傳回第3個結果集。
  4. 針對第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

五、索引

1.索引是單獨的資料庫對象,索引也需要被維護。 2.索引可以提高查詢速度,但會降增删改的速度。 3.通過一定的查詢觸發,并不是越多越好。 什麼時候不适合用索引?

  1. 當增删改的操作大于查詢的操作時。
  2. 查詢的語句大于所有語句的三分之一時。

建立索引文法:create index 索引名 on 表明 (列名) 删除索引文法:drop index 索引名

繼續閱讀