『壹』 sql資料庫中查詢語句Order By和Group By有什麼區別
order by 是按欄位排序
group by 是按欄位分類
order by 從英文里理解就是行的排序方式,默認的為升序。 order by 後面必須列出排序的欄位名,可以是多個欄位名。
group by 從英文里理解就是分組。必須有「聚合函數」來配合才能使用,使用時至少需要一個分組標志欄位。
一般情況下,group by 需要和聚合函數配合使用。
可以參考下這篇文章
http://apps.hi..com/share/detail/44043084
希望能幫到你
『貳』 高手們 為什麼資料庫查詢語句加了order by 變得很慢 表中有六千多條記錄 現在打開很慢 什麼原因
order by是用來排序的,如果剛開始的資料庫沒有按照你想要的順序排列的話,用order by的時候就會使得資料庫中的數據重新排列,這樣執行起來就慢了,況且表中的記錄也蠻多的,如果記錄較少的話,就沒什麼快慢之分了
『叄』 sql里的排序倒序的命令是order by什麼
order by [列名] desc
desc 就代表倒序
asc 代表升序
預設值也為升序
請採納!
『肆』 在資料庫查詢中order by 後面可以給表達式嗎
應該可以,有些支持order by rand()來隨機排序,或取欄位的部分值。你試一下就行了,不同資料庫可能支持不同。
『伍』 order by 和 group by 的區別
order by 和 group by的區別為:指代不同、側重點不同、引證用法不同
一、指代不同
1、order by:排序依據。
2、group by:進行分組。
二、側重點不同
1、order by:用來對資料庫的一組數據進行排序。
2、group by:指定的規則對數據進行分組,所謂的分組就是將一個「數據集」劃分成若干個「小區域」,然後針對若干個「小區域」進行數據處理。
三、引證用法不同
1、order by:order作「次序,順序」「治安,秩序」「整齊,有條理」解時,是不可數名詞。作「訂購,訂貨」「命令,囑咐」「匯票,匯單」解時,是可數名詞。
2、group by:group的基本意思是「群,團體,組類」,指由很多的人或物偶然或有意組成的一個有秩序、有組織的整體,有時也可指較小的「人群」,還可以指一個大型的商業機構,即「集團」或某種「類別」。
『陸』 SQL資料庫中查詢語句Order By和Group By有什麼區別
首先我們要明確,group
by和orderby
是兩個不同的理念。
group
by
是分組。比如學校要查詢班級人數,這時我們就要用到group
by
。把每個班分別進行統計最後得到每個班的學生數量。注意有group
by
語句出現的時候,前面的查詢欄位里只能出現聚合函數個分組函數。
而
order
by
是排序欄位的意思。就是對你查詢出來的欄位進行排序,有升序(asc)和降序(desc)兩種。
『柒』 SQL資料庫中,如何區分查詢語句Order By和Group By
Order By一般是在排序時使用,後面跟排序條件,比如升序或者降序;Group By一般是用作分組的,後面跟的是分組的條件。
order by 用於排序,一般與asc升序或desc降序一起使用.網上例子很多,搜索自己學一下。
group by 用於分類匯總,一般與聚合函數(比如avg平均、sum合計、max最大、min最小、count計算行)一起使用。例:select 月份,sum(工資)as 總工資 from 工資表 group by 月份
使用區別:在使用group by的語句中,只能select用於分類的列(表達式),或聚合函數。where條件用於group by之前,having用於group by 之後對結果進行篩選。
『捌』 對order by的理解
前言
日常開發中,我們經常會使用到order by,親愛的小夥伴,你是否知道order by 的工作原理呢?order by的優化思路是怎樣的呢?使用order by有哪些注意的問題呢?本文將跟大家一起來學習,攻克order by~
一個使用order by 的簡單例子
假設用一張員工表,表結構如下:
表數據如下:
我們現在有這么一個需求:查詢前10個,來自深圳員工的姓名、年齡、城市,並且按照年齡小到大排序。對應的 SQL 語句就可以這么寫:
這條語句的邏輯很清楚,但是它的底層執行流程是怎樣的呢?
order by 工作原理
explain 執行計劃
我們先用Explain關鍵字查看一下執行計劃
我們可以發現,這條SQL使用到了索引,並且也用到排序。那麼它是怎麼排序的呢?
全欄位排序
MySQL 會給每個查詢線程分配一塊小內存,用於排序的,稱為 sort_buffer。什麼時候把欄位放進去排序呢,其實是通過idx_city索引找到對應的數據,才把數據放進去啦。
我們回顧下索引是怎麼找到匹配的數據的,現在先把索引樹畫出來吧,idx_city索引樹如下:
idx_city索引樹,葉子節點存儲的是主鍵id。還有一棵id主鍵聚族索引樹,我們再畫出聚族索引樹圖吧:
我們的查詢語句是怎麼找到匹配數據的呢?先通過idx_city索引樹,找到對應的主鍵id,然後再通過拿到的主鍵id,搜索id主鍵索引樹,找到對應的行數據。
加上order by之後,整體的執行流程就是:
執行示意圖如下:
將查詢所需的欄位全部讀取到sort_buffer中,就是全欄位排序。這裡面,有些小夥伴可能會有個疑問,把查詢的所有欄位都放到sort_buffer,而sort_buffer是一塊內存來的,如果數據量太大,sort_buffer放不下怎麼辦呢?
磁碟臨時文件輔助排序
實際上,sort_buffer的大小是由一個參數控制的:sort_buffer_size。如果要排序的數據小於sort_buffer_size,排序在sort_buffer 內存中完成,如果要排序的數據大於sort_buffer_size,則藉助磁碟文件來進行排序
如何確定是否使用了磁碟文件來進行排序呢?可以使用以下這幾個命令
可以從 number_of_tmp_files 中看出,是否使用了臨時文件。
number_of_tmp_files 表示使用來排序的磁碟臨時文件數。如果number_of_tmp_files>0,則表示使用了磁碟文件來進行排序。
使用了磁碟臨時文件,整個排序過程又是怎樣的呢?
TPS: 藉助磁碟臨時小文件排序,實際上使用的是歸並排序演算法。
小夥伴們可能會有個疑問,既然sort_buffer放不下,就需要用到臨時磁碟文件,這會影響排序效率。那為什麼還要把排序不相關的欄位(name,city)放到sort_buffer中呢?只放排序相關的age欄位,它不香嗎?可以了解下rowid 排序。
rowid 排序
rowid 排序就是,只把查詢SQL需要用於排序的欄位和主鍵id,放到sort_buffer中。那怎麼確定走的是全欄位排序還是rowid 排序排序呢?
實際上有個參數控制的。這個參數就是max_length_for_sort_data,它表示MySQL用於排序行數據的長度的一個參數,如果單行的長度超過這個值,MySQL 就認為單行太大,就換rowid 排序。我們可以通過命令看下這個參數取值。
max_length_for_sort_data 默認值是1024。因為本文示例中name,age,city長度=64+4+64 =132 < 1024, 所以走的是全欄位排序。我們來改下這個參數,改小一點.
使用rowid 排序的話,整個SQL執行流程又是怎樣的呢?
執行示意圖如下:
對比一下全欄位排序的流程,rowid 排序多了一次回表。
什麼是回表?拿到主鍵再回到主鍵索引查詢的過程,就叫做回表」
我們通過optimizer_trace,可以看到是否使用了rowid排序的:
全欄位排序與rowid排序對比
一般情況下,對於InnoDB存儲引擎,會優先使用全欄位排序。可以發現 max_length_for_sort_data 參數設置為1024,這個數比較大的。一般情況下,排序欄位不會超過這個值,也就是都會走全欄位排序。
order by的一些優化思路
我們如何優化order by語句呢?
聯合索引優化
再回顧下示例SQL的查詢計劃
我們給查詢條件city和排序欄位age,加個聯合索引idx_city_age。再去查看執行計劃:
可以發現,加上idx_city_age聯合索引,就不需要Using filesort排序了。為什麼呢?因為索引本身是有序的,我們可以看下idx_city_age聯合索引示意圖,如下:
整個SQL執行流程變成醬紫:
流程示意圖如下:
從示意圖看來,還是有一次回表操作。針對本次示例,有沒有更高效的方案呢?有的,可以使用覆蓋索引:
覆蓋索引:在查詢的數據列裡面,不需要回表去查,直接從索引列就能取到想要的結果。換句話說,你SQL用到的索引列數據,覆蓋了查詢結果的列,就算上覆蓋索引了。」
我們給city,name,age 組成一個聯合索引,即可用到了覆蓋索引,這時候SQL執行時,連回表操作都可以省去啦。
調整參數優化
我們還可以通過調整參數,去優化order by的執行。比如可以調整sort_buffer_size的值。因為sort_buffer值太小,數據量大的話,會藉助磁碟臨時文件排序。如果MySQL伺服器配置高的話,可以使用稍微調整大點。
我們還可以調整max_length_for_sort_data的值,這個值太小的話,order by會走rowid排序,會回表,降低查詢性能。所以max_length_for_sort_data可以適當大一點。
當然,很多時候,這些MySQL參數值,我們直接採用默認值就可以了。
使用order by 的一些注意點:沒有where條件,order by欄位需要加索引嗎
日常開發過程中,我們可能會遇到沒有where條件的order by,那麼,這時候order by後面的欄位是否需要加索引呢。如有這么一個SQL,create_time是否需要加索引:
無條件查詢的話,即使create_time上有索引,也不會使用到。因為MySQL優化器認為走普通二級索引,再去回表成本比全表掃描排序更高。所以選擇走全表掃描,然後根據全欄位排序或者rowid排序來進行。
如果查詢SQL修改一下:
分頁limit過大時,會導致大量排序怎麼辦?
假設SQL如下:
索引存儲順序與order by不一致,如何優化?
假設有聯合索引 idx_age_name, 我們需求修改為這樣:查詢前10個員工的姓名、年齡,並且按照年齡小到大排序,如果年齡相同,則按姓名降序排。對應的 SQL 語句就可以這么寫:
我們看下執行計劃,發現使用到Using filesort
這是因為,idx_age_name索引樹中,age從小到大排序,如果age相同,再按name從小到大排序。而order by 中,是按age從小到大排序,如果age相同,再按name從大到小排序。也就是說,索引存儲順序與order by不一致。
我們怎麼優化呢?如果MySQL是8.0版本,支持Descending Indexes,可以這樣修改索引:
使用了in條件多個屬性時,SQL執行是否有排序過程
如果我們有聯合索引idx_city_name,執行這個SQL的話,是不會走排序過程的,如下:
但是,如果使用in條件,並且有多個條件時,就會有排序過程。
這是因為:in有兩個條件,在滿足深圳時,age是排好序的,但是把滿足上海的age也加進來,就不能保證滿足所有的age都是排好序的。因此需要Using filesort。
『玖』 mysql表數據已排序好,order by查詢速度會不會更快
不會更快
因為資料庫本身不知道這個數據是否有序.
orderby是資料庫查詢的最後一步.執行順序在
select,
where等等過濾條件之後.
由於資料庫本身不知道是否有序,所以必然會執行orderby進行排序.只不過排序是在內存中進行判斷,並且排序的結果不需要變而已,但還是需要執行排序,進行數據比對.
所以不會更快.
ps:既然數據表已經是有序的...為什麼還要orderby排序?直接用limit進行切片就好了阿?這不是多次一舉嗎?