在大多數應用場景下,咱們使用mysql進行查詢時只會用到'=', '>' , '<' , in, like 等經常使用的方法,看起來,大多數狀況下,已經足以應付咱們的小型應用了。不過,在一些特殊場景,則須要特殊的查詢方式了。mysql
1. 根據狀態來排序的查詢git
假設如今一個記錄有四種狀態,未處理(0)、正在處理(2)、處理成功(1)、處理失敗(4),之因此他們的值是這個樣子,是由於咱們通常狀況下是不會用它去排序,因此天然的就想到這樣的一些值賦予意義。可是,在排序的時候怎麼處理呢? 假如要求的前後順序是這樣的:未處理>處理失敗>正在處理>處理成功, 我能想到的就是,假設它們這些狀態就是按照要求的排序的值去依次增長的,那就只須要一個order by 該字段便可。具體實現以下:sql
select * from tab_task b order by (CASE b.deal_status WHEN 0 THEN 10 WHEN 2 THEN 30 WHEN 1 THEN 40 WHEN 4 THEN 20 ELSE 40 END) ASC,b.add_time desc //按照所需排序值,依次賦值
若是是要根據某個計算的值來排序,如按平均成績排序,則實現以下:ui
SELECT * FROM score b GROUP BY uid ORDER BY AVG(b.`score`) DESC; //直接計算得出排序值,使用RAND()能夠獲得隨機的排序
2. 比較複雜的模糊查詢spa
有時,咱們須要從某字段中篩選符合條件的值,可是該值又不是一個獨立的字段,這時就須要一些高級的模糊查詢(正則)。code
如,須要查詢某個值大於0的記錄,實現以下:blog
SELECT * FROM tab_day_data WHERE retention_days_full REGEXP '.*rd1=([0][1-9]+|[1-9][0-9]*).*'; //查詢rd{x}大於0的記錄,其中rd多是許多個相似的不重要的值,被儲存至一個字段,同理於其餘
mysql正則語法,以下:排序
// . 表示匹配任意一個字符 // | 做爲OR操做符,表示匹配其中之一 // [ ] 匹配任何單一字符 // [:a;num:] 任意字母和數字(同 [a-zA-Z0-9]) // [:alpha:] 任意字符(同 [a-zA-Z]) // [:blank:] 空格和製表(同 [\\t]) // [:cntrl:] ASCII控制字符(ASCII 0到31和127) // [:digit:] 任意數字(同[0-9]) // [:graph:] 與["print:] 相同,但不包括空格 // [:lower:] 任意小寫字線(同 [a-z]) // [:print:] 任意可打印字符 // [:punct:] 既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符 // [space:] 包括空格在內的任意空白字符(同 [\\f\\n\\t\\r\\v]) // [:upper:] 任意大小字母(同 [A-Z]) // [:xdigit:] 任意十六進制數字(同 [a-fA-F0-9]) // 元字符 .*?+{m}{m,}{m, n}
語法與正宗的正則不太一致,但大致原理是一致的。進程
用mysql作複雜的匹配,雖然能夠實現,可是相對來講效率低下,最好仍是使用獨立字段的形式進行查詢,用空間換取時間!事務
3. 檢查校驗和,驗證表是否相等
數據在傳輸時,可能會發生變化,也有可能由於其它緣由損壞,爲了保證數據的一致,咱們能夠計算checksum(校驗值)。
使用MyISAM引擎的表會把checksum存儲起來,稱爲live checksum,當數據發生變化時,checksum會相應變化。
CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED]
附:mysql進程查看,卡死現象的解決辦法
SHOW FULL PROCESSLIST; # 查看全部的進程狀況,具體解決請百度 SHOW STATUS; # 查看整體運行概況 KILL 213; # 將運行慢或卡死的進程刪除,注意數據的事務性,不然可能致使數據錯誤
問?
mysql 分表以後(好比按年分表,多個相關聯表同步拆分),查詢應該怎樣作纔好?