1. 程式人生 > 資料庫 >從0到1學資料庫:Function函式

從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函式的各種型別和使用方式,常使用這些函式會方便我們的工作,畢竟有句話叫站在巨人的肩膀。

 

往期推薦:

關注我的公眾號,學習技術或投稿

圖片

長按上圖,識別圖中二維碼即可關注