order by是什么意思
order by 是排序的意思。order by 列名1,列名2,..... 你按照什么排序就寫什么列。 如果列名后什么都不寫,也可以寫ASC,表示升序排列,如果要想降序排列,在列名后面寫desc 。
order by是什么意思
order by 從英文里理解就是行的排序方式,默認(rèn)的為升序。 order by 后面必須列出排序的字段名,可以是多個(gè)字段名。
group by 從英文里理解就是分組。必須有“聚合函數(shù)”來配合才能使用,使用時(shí)至少需要一個(gè)分組標(biāo)志字段。
在使用group by的語句中,只能lect用于分類的列(表達(dá)式),或聚合函數(shù)。
where條件用于group by之前,having用于group by 之后對(duì)結(jié)果進(jìn)行篩選。
一、名詞order:
1、作“順序”、“次序”。常用短語:in order of 按順序。如:
A list of some of the common metals in the order of their activity is given below. 下面列出了某些金屬按其活潑順序排列的一個(gè)表格.
2、作“秩序”。常用短語:keep ... in order 使......有序。如:
The machine is in good working order. 機(jī)器運(yùn)轉(zhuǎn)良好.
Our laboratory is kept in good order. 我們的實(shí)驗(yàn)室保持整齊.(句中in good order為主語補(bǔ)語.)
3、作“指示、命令”。常用短語:give sb. anorderto do sth.命令某人做某事。如:
He gave orders for the work to be started. (=…orders that the work should be started.)他下令開始工作.
4、點(diǎn)菜;所點(diǎn)的飲食菜肴。
二、動(dòng)詞order:
1、作”命令”。常用短語:ordersb.to do sth. 令某人做某事。如:
The doctor ordered him to stay there.醫(yī)生囑咐他留在那里。(不定式短語to stay there作賓語補(bǔ)語)
2、作“點(diǎn)餐、“訂購”。常用短語:ordersth.for sb./ordersb.for sth.為某人訂購/點(diǎn)某物。如:
They have ordered 1,000 oil pumps from our factory.他們已向我廠訂購1,000臺(tái)油泵。
來源:網(wǎng)絡(luò)。本文版權(quán)歸原創(chuàng)作者所以。
order by 和 group by 的區(qū)別
order by 和 group by的區(qū)別為:指代不同、側(cè)重點(diǎn)不同、引證用法不同
一、指代不同
1、order by:排序依據(jù)。
2、group by:進(jìn)行分組。
二、側(cè)重點(diǎn)不同
1、order by:用來對(duì)數(shù)據(jù)庫的一組數(shù)據(jù)進(jìn)行排序。
2、group by:指定的規(guī)則對(duì)數(shù)據(jù)進(jìn)行分組,所謂的分組就是將一個(gè)“數(shù)據(jù)集”劃分成若干個(gè)“小區(qū)域”,然后針對(duì)若干個(gè)“小區(qū)域”進(jìn)行數(shù)據(jù)處理。
三、引證用法不同
1、order by:order作“次序,順序”“治安,秩序”“整齊,有條理”解時(shí),是不可數(shù)名詞。作“訂購,訂貨”“命令,囑咐”“匯票,匯單”解時(shí),是可數(shù)名詞。
2、group by:group的基本意思是“群,團(tuán)體,組類”,指由很多的人或物偶然或有意組成的一個(gè)有秩序、有組織的整體,有時(shí)也可指較小的“人群”,還可以指一個(gè)大型的商業(yè)機(jī)構(gòu),即“集團(tuán)”或某種“類別”。
order by默認(rèn)是升序還是降序?
orderby默認(rèn)是升序。orderby關(guān)鍵字用于對(duì)結(jié)果集進(jìn)行排序,但是orderby關(guān)鍵字默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序,如果需要按照降序?qū)τ涗涍M(jìn)行排序,需用DESC關(guān)鍵字。
orderby的語法
SELECTcolumn1,column2
FROMtable_name
ORDERBYcolumn1,column2ASC|DESC。
ORDERBYcolumn1,column2ASC先對(duì)column1進(jìn)行升序排序,在column1相同時(shí)再按照column2升序排列,ASC可省略不寫,因?yàn)镺RDERBY默認(rèn)就是按照升序?qū)τ涗涍M(jìn)行排序。
ORDERBYcolumn1,column2DESC先對(duì)column1進(jìn)行降序排序,在column1相同時(shí)再按照column2降序排列,DESC不可省略。
order by 和 group by 的區(qū)別?
order by 和 group by 的區(qū)別:
1,order by 從英文里理解就是行的排序方式,默認(rèn)的為升序。 order by 后面必須列出排序的字段名,可以是多個(gè)字段名。
2,group by 從英文里理解就是分組。必須有“聚合函數(shù)”來配合才能使用,使用時(shí)至少需要一個(gè)分組標(biāo)志字段。
3,在使用group by的語句中,只能lect用于分類的列(表達(dá)式),或聚合函數(shù)。
where條件用于group by之前,having用于group by 之后對(duì)結(jié)果進(jìn)行篩選。
擴(kuò)展資料:
一、order by用法: 排序查詢、asc升序、desc降序
示例:
1.lect * from 學(xué)生表
2.order by 年齡
3.查詢學(xué)生表信息、按年齡的升序(默認(rèn)、可缺省、從低到高)排列顯示也可以多條件排序、 比如 order by 年齡,成績(jī) desc
4.按年齡升序排列后、再按成績(jī)降序排列。
二、group by用法: 分組查詢、having 只能用于group by子句、作用于組內(nèi),having條件子句可以直接跟函數(shù)表達(dá)式。使用group by 子句的查詢語句需要使用聚合函數(shù)。
示例:
1.lect 學(xué)號(hào),SUM(成績(jī)) from 選課表 group by 學(xué)號(hào) 按學(xué)號(hào)分組、查詢每個(gè)學(xué)號(hào)的總成績(jī)
2.lect 學(xué)號(hào),AVG(成績(jī)) from 選課表
3.group by 學(xué)號(hào)
4.having AVG(成績(jī))>(lect AVG(成績(jī)) from 選課表 where 課程號(hào)='001')
5.order by AVG(成績(jī)) desc
6.查詢平均成績(jī)大于001課程平均成績(jī)的學(xué)號(hào)、并按平均成績(jī)的降序排列。
參考資料:
百度百科- 結(jié)構(gòu)化查詢語言
order by什么意思
對(duì)order by的理解
前言
日常開發(fā)中,我們經(jīng)常會(huì)使用到order by,親愛的小伙伴,你是否知道order by 的工作原理呢?order by的優(yōu)化思路是怎樣的呢?使用order by有哪些注意的問題呢?本文將跟大家一起來學(xué)習(xí),攻克order by~
一個(gè)使用order by 的簡(jiǎn)單例子
假設(shè)用一張員工表,表結(jié)構(gòu)如下:
表數(shù)據(jù)如下:
我們現(xiàn)在有這么一個(gè)需求:查詢前10個(gè),來自深圳員工的姓名、年齡、城市,并且按照年齡小到大排序。對(duì)應(yīng)的 SQL 語句就可以這么寫:
這條語句的邏輯很清楚,但是它的底層執(zhí)行流程是怎樣的呢?
order by 工作原理
explain 執(zhí)行計(jì)劃
我們先用Explain關(guān)鍵字查看一下執(zhí)行計(jì)劃
我們可以發(fā)現(xiàn),這條SQL使用到了索引,并且也用到排序。那么它是怎么排序的呢?
全字段排序
MySQL 會(huì)給每個(gè)查詢線程分配一塊小內(nèi)存,用于排序的,稱為 sort_buffer。什么時(shí)候把字段放進(jìn)去排序呢,其實(shí)是通過idx_city索引找到對(duì)應(yīng)的數(shù)據(jù),才把數(shù)據(jù)放進(jìn)去啦。
我們回顧下索引是怎么找到匹配的數(shù)據(jù)的,現(xiàn)在先把索引樹畫出來吧,idx_city索引樹如下:
idx_city索引樹,葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵id。還有一棵id主鍵聚族索引樹,我們?cè)佼嫵鼍圩逅饕龢鋱D吧:
我們的查詢語句是怎么找到匹配數(shù)據(jù)的呢?先通過idx_city索引樹,找到對(duì)應(yīng)的主鍵id,然后再通過拿到的主鍵id,搜索id主鍵索引樹,找到對(duì)應(yīng)的行數(shù)據(jù)。
加上order by之后,整體的執(zhí)行流程就是:
執(zhí)行示意圖如下:
將查詢所需的字段全部讀取到sort_buffer中,就是全字段排序。這里面,有些小伙伴可能會(huì)有個(gè)疑問,把查詢的所有字段都放到sort_buffer,而sort_buffer是一塊內(nèi)存來的,如果數(shù)據(jù)量太大,sort_buffer放不下怎么辦呢?
磁盤臨時(shí)文件輔助排序
實(shí)際上,sort_buffer的大小是由一個(gè)參數(shù)控制的:sort_buffer_size。如果要排序的數(shù)據(jù)小于sort_buffer_size,排序在sort_buffer 內(nèi)存中完成,如果要排序的數(shù)據(jù)大于sort_buffer_size,則借助磁盤文件來進(jìn)行排序
如何確定是否使用了磁盤文件來進(jìn)行排序呢?可以使用以下這幾個(gè) 命令
可以從 number_of_tmp_files 中看出,是否使用了臨時(shí)文件。
number_of_tmp_files 表示使用來排序的磁盤臨時(shí)文件數(shù)。如果number_of_tmp_files>0,則表示使用了磁盤文件來進(jìn)行排序。
使用了磁盤臨時(shí)文件,整個(gè)排序過程又是怎樣的呢?
TPS: 借助磁盤臨時(shí)小文件排序,實(shí)際上使用的是歸并排序算法。
小伙伴們可能會(huì)有個(gè)疑問,既然sort_buffer放不下,就需要用到臨時(shí)磁盤文件,這會(huì)影響排序效率。那為什么還要把排序不相關(guān)的字段(name,city)放到sort_buffer中呢?只放排序相關(guān)的age字段,它不香嗎?可以了解下rowid 排序。
rowid 排序
rowid 排序就是,只把查詢SQL需要用于排序的字段和主鍵id,放到sort_buffer中。那怎么確定走的是全字段排序還是rowid 排序排序呢?
實(shí)際上有個(gè)參數(shù)控制的。這個(gè)參數(shù)就是max_length_for_sort_data,它表示MySQL用于排序行數(shù)據(jù)的長度的一個(gè)參數(shù),如果單行的長度超過這個(gè)值,MySQL 就認(rèn)為單行太大,就換rowid 排序。我們可以通過 命令 看下這個(gè)參數(shù)取值。
max_length_for_sort_data 默認(rèn)值是1024。因?yàn)楸疚氖纠衝ame,age,city長度=64+4+64 =132 < 1024, 所以走的是全字段排序。我們來改下這個(gè)參數(shù),改小一點(diǎn).
使用rowid 排序的話,整個(gè)SQL執(zhí)行流程又是怎樣的呢?
執(zhí)行示意圖如下:
對(duì)比一下全字段排序的流程,rowid 排序多了一次回表。
什么是回表?拿到主鍵再回到主鍵索引查詢的過程,就叫做回表”
我們通過optimizer_trace,可以看到是否使用了rowid排序的:
全字段排序與rowid排序?qū)Ρ?/p>
一般情況下,對(duì)于InnoDB存儲(chǔ)引擎,會(huì)優(yōu)先使用全字段排序。可以發(fā)現(xiàn) max_length_for_sort_data 參數(shù)設(shè)置為1024,這個(gè)數(shù)比較大的。一般情況下,排序字段不會(huì)超過這個(gè)值,也就是都會(huì)走全字段排序。
order by的一些優(yōu)化思路
我們?nèi)绾蝺?yōu)化order by語句呢?
聯(lián)合索引優(yōu)化
再回顧下示例SQL的查詢計(jì)劃
我們給查詢條件city和排序字段age,加個(gè)聯(lián)合索引idx_city_age。再去查看執(zhí)行計(jì)劃:
可以發(fā)現(xiàn),加上idx_city_age聯(lián)合索引,就不需要Using filesort排序了。為什么呢?因?yàn)樗饕旧硎怯行虻模覀兛梢钥聪耰dx_city_age聯(lián)合索引示意圖,如下:
整個(gè)SQL執(zhí)行流程變成醬紫:
流程示意圖如下:
從示意圖看來,還是有一次回表操作。針對(duì)本次示例,有沒有更高效的方案呢?有的,可以使用覆蓋索引:
覆蓋索引:在查詢的數(shù)據(jù)列里面,不需要回表去查,直接從索引列就能取到想要的結(jié)果。換句話說,你SQL用到的索引列數(shù)據(jù),覆蓋了查詢結(jié)果的列,就算上覆蓋索引了。”
我們給city,name,age 組成一個(gè)聯(lián)合索引,即可用到了覆蓋索引,這時(shí)候SQL執(zhí)行時(shí),連回表操作都可以省去啦。
調(diào)整參數(shù)優(yōu)化
我們還可以通過調(diào)整參數(shù),去優(yōu)化order by的執(zhí)行。比如可以調(diào)整sort_buffer_size的值。因?yàn)閟ort_buffer值太小,數(shù)據(jù)量大的話,會(huì)借助磁盤臨時(shí)文件排序。如果MySQL服務(wù)器配置高的話,可以使用稍微調(diào)整大點(diǎn)。
我們還可以調(diào)整max_length_for_sort_data的值,這個(gè)值太小的話,order by會(huì)走rowid排序,會(huì)回表,降低查詢性能。所以max_length_for_sort_data可以適當(dāng)大一點(diǎn)。
當(dāng)然,很多時(shí)候,這些MySQL參數(shù)值,我們直接采用默認(rèn)值就可以了。
使用order by 的一些注意點(diǎn):沒有where條件,order by字段需要加索引嗎
日常開發(fā)過程中,我們可能會(huì)遇到?jīng)]有where條件的order by,那么,這時(shí)候order by后面的字段是否需要加索引呢。如有這么一個(gè)SQL,create_time是否需要加索引:
無條件查詢的話,即使create_time上有索引,也不會(huì)使用到。因?yàn)镸ySQL優(yōu)化器認(rèn)為走普通二級(jí)索引,再去回表成本比全表掃描排序更高。所以選擇走全表掃描,然后根據(jù)全字段排序或者rowid排序來進(jìn)行。
如果查詢SQL修改一下:
分頁limit過大時(shí),會(huì)導(dǎo)致大量排序怎么辦?
假設(shè)SQL如下:
索引存儲(chǔ)順序與order by不一致,如何優(yōu)化?
假設(shè)有聯(lián)合索引 idx_age_name, 我們需求修改為這樣:查詢前10個(gè)員工的姓名、年齡,并且按照年齡小到大排序,如果年齡相同,則按姓名降序排。對(duì)應(yīng)的 SQL 語句就可以這么寫:
我們看下執(zhí)行計(jì)劃,發(fā)現(xiàn)使用到Using filesort
這是因?yàn)椋琲dx_age_name索引樹中,age從小到大排序,如果age相同,再按name從小到大排序。而order by 中,是按age從小到大排序,如果age相同,再按name從大到小排序。也就是說,索引存儲(chǔ)順序與order by不一致。
我們?cè)趺磧?yōu)化呢?如果MySQL是8.0版本,支持Descending Indexes,可以這樣修改索引:
使用了in條件多個(gè)屬性時(shí),SQL執(zhí)行是否有排序過程
如果我們有聯(lián)合索引idx_city_name,執(zhí)行這個(gè)SQL的話,是不會(huì)走排序過程的,如下:
但是,如果使用in條件,并且有多個(gè)條件時(shí),就會(huì)有排序過程。
這是因?yàn)?in有兩個(gè)條件,在滿足深圳時(shí),age是排好序的,但是把滿足上海的age也加進(jìn)來,就不能保證滿足所有的age都是排好序的。因此需要Using filesort。
本文發(fā)布于:2023-02-28 20:28:00,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://m.newhan.cn/zhishi/a/167767707083883.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:orderby(orderby默認(rèn)是升序還是降序).doc
本文 PDF 下載地址:orderby(orderby默認(rèn)是升序還是降序).pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |