2.1 排序方式
我們提供的服務(wù)有:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、西寧ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的西寧網(wǎng)站制作公司
數(shù)據(jù)量小則在內(nèi)存排序, 數(shù)據(jù)量大則使用磁盤排序
內(nèi)存排序 : 直接使用"快速排序"
磁盤排序 : 先將數(shù)據(jù)分塊, 對(duì)每個(gè)獨(dú)立的塊使用"快速排序", 并將各個(gè)塊的排序結(jié)果存在磁盤上, 然后將各個(gè)排好序的塊進(jìn)行合并(merge), 最后返回排序結(jié)果
2.2 排序算法
3. 注意點(diǎn) :
MySQL的排序,使用order by來(lái)實(shí)現(xiàn)。
order by id asc,表示用id升序排列
order by id desc,表示用id降序排列
當(dāng)需要用多個(gè)字段排序時(shí),order by cdate desc,id asc,表示先用cdate降序排列,cdate相同的再用id升序排列
前幾天工作上遇到一個(gè)問(wèn)題,在mysql數(shù)據(jù)查詢的時(shí)候,使用的是in條件,而結(jié)果需要根據(jù)in來(lái)進(jìn)行排序,當(dāng)時(shí)嘗試了幾次都沒(méi)成功,后來(lái)在度娘的幫助下,找到了解決辦法:
select * from table_name where id in (6,2,1,10,5,7..)
查詢的結(jié)果和in中的順序并不一致,也就是說(shuō)在批量查詢時(shí),mysql的查詢并不是按照in中的值得順序來(lái)查詢的。那怎么才能保證和in查詢中的順序相同呢?
查詢了資料發(fā)現(xiàn)有兩種方式可以對(duì)in查詢的結(jié)果進(jìn)行排序。一種是order by find_in_set,另外一種是order by substring_index
1、select * from table_name where id in (6,2,1,10,5,7..) order by find_in_set(id,'6,2,1,10,5,7');
2、select * from table_name where id in (6,2,1,10,5,7..)?order by substring_index('6,2,1,10,5,7',id,1);
ORDER BY 默認(rèn)按升序排列,因此 ASC (升序)子句是可選的。
另外,還可以按降序排列,為此可以使用 DESC(降序)。
ORDER BY 子句中還可以用數(shù)字來(lái)表示對(duì)應(yīng)的列 3 對(duì)應(yīng)于 SELECT 中指定的第 3 列,即工資。
按從左到右的順序依次根據(jù) ORDER BY 子句中指定的列進(jìn)行排序。
指定用于排序的列時(shí),如果使用的是 SELECT 子句中列的數(shù)字位置,那么指定的數(shù)字不能超過(guò) SELECT 子句中指定的列數(shù)。( 不能超出索引 )
通常,可以按 SELECT 子句中未指定的列進(jìn)行排序,但必須指定列名。然而,如果在查詢中使用了GROUP BY 或 DISTINCT 子句,就不能按SELECT 子句中未指定的列進(jìn)行排序。
要求:顯示部門編號(hào)為 10 的員工的姓名、職位和薪水,并根據(jù)薪水按從低到高的順序排列想獲得上面這樣的數(shù)據(jù)結(jié)果
如果想對(duì)表中多個(gè)字段進(jìn)行不同的排列如工資表按照升序排列,年齡按照降序排列
可以再ORDER之后用逗號(hào)隔開(kāi)不同排列的字段
參考mysql官方的回答:
當(dāng)你的表示myisam時(shí):
SELECT * FROM tbl -- this will do a "table scan". If the table has never had any DELETEs/REPLACEs/UPDATEs, the records will happen to be in the insertion order, hence what you observed.
大致意思為,一個(gè)myisam引擎表在沒(méi)有任何的刪除,修改操作下,執(zhí)行 select 不帶order by,那么會(huì)按照插入順序進(jìn)行排序。
If you had done the same statement with an InnoDB table, they would have been delivered in PRIMARY KEY order, not INSERT order. Again, this is an artifact of the underlying implementation, not something to depend on.
對(duì)于innodb引擎表來(lái)說(shuō),在相同的情況下,select 不帶order by,會(huì)根據(jù)主鍵來(lái)排序,從小到大
先把分類全取出來(lái),并隨機(jī)排序,取排在第一個(gè)分類。
例如:西裝
然后查詢的時(shí)候 order by (category='西裝') desc,category 即可實(shí)現(xiàn)要求。
MySQL是一種開(kāi)放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫(kù)系統(tǒng)使用最常用的數(shù)據(jù)庫(kù)管理語(yǔ)言--結(jié)構(gòu)化查詢語(yǔ)言(SQL)進(jìn)行數(shù)據(jù)庫(kù)管理。
由于MySQL是開(kāi)放源代碼的,因此任何人都可以在General Public License的許可下下載并根據(jù)個(gè)性化的需要對(duì)其進(jìn)行修改。MySQL因?yàn)槠渌俣?、可靠性和適應(yīng)性而備受關(guān)注。大多數(shù)人都認(rèn)為在不需要事務(wù)化處理的情況下,MySQL是管理內(nèi)容最好的選擇。
MySQL這個(gè)名字,起源不是很明確。一個(gè)比較有影響的說(shuō)法是,基本指南和大量的庫(kù)和工具帶有前綴“my”已經(jīng)有10年以上,而且不管怎樣,MySQL AB創(chuàng)始人之一的Monty Widenius的女兒也叫My。這兩個(gè)到底是哪一個(gè)給出了MySQL這個(gè)名字至今依然是個(gè)迷,包括開(kāi)發(fā)者在內(nèi)也不知道。
MySQL的海豚標(biāo)志的名字叫“sakila”,它是由MySQL AB的創(chuàng)始人從用戶在“海豚命名”的競(jìng)賽中建議的大量的名字表中選出的。獲勝的名字是由來(lái)自非洲斯威士蘭的開(kāi)源軟件開(kāi)發(fā)者Ambrose Twebaze提供。根據(jù)Ambrose所說(shuō),Sakila來(lái)自一種叫SiSwati的斯威士蘭方言,也是在Ambrose的家鄉(xiāng)烏干達(dá)附近的坦桑尼亞的Arusha的一個(gè)小鎮(zhèn)的名字。
MySQL,雖然功能未必很強(qiáng)大,但因?yàn)樗拈_(kāi)源、廣泛傳播,導(dǎo)致很多人都了解到這個(gè)數(shù)據(jù)庫(kù)。它的歷史也富有傳奇性。