從0到1學資料庫:Function函式
點選上方“羅曉勝”,馬上關注,您的支援對我幫助很大
上期文章
/ 前言 /
為什麼要有函式,不如問函式是什麼,是幹嘛的! 函式是為了方便我們的各種操作而產生的,就是一個設計好的方程式,給出引數,它就給你對應的結果
/ 正文 /
要點
1.字元函式
2.數值函式
3.日期函式
4.轉換函式
5.流程函式
6.系統函式
7.函式巢狀
單行函式
• 語法: 函式名[(引數1,引數2,…)]
• 其中的引數可以是以下之一:
– 變數
– 列名
– 表示式
• 單行函式還有以下的一些特徵:
– 單行函式對單行操作
– 每行返回一個結果
– 有可能返回值與原引數資料型別不一致(轉換函式)
– 單行函式可以寫在SELECT、WHERE、ORDER BY子句中
– 有些函式沒有引數,有些函式包括一個或多個引數
– 函式可以巢狀
字元函式
字元函式:主要指引數型別是字元型,不同函式返回值可能是 字元型或數字型別。
-
字元函式
-
大小寫轉換:
• LOWER(列名|表示式): 將字元轉換成 小寫 • UPPER(列名|表示式): 將字元轉換成 大寫 -
字元處理:
• LENGTH:取字元長度 格式:LENGTH(column | expression)• CONCAT:連線兩個值,等同於|| 格式:CONCAT(column1|expression1,column2|expression2)
• SUBSTR:擷取,返回第一個引數中從n1字元開始長度為n2的子串,如果n1是負值,表示 從後向前數的abs(n1)位,如果n2省略,取n1之後的所有字元 格式:SUBSTR(column | expression,n1[,n2])
• INSTR:定位,返回s1中,子串s2從n1開始,第n2次出現的位置。n1,n2預設值為1 格式:INSTR(s1,s2,[,n1],[n2])
• TRIM:去除空格,也可去除字串頭部或尾部(頭尾)的字元 格式:TRIM(leading | trailing | both trim_character From trim_source)
• LPAD:左填充,返回s1被s2從左面填充到n1長度。格式:LPAD(s1,n1,s2)
• RPAD:右填充,返回s1被s2從右面填充到n1長度。格式:RPAD(s1,n1,s2) • REPLACE:替換,把s1中的s2用s3替換。格式:REPLACE(s1,s2,s3)
-
字元大小寫操作函式
• LOWER:示例:LOWER('SQL Course') 結果:sql course
• UPPER:示例:UPPER('SQL Course') 結果:SQL COURSE
字元處理函式
函式 | 結果 |
---|---|
LENGTH('String') | 6 |
CONCAT('Good', 'String') | GoodString |
SUBSTR('String',1,3) | Str |
INSTR('String', 'r') | 3 |
TRIM('S' FROM 'SSMITH') | MITH |
LPAD(sal,10,'*') | ******5000 |
RPAD(sal,10,'*') | 5000****** |
REPLACE('abc','b','d') | adc |
LEFT(str,len):返回字串str的最左面len個字元。
select LEFT('foobarbar', 5);
RIGHT(str,len):返回字串str的最右面len個字元。
select RIGHT('foobarbar', 4);
LOCATE(substr,str):返回子串substr在字串str第一個出現的位置,如果substr不是在str裡面,返回0.
select LOCATE('bar', 'foobarbar'); select LOCATE('xbar', 'foobar');
LTRIM(str):返回刪除了其前置空格字元的字串str。
select LTRIM(' barbar');
RTRIM(str):返回刪除了其拖後空格字元的字串str。
select RTRIM(‘barbar ’);
REPEAT(str,count):返回由重複countTimes次的字串str組成的一個字串。如果count <= 0,返回一個空字串。如果str或count是NULL,返回NULL。
select REPEAT('MySQL', 3);
REVERSE(str):返回顛倒字元順序的字串str。
select REVERSE('abc');
INSERT(str,pos,len,newstr):返回字串str,在位置pos起始的子串且len個字元長的子串由字串newstr代替。
select INSERT(‘whatareyou', 5, 3, ‘is');
查詢示例:
SELECT id, CONCAT(name, age) NAME, LENGTH (name) length FROM student
數字函式
• ROUND(列名|表示式, n):四捨五入,將列或表示式所表示的數值四舍五 入到小數點後的第n位。
• CEIL(列名|表示式, n):向上取整
• Floor(列名|表示式, n):向下取整
• truncate(列名|表示式,n):截斷,將列或表示式所表示的數值擷取到小 數點後的第n位。
• MOD(m,n):取餘,取m除以n後得到的餘數。
示例:SELECT ROUND(65.654,2),CEIL(65.654),Floor(65.654),truncate(65.654,1),mod(65.654,2) ;
結果-- 65.65 66 65 65.6 1.654
日期函式
常用的日期運算如下:
• now():返回系統日期+時間
• sysdate():返回系統日期+時間,sysdate() 日期時間函式跟 now() 類似,不同之處在於:now() 在執行開始時值就得到了, sysdate() 在函式執行時動態得到值;
• current_timestamp, current_timestamp():獲得當前時間戳函式 • curdate():返回系統當前日期,不返回時間
• curtime():返回當前系統中的時間,不返回日期
MySQL 日期轉換函式、時間轉換函式
• str_to_date 將日期格式的字元轉換成指定格式的日期
• date_format(date,format) 日期轉換字串
• time_format(time,format) 日期轉換字串
示例:
date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') -- 20080808222301
select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30
(日期、天數)轉換函式
to_days(date):日期轉換天數
time_to_sec(time):時間轉換秒數
sec_to_time(seconds):秒數轉換時間
示例
select to_days('2008-08-08'); -- 733627
select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'
拼湊日期、時間函式
makdedate(year,dayofyear):拼湊日期
maketime(hour,minute,second):拼湊時間
示例
select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'
MySQL 日期時間計算函式
date_add():日期增加一個時間間隔 示例
set @dt = now();
select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);
select date_add(@dt, interval -1 day); -- sub 1 day
select date_add(@dt, interval '01:15:30' hour_second);
結果:2008-08-09 13:28:03
select date_add(@dt, interval '1 01:15:30' day_second);
結果:2008-08-10 13:28:03
date_sub():為日期減去一個時間間隔
select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
結果:1997-12-30 22:58:59
datediff(date1,date2):兩個日期相減 date1 - date2,返回天數。timediff(time1,time2):兩個日期相減 time1 - time2,返回 time 差值:
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7
select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08
注意:timediff(time1,time2) 函式的兩個引數型別必須相同。
時間戳(timestamp)轉換、增、減函式
timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr)
timestampdiff(unit,datetime_expr1,datetime_expr2)
select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01
select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00
MySQL timestampadd() 函式類似於 date_add()。
select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12
select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
轉換函式
Cast(欄位名 as 轉換的型別 ),其中型別可以為:
CHAR[(N)] 字元型
DATE 日期型
DATETIME 日期和時間型
DECIMAL float型
SIGNED int
TIME 時間型
示例
cast(123 AS CHAR(3)) //整數轉字串
cast( '123 ' as SIGNED INTEGER) //字串轉整數
select cast(11 as unsigned int) /*整型*/
select cast(11 as decimal(10,2)) /*浮點型*/
控制流程函式
CASE value WHEN [compare-value]
THEN result [WHEN [compare-value] THEN result ...] [ELSE result]
END
CASE WHEN [condition]
THEN result [WHEN [condition] THEN result ...] [ELSE result]
END
示例:
SELECT CASE 11 WHEN 1
THEN 'one'
WHEN 2
THEN 'two' ELSE 'more' END;
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。
IF() 的返回值為數字值或字串值,具體情況視其所在語境而定。示例:
SELECT IF(1>2,2,3);
SELECT IF(1<2,'yes ','no');
SELECT IF(STRCMP('test','test1'),'no','yes');
STRCMP(expr1,expr2) 如果字串相同,STRCMP()返回0,如果第一引數根據當前的排序次序小於第二個,返回-1,否則返回1。
Strcmp(str1,str2):如果str1>str2返回1,str1=str2反回0,str1<str2返回-1)
示例:
select STRCMP('text', 'text2');
select STRCMP('text2', 'text');
select STRCMP('text', 'text');
系統資訊函式
獲取MySQL版本號、連線數、資料庫名的函式
VERSION()函式返回資料庫的版本號;
CONNECTION_ID()函式返回伺服器的連線數,也就是到現在為止MySQL服務的連線次數;
DATABASE()和SCHEMA()返回當前資料庫名。
USER()、SYSTEM_USER()、SESSION_USER()、CURRENT_USER()和CURRENT_USER這幾個函式可以返回當前使用者的名稱。
CHARSET(str)函式返回字串str的字符集,一般情況這個字符集就是系統的預設字符集;
COLLATION(str)函式返回字串str的字元排列方式。
LAST_INSERT_ID()函式返回最後生成的AUTO_INCREMENT值。
其他函式
加密函式PASSWORD(str)
PASSWORD(str)函式可以對字串str進行加密。一般情況下,PASSWORD(str)函式主要是用來給使用者的密碼加密的。下面使用PASSWORD(str)函式為字串“abcd”加密。
加密函式MD5(str)
MD5(str)函式可以對字串str進行加密。MD5(str)函式主要對普通的資料進行加密。下面使用MD5(str)函式為字串“abcd”加密。
加密函式ENCODE(str,pswd_str)
ENCODE(str,pswd_str)函式可以使用字串pswd_str來加密字串str。加密的結果是一個二進位制數,必須使用BLOB型別的欄位來儲存它。
解密函式
DECODE(crypt_str,pswd_str)函式可以使用字串pswd_str來為crypt_str解密。crypt_str是通過ENCODE(str,pswd_str)加密後的二進位制資料。字串pswd_str應該與加密時的字串pswd_str是相同的。下面使用DECODE(crypt_str,pswd_str)為ENCODE(str,pswd_str)加密的資料解密。
格式化函式FORMAT(x,n)
FORMAT(x,n)函式可以將數字x進行格式化,將x保留到小數點後n位。這個過程需要進行四捨五入。
ASCII(s)返回字串s的第一個字元的ASCII碼;
BIN(x)返回x的二進位制編碼;
HEX(x)返回x的十六進位制編碼;
OCT(x)返回x的八進位制編碼;
CONV(x,f1,f2)將x從f1進位制數變成f2進位制數。
IP地址與數字相互轉換的函式
INET_ATON(IP)函式可以將IP地址轉換為數字表示;
INET_ATON(IP)函式中IP值需要加上引號 INET_NTOA(n)函式可以將數字n轉換成IP的形式。
加鎖函式和解鎖函式
GET_LOCT(name,time)函式定義一個名稱為nam、持續時間長度為time秒的鎖。如果鎖定成功,返回1;如果嘗試超時,返回0;如果遇到錯誤,返回NULL。
RELEASE_LOCK(name)函式解除名稱為name的鎖。如果解鎖成功,返回1;如果嘗試超時,返回0;如果解鎖失敗,返回NULL;IS_FREE_LOCK(name)函式判斷是否使用名為name的鎖。如果使用,返回0;否則,返回1。重複執行指定操作的函式 BENCHMARK(count,expr)函式將表示式expr重複執行count次,然後返回執行時間。該函式可以用來判斷MySQL處理表達式的速度。
改變字符集的函式
CONVERT(s USING cs)函式將字串s的字符集變成cs
注:CAST(x AS type)和CONVERT(x,type)這兩個函式將x變成type型別。這兩個函式只對BINARY、CHAR、DATE、DATETIME、TIME、SIGNED INTEGER、UNSIGNED INTEGER這些型別起作用。但兩種方法只是改變了輸出值的資料型別,並沒有改變表中欄位的型別。
函式巢狀
• 單行函式可以巢狀於任何層。
• 巢狀的函式是從最裡層向最外層的順序計算的。
/ 總結 /
本文主要講了Function函式的各種型別和使用方式,常使用這些函式會方便我們的工作,畢竟有句話叫站在巨人的肩膀。
往期推薦:
關注我的公眾號,學習技術或投稿
長按上圖,識別圖中二維碼即可關注