十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
列轉(zhuǎn)行:利用max(case when then)
創(chuàng)新互聯(lián)公司主營仁和網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),仁和h5微信小程序開發(fā)搭建,仁和網(wǎng)站營銷推廣歡迎仁和等地區(qū)企業(yè)咨詢
`max``---聚合函數(shù) 取最大值`
`(`case course when '語文' then score else 0 end ) ---判斷`
` as 語文``---別名作為列名`
有,一張表弄出新的兩行,用case when then 拼出來,兩張表外聯(lián)在加casewhen then
復(fù)盤一下前兩天MySQL的一道筆試題。
建表語句為:
這是典型的行轉(zhuǎn)列操作。方法有以下兩種:
注意:max() 是為了能夠使用 group by 根據(jù) id 進(jìn)行分組,因?yàn)槊恳粋€(gè) id 對(duì)應(yīng)的course = '語文' 的記錄只有一條,所以 max() 的值就等于對(duì)應(yīng)那一條記錄的 score 的值。 因此sum()、min()、avg()等聚合函數(shù)都可以達(dá)到行轉(zhuǎn)列的效果。
若要實(shí)現(xiàn)對(duì)每一列也求和,可以使用with rollup直接生成結(jié)果。
import_table(importTable) 的延申功能:可定制化行輸入。
import_table(importTable) 我們之前有介紹過,是一款并行導(dǎo)入各種格式文本的工具,封裝了 MySQL 語句?load data local infile。
比如說要導(dǎo)入一個(gè)以 TAB 為分隔符的文本數(shù)據(jù)文件:/tmp/sample_ytt.txt?到表:ytt_new.t1,可以執(zhí)行下面語句:
上面結(jié)果是?load data infile?語句的導(dǎo)入結(jié)果。如果改用 import_table 方法來做同樣的事情,基于 Python 語法,使用方法如下:
那接下來看另外一個(gè)需求:在導(dǎo)入文本文件時(shí)對(duì)每行做預(yù)處理(例如在導(dǎo)入數(shù)據(jù)之前更改列 r2 的值為 mod(r1,10),列 r5 的值為 abs(r4-46) ),這樣可以減少導(dǎo)入后再次處理的時(shí)間開銷。
這個(gè)需求用?load data infile?語句非常容易實(shí)現(xiàn):(導(dǎo)入時(shí)更改列 r2 和 r5 的數(shù)據(jù),類似 UPDATE 語法)
那如果要用 util.import_table(importTable) 來實(shí)現(xiàn)上面的需求,在 MySQL 8.0.22 之前是沒辦法的。
隨著 MySQL 8.0.22 的發(fā)布,MySQL 對(duì) import_table 方法做了些擴(kuò)充功能,其中增加了一個(gè)選項(xiàng) “decodeColumns” 可以實(shí)現(xiàn)字段的預(yù)先輸入定制化功能,并且還可以更加豐富。
接下來用 import_table 來實(shí)現(xiàn)上面的需求,定制化字段 r2 和 r5:
以上 Options 選項(xiàng),見下圖:
我來具體解釋下上圖的含義:藍(lán)色字體 columns 對(duì)應(yīng)的數(shù)組分別指定數(shù)據(jù)文件中的每行字段,也就是默認(rèn)的 TAB 分隔符所分割的每列值,1 和 2 代表占位符,1 代表數(shù)據(jù)文件中每行的第一個(gè)列,2 代表數(shù)據(jù)文件中每行的第四列,decodeColumns 字典分別對(duì)需要預(yù)先輸入的字段做處理。比如 r1 字段保留為變量 @1,r2 字段對(duì)應(yīng) mod(r1,10) 等。
如果還是不太理解變換規(guī)則,可以臨時(shí)打開 general log, 上面 import_table(importTable)對(duì)應(yīng)的 MySQL 日志為:
以上日志寫的很清楚,內(nèi)部轉(zhuǎn)換為最基本的load data infile語法。
那這里我簡(jiǎn)單解讀了下 MySQL 8.0.22 對(duì) MySQL Shell 的一項(xiàng)定制化輸入文本文件的新特性,更多的新特性可以繼續(xù)關(guān)注。