MySQL的存儲過程

原文: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ù)
    SELECT ROUND(1.567,2);
    </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;">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) //開平方

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自這里 存儲過程簡介 我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行,而存儲過程(Sto...
    杜七閱讀 2,474評論 4 27
  • SQL語句需要先編譯然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,...
    MIN_ZJM閱讀 739評論 0 1
  • 原文鏈接 MySQL存儲過程詳解 1.存儲過程簡介 我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時(shí)候需要要先編譯,然...
    亞斯咪妮閱讀 2,726評論 1 30
  • MYSQL 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 8,067評論 5 115
  • 觀其大綱 page 01 基礎(chǔ)知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 M...
    周少言閱讀 3,255評論 0 33

友情鏈接更多精彩內(nèi)容