1. 通過字段之間的函數(shù)關(guān)系,計算某個字段的值(即某個字段的值,為其他字段的加減乘除的值)
比方說,你想記錄員工的工作時間(worktime)和工資(salary),這兩者成正比,即worktime=salary*100(常數(shù))。如何通過工作時間直接得到工資的值呢?
一行命令行就可以啦:
update tbname set salary=worktime*100 where id='11111';
這里要注意字段的屬性:是否都是int。如果是varchar的話需要轉(zhuǎn)成int。下面說說mysql的字符串如何轉(zhuǎn)成int。
2. 字符串轉(zhuǎn)int/截取字符串某幾位
字符串轉(zhuǎn)int
參考:MySQL字符串的‘123’轉(zhuǎn)換為數(shù)字的123 - emanlee - 博客園
三種方法如下,我覺得第三種最方便了
1. CAST('123' AS SIGNED)
2. CONVERT('123',SIGNED)
3. '123'+0
截取字符串的某幾位
left(str,length):從左截
right(str,length):從右截
str: 被截的字符串,length: 截取長度
舉例:比如worktime是一個四位的字符串,0410表示4個小時10分鐘,0059表示59分鐘
update tbname set salary=(right(worktime,2)+(left(worktime,2)+0)*60)*100 where id='11111';
(right(worktime,2)+0) 表示截取worktime從右邊開始的兩位,即分鐘數(shù);?
(left(worktime,2)+0)*60 表示截取worktime從左邊開始的兩位,即小時數(shù),再乘60表示分鐘數(shù)。
3. 提取表中某個字段的多行,把它變成一個表的某列
我之前沒有考慮周全,導(dǎo)致原來的數(shù)據(jù)庫的字段很別扭,我想要篩選出其中符合A條件的行,以及符合B條件的行(我事先知道兩者的行數(shù)是相同的),將兩者變成一個新表的兩列,然后這兩列差聽起來就好復(fù)雜啊。
這是我寫過的最長的mysql了,還是挺有用的。
在這個sql語句中我用到了join(同inner join),參考:mysql中join的連接方式
這個sql語句最基礎(chǔ)的結(jié)構(gòu)是:
select A.字段1, B.字段2 from?
(select 字段1 from tbname where 字段=“值”)as A join?
(select 字段2 from tbname where 字段=“值”) as B
但是這樣返回的結(jié)果是所有行的排列組合,它不會把AB的每行對應(yīng)起來。也就是說,假設(shè)這條語句中的A,B分別有10行,結(jié)果有100行而不是10行。所以以上的這個sql語句是不對的?
要想把A,B每行對應(yīng)起來,需要在join后面加on,加上一個能把A, B一一對應(yīng)的條件。比如自增的序號。
加上on條件的sql語句:
select A.字段1, B.字段2 from
(select(@i:=@i+1)i, 字段1 from tbname, (SELECT @i:=0) as i where 字段=“值”) as A join
(select(@j:=@j+1)j, 字段2 from tbname, (SELECT @j:=0) as j where 字段=“值”) as B
on A.i=B.j;
這條語句相當(dāng)于先把A, B表分別加上序號,然后利用這個序號把A,B的每行一一對應(yīng)起來。得到結(jié)果的行數(shù)=A的行數(shù)=B的行數(shù)