原文:https://mp.weixin.qq.com/s/_PpagMC84P6kx9FaQSA1GA
存儲過程簡介
SQL語句需要先編譯然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它。
存儲過程是可編程的函數(shù),在數(shù)據(jù)庫中創(chuàng)建并保存,可以由SQL語句和控制結(jié)構(gòu)組成。當(dāng)想要在不同的應(yīng)用程序或平臺上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí),存儲過程是非常有用的。數(shù)據(jù)庫中的存儲過程可以看做是對編程中面向?qū)ο蠓椒ǖ哪M,它允許控制數(shù)據(jù)的訪問方式。
存儲過程的優(yōu)點(diǎn):
(1).增強(qiáng)SQL語言的功能和靈活性:存儲過程可以用控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。
(2).標(biāo)準(zhǔn)組件式編程:存儲過程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫該存儲過程的SQL語句。而且數(shù)據(jù)庫專業(yè)人員可以隨時(shí)對存儲過程進(jìn)行修改,對應(yīng)用程序源代碼毫無影響。
(3).較快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯^程是預(yù)編譯的。在首次運(yùn)行一個(gè)存儲過程時(shí)查詢,優(yōu)化器對其進(jìn)行分析優(yōu)化,并且給出最終被存儲在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對要慢一些。
(4).減少網(wǎng)絡(luò)流量:針對同一個(gè)數(shù)據(jù)庫對象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織進(jìn)存儲過程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,從而大大減少網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。
(5).作為一種安全機(jī)制來充分利用:通過對執(zhí)行某一存儲過程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制,避免了非授權(quán)用戶對數(shù)據(jù)的訪問,保證了數(shù)據(jù)的安全。
MySQL****的存儲過程
存儲過程是數(shù)據(jù)庫的一個(gè)重要的功能,MySQL 5.0以前并不支持存儲過程,這使得MySQL在應(yīng)用上大打折扣。好在MySQL 5.0開始支持存儲過程,這樣即可以大大提高數(shù)據(jù)庫的處理速度,同時(shí)也可以提高數(shù)據(jù)庫編程的靈活性。
MySQL****存儲過程的創(chuàng)建
語法
CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型[,[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型…]]) [特性 ...] 過程體
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; color: rgb(51, 51, 51); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0.544000029563904px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: pre-wrap; font-size: 14px; background-color: rgb(255, 255, 255);">DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT() INTO s FROM students;
END
//
DELIMITER ;*</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; color: rgb(51, 51, 51); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0.544000029563904px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: pre-wrap; font-size: 14px; background-color: rgb(255, 255, 255);">分隔符</pre>
MySQL默認(rèn)以";"為分隔符,如果沒有聲明分割符,則編譯器會把存儲過程當(dāng)成SQL語句進(jìn)行處理,因此編譯過程會報(bào)錯,所以要事先用“DELIMITER //”聲明當(dāng)前段分隔符,讓編譯器把兩個(gè)"http://"之間的內(nèi)容當(dāng)做存儲過程的代碼,不會執(zhí)行這些代碼;“DELIMITER ;”的意為把分隔符還原。
參數(shù)
存儲過程根據(jù)需要可能會有輸入、輸出、輸入輸出參數(shù),如果有多個(gè)參數(shù)用","分割開。MySQL存儲過程的參數(shù)用在存儲過程的定義,共有三種參數(shù)類型,IN,OUT,INOUT:
IN參數(shù)的值必須在調(diào)用存儲過程時(shí)指定,在存儲過程中修改該參數(shù)的值不能被返回,為默認(rèn)值
OUT****:該值可在存儲過程內(nèi)部被改變,并可返回
-
INOUT****:調(diào)用時(shí)指定,并且可被改變和返回
過程體
過程體的開始與結(jié)束使用BEGIN與END進(jìn)行標(biāo)識。
IN****參數(shù)例子
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">DELIMITER //
CREATE PROCEDURE in_param(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;
//
DELIMITER ;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#調(diào)用
SET @p_in=1;
CALL in_param(@p_in);</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SELECT @p_in;</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">執(zhí)行結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">以上可以看出,p_in雖然在存儲過程中被修改,但并不影響@p_id的值</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">OUT****參數(shù)例子</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">**#存儲過程OUT參數(shù)
DELIMITER //
CREATE PROCEDURE out_param(OUT p_out int)
BEGIN
SELECT p_out;
SET p_out=2;
SELECT p_out;
END;
//
DELIMITER ;調(diào)用
SET @p_out=1;
CALL out_param(@p_out);**</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SELECT @p_out;</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">執(zhí)行結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">INOUT****參數(shù)例子</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">**#存儲過程INOUT參數(shù)
DELIMITER //
CREATE PROCEDURE inout_param(INOUT p_inout int)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
//
DELIMITER ;調(diào)用
SET @p_inout=1;
CALL inout_param(@p_inout) ;
SELECT @p_inout;**</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">執(zhí)行結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
變量
語法:DECLARE 變量名1[,變量名2...] 數(shù)據(jù)類型 [默認(rèn)值];
數(shù)據(jù)類型為MySQL的數(shù)據(jù)類型:
數(shù)值類型
image日期和時(shí)間類型
image字符串類型
image變量賦值
語法:SET 變量名 = 變量值 [,變量名= 變量值 ...]
用戶變量
用戶變量一般以@開頭
注意:濫用用戶變量會導(dǎo)致程序難以理解及管理
#在MySQL客戶端使用用戶變量 SELECT 'Hello World' into @x;
SELECT @x;
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SET @y='Goodbye Cruel World';
SELECT @y;
SET @z=1+2+3;
SELECT @z;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">執(zhí)行結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
#在存儲過程中使用用戶變量 CREATE PROCEDURE GreetWorld() SELECT CONCAT(@greeting,' World');
SET @greeting='Hello';
CALL GreetWorld();執(zhí)行結(jié)果:
image#在存儲過程間傳遞全局范圍的用戶變量
CREATE PROCEDURE p1() SET @last_proc='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);
CALL p1();
CALL p2();執(zhí)行結(jié)果:
image -
注釋
MySQL存儲過程可使用兩種風(fēng)格的注釋:
雙杠:--,該風(fēng)格一般用于單行注釋
-
C風(fēng)格: 一般用于多行注釋
MySQL****存儲過程的調(diào)用
用call和你過程名以及一個(gè)括號,括號里面根據(jù)需要,加入?yún)?shù),參數(shù)包括輸入?yún)?shù)、輸出參數(shù)、輸入輸出參數(shù)。
MySQL****存儲過程的查詢
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#查詢存儲過程
SELECT name FROM mysql.proc WHERE db='數(shù)據(jù)庫名';
SELECT routine_name FROM information_schema.routines WHERE routine_schema='數(shù)據(jù)庫名';
SHOW PROCEDURE STATUS WHERE db='數(shù)據(jù)庫名';</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#查看存儲過程詳細(xì)信息
SHOW CREATE PROCEDURE 數(shù)據(jù)庫.存儲過程名;</pre>MySQL****存儲過程的修改
ALTER PROCEDURE 更改用CREATE PROCEDURE 建立的預(yù)先指定的存儲過程,其不會影響相關(guān)存儲過程或存儲功能。
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'</pre> sp_name參數(shù)表示存儲過程或函數(shù)的名稱;
characteristic參數(shù)指定存儲函數(shù)的特性。
CONTAINS SQL表示子程序包含SQL語句,但不包含讀或?qū)憯?shù)據(jù)的語句;
NO SQL表示子程序中不包含SQL語句;
READS SQL DATA表示子程序中包含讀數(shù)據(jù)的語句;
MODIFIES SQL DATA表示子程序中包含寫數(shù)據(jù)的語句。
SQL SECURITY { DEFINER | INVOKER }指明誰有權(quán)限來執(zhí)行,DEFINER表示只有定義者自己才能夠執(zhí)行;INVOKER表示調(diào)用者可以執(zhí)行。
-
COMMENT 'string'是注釋信息。
實(shí)例:
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">**#將讀寫權(quán)限改為MODIFIES SQL DATA,并指明調(diào)用者可以執(zhí)行。
ALTER PROCEDURE num_from_employee
MODIFIES SQL DATA
SQL SECURITY INVOKER ;將讀寫權(quán)限改為READS SQL DATA,并加上注釋信息'FIND NAME'。
ALTER PROCEDURE name_from_employee
READS SQL DATA
COMMENT 'FIND NAME' ;**</pre>MySQL****存儲過程的刪除
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">DROP PROCEDURE [過程1[,過程2…]]</pre>
從MySQL的表格中刪除一個(gè)或多個(gè)存儲過程。
MySQL****存儲過程的控制語句
變量作用域
內(nèi)部變量在其作用域范圍內(nèi)享有更高的優(yōu)先權(quán),當(dāng)執(zhí)行到end時(shí),內(nèi)部變量消失,不再可見了,在存儲
過程外再也找不到這個(gè)內(nèi)部變量,但是可以通過out參數(shù)或者將其值指派給會話變量來保存其值。<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">**#變量作用域
DELIMITER //
CREATE PROCEDURE proc()
BEGIN
DECLARE x1 VARCHAR(5) DEFAULT 'outer';
BEGIN
DECLARE x1 VARCHAR(5) DEFAULT 'inner';
SELECT x1;
END;
SELECT x1;
END;
//
DELIMITER ;調(diào)用
CALL proc();**</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">執(zhí)行結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
條件語句
IF-THEN-ELSE語句
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#條件語句IF-THEN-ELSE
DROP PROCEDURE IF EXISTS proc3;
DELIMITER //
CREATE PROCEDURE proc3(IN parameter int)
BEGIN
DECLARE var int;
SET var=parameter+1;
IF var=0 THEN
INSERT INTO t VALUES (17);
END IF ;
IF parameter=0 THEN
UPDATE t SET s1=s1+1;
ELSE
UPDATE t SET s1=s1+2;
END IF ;
END ;
//
DELIMITER ;</pre>CASE-WHEN-THEN-ELSE語句
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#CASE-WHEN-THEN-ELSE語句
DELIMITER //
CREATE PROCEDURE proc4 (IN parameter INT)
BEGIN
DECLARE var INT;
SET var=parameter+1;
CASE var
WHEN 0 THEN
INSERT INTO t VALUES (17);
WHEN 1 THEN
INSERT INTO t VALUES (18);
ELSE
INSERT INTO t VALUES (19);
END CASE ;
END ;
//
DELIMITER ;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">循環(huán)語句</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">WHILE-DO…END-WHILE DELIMITER //
CREATE PROCEDURE proc5()
BEGIN
DECLARE var INT;
SET var=0;
WHILE var<6 DO
INSERT INTO t VALUES (var);
SET var=var+1;
END WHILE ;
END;
//
DELIMITER ;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">REPEAT...END REPEAT</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">此語句的特點(diǎn)是執(zhí)行操作后檢查結(jié)果 DELIMITER //
CREATE PROCEDURE proc6 ()
BEGIN
DECLARE v INT;
SET v=0;
REPEAT
INSERT INTO t VALUES(v);
SET v=v+1;
UNTIL v>=5
END REPEAT;
END;
//
DELIMITER ;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">LOOP...END LOOP DELIMITER //
CREATE PROCEDURE proc7 ()
BEGIN
DECLARE v INT;
SET v=0;
LOOP_LABLE:LOOP
INSERT INTO t VALUES(v);
SET v=v+1;
IF v >=5 THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;
END;
//
DELIMITER ;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">LABLES****標(biāo)號</pre>
標(biāo)號可以用在begin repeat while 或者loop 語句前,語句標(biāo)號只能在合法的語句前面使用??梢蕴鲅h(huán),使運(yùn)行指令達(dá)到復(fù)合語句的最后一步。
ITERATE****迭代
通過引用復(fù)合語句的標(biāo)號,來從新開始復(fù)合語句
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#ITERATE
DELIMITER //
CREATE PROCEDURE proc8()
BEGIN
DECLARE v INT;
SET v=0;
LOOP_LABLE:LOOP
IF v=3 THEN
SET v=v+1;
ITERATE LOOP_LABLE;
END IF;
INSERT INTO t VALUES(v);
SET v=v+1;
IF v>=5 THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;
END;
//
DELIMITER ;</pre><pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">MySQL****存儲過程的基本函數(shù)</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">字符串類</pre>
CHARSET(str) //返回字串字符集
CONCAT (string2 [,... ]) //連接字串
INSTR (string ,substring ) //返回substring首次在string中出現(xiàn)的位置,不存在返回0
LCASE (string2 ) //轉(zhuǎn)換成小寫
LEFT (string2 ,length ) //從string2中的左邊起取length個(gè)字符
LENGTH (string ) //string長度
LOAD_FILE (file_name ) //從文件讀取內(nèi)容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定開始位置
LPAD (string2 ,length ,pad ) //重復(fù)用pad加在string開頭,直到字串長度為length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重復(fù)count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替換search_str
RPAD (string2 ,length ,pad) //在str后用pad補(bǔ)充,直到長度為length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比較兩字串大小,
SUBSTRING (str , position [,length ]) //從str的position開始,取length個(gè)字符,
注:mysql中處理字符串時(shí),默認(rèn)第一個(gè)字符下標(biāo)為1,即參數(shù)position必須大于等于1<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SELECT SUBSTRING('abcd',0,2);</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SELECT SUBSTRING('abcd',1,2);</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">結(jié)果:</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //轉(zhuǎn)換成大寫
RIGHT(string2,length) //取string2最后length個(gè)字符
SPACE(count) //生成count個(gè)空格數(shù)學(xué)類
ABS (number2 ) //絕對值
BIN (decimal_number ) //十進(jìn)制轉(zhuǎn)二進(jìn)制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //進(jìn)制轉(zhuǎn)換
FLOOR (number2 ) //向下取整
FORMAT (number,decimal_places ) //保留小數(shù)位數(shù)
HEX (DecimalNumber ) //轉(zhuǎn)十六進(jìn)制
注:HEX()中可傳入字符串,則返回其ASC-11碼,如HEX('DEF')返回4142143
也可以傳入十進(jìn)制整數(shù),返回其十六進(jìn)制編碼,如HEX(25)返回19
LEAST (number , number2 [,..]) //求最小值
MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指數(shù)
RAND([seed]) //隨機(jī)數(shù)
ROUND (number [,decimals ]) //四舍五入,decimals為小數(shù)位數(shù)] 注:返回類型并非均為整數(shù),如:<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#默認(rèn)變?yōu)檎椭?/strong></pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SELECT ROUND(1.23);</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SELECT ROUND(1.56);</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">#設(shè)定小數(shù)位數(shù),返回浮點(diǎn)型數(shù)據(jù)
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">
SELECT ROUND(1.567,2);</pre>image</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">SIGN (number2 ) // 正數(shù)返回1,負(fù)數(shù)返回-1</pre>
<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; word-wrap: break-word; white-space: pre-wrap;">日期時(shí)間類</pre>
ADDTIME (date2 ,time_interval ) //將time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //轉(zhuǎn)換時(shí)區(qū)
CURRENT_DATE ( ) //當(dāng)前日期
CURRENT_TIME ( ) //當(dāng)前時(shí)間
CURRENT_TIMESTAMP ( ) //當(dāng)前時(shí)間戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或時(shí)間
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式顯示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上減去一個(gè)時(shí)間
DATEDIFF (date1 ,date2 ) //兩個(gè)日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1為星期天
DAYOFYEAR (date ) //一年中的第幾天
EXTRACT (interval_name FROM date ) //從date中提取日期的指定部分
MAKEDATE (year ,day ) //給出年及年中的第幾天,生成日期串
MAKETIME (hour ,minute ,second ) //生成時(shí)間串
MONTHNAME (date ) //英文月份名
NOW ( ) //當(dāng)前時(shí)間
SEC_TO_TIME (seconds ) //秒數(shù)轉(zhuǎn)成時(shí)間
STR_TO_DATE (string ,format ) //字串轉(zhuǎn)成時(shí)間,以format格式顯示
TIMEDIFF (datetime1 ,datetime2 ) //兩個(gè)時(shí)間差
TIME_TO_SEC (time ) //時(shí)間轉(zhuǎn)秒數(shù)]
WEEK (date_time [,start_of_week ]) //第幾周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第幾天
HOUR(datetime) //小時(shí)
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分返回符號,正負(fù)或0
SQRT(number2) //開平方