搜尋
首頁資料庫mysql教程Mysql触发器、模糊查找、存储过程、内置函数_MySQL

原本觉得Mysql的一些知识还是差不多了,但是在实际上在项目上用的时候,发现什么都忘记了。现在重新回顾一下,顺便做个笔记。

触发器                                                                                        

  • 查看所有触发器
    SELECT * FROM information_schema.`TRIGGERS`;
  • 触发器的应用

    背景,两张表:

    imageimage

    创建触发器,功能是在yyd_table中插入数据,yyd_那么中也触发插入数据。

    image

    CREATE TRIGGER yyd_tri AFTER INSERT ON yyd_table FOR EACH ROWBEGININSERT INTO yyd_name VALUES (NULL,"name_yyd");END;

    执行效果:

    imageimage

    image

    再来一发,对yyd_name插入的时候将name改为4:

    CREATE TRIGGER yyd_tri1 BEFORE INSERT ON yyd_name FOR EACH ROWBEGINSET @x = "123321";SET NEW.name = "4";END;
  • 删除触发器
    DROP trigger  yyd_tri;
  • 可能遇到的问题

    如果你在触发器里面对刚刚插入的数据进行了 insert/update, 会造成循环的调用。 如:

    create trigger test before update on test for each row 
    update test set NEW.updateTime = NOW() where id=NEW.ID; 
    END

    应该使用set:

    create trigger test before update on test for each row set NEW.updateTime = NOW(); END
  • 语法
    CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt

    trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER

    trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

  • INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
  • UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
  • DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

    模糊查找                                                                                     

    SELECT 字段 FROM 表 WHERE 某字段 Like 条件
  • 匹配模式
  • %:表示任意0个或多个字符。可匹配任意类型和长度的字符。
    SELECT * FROM [user] WHERE u_name LIKE '%三%'

    将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。

    另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件

    SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'

     

  • [ ] :表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
  • [^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
  • _ : 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。
    SELECT * FROM [user] WHERE u_name LIKE '_三_'

    只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;

    SELECT * FROM [user] WHERE u_name LIKE '三__';

    只找出“三脚猫”这样name为三个字且第一个字是“三”的;

    存储过程                                                                                     

  • 格式
    mysql> DELIMITER //  mysql> CREATE PROCEDURE proc1(OUT s int)      -> BEGIN     -> SELECT COUNT(*) INTO s FROM user;      -> END     -> //  mysql> DELIMITER ;
  • 这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,这里把分隔符给替换成//。
  • 存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
  • 程体的开始与结束使用BEGIN与END进行标识。

    MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

    CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])

    IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

    OUT 输出参数:该值可在存储过程内部被改变,并可返回

    INOUT 输入输出参数:调用时指定,并且可被改变和返回

    只举一个例子:

    mysql > DELIMITER //  mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)  -> BEGIN   -> SELECT p_in;   -> SET p_in=2;   -> SELECT p_in;   -> END;   -> //  mysql > DELIMITER ;

    结果:

    mysql > SET @p_in=1;  mysql > CALL demo_in_parameter(@p_in);  +------+  | p_in |  +------+  |   1  |   +------+   +------+  | p_in |  +------+  |   2  |   +------+   mysql> SELECT @p_in;  +-------+  | @p_in |  +-------+  |  1    |  +-------+

     

  • 变量
    DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

    其中,datatype为MySQL的数据类型,如:int, float, date, varchar(length)

    比如:

    DECLARE l_int int unsigned default 4000000;  DECLARE l_numeric number(8,2) DEFAULT 9.95;  DECLARE l_date date DEFAULT '1999-12-31';  DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';  DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';

    赋值:

    SET 变量名 = 表达式值 [,variable_name = expression ...]

    用户变量:

    mysql > SELECT 'Hello World' into @x;  mysql > SELECT @x;  +-------------+  |   @x        |  +-------------+  | Hello World |  +-------------+  mysql > SET @y='Goodbye Cruel World';  mysql > SELECT @y;  +---------------------+  |     @y              |  +---------------------+  | Goodbye Cruel World |  +---------------------+   mysql > SET @z=1+2+3;  mysql > SELECT @z;  +------+  | @z   |  +------+  |  6   |  +------+

    变量与存储过程:

    mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  mysql > SET @greeting='Hello';  mysql > CALL GreetWorld( );  +----------------------------+  | CONCAT(@greeting,' World') |  +----------------------------+  |  Hello World               |  +----------------------------+  mysql> CREATE PROCEDURE p1()   SET @last_procedure='p1';  mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc);  mysql> CALL p1( );  mysql> CALL p2( );  +-----------------------------------------------+  | CONCAT('Last procedure was ',@last_proc  |  +-----------------------------------------------+  | Last procedure was p1                         |  +-----------------------------------------------+
  • 变量作用域:

    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc3()       -> begin      -> declare x1 varchar(5) default 'outer';       -> begin      -> declare x1 varchar(5) default 'inner';       -> select x1;       -> end;       -> select x1;       -> end;       -> //  mysql > DELIMITER ;

    内部的变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派给会话变量来保存其值。

  • 存储过程的查询
  • select name from mysql.proc where db=’数据库名’;select routine_name from information_schema.routines where routine_schema='数据库名';show procedure status where db='数据库名';
    • 存储过程的删除
    DROP PROCEDURE
    • if-then -else语句
    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc2(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;       -> //  mysql > DELIMITER ;
    • case语句
    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc3 (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;       -> //  mysql > DELIMITER ;
    • while ···· end while语句
    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc4()       -> begin      -> declare var int;       -> set var=0;       -> while var insert into t values(var);       -> set var=var+1;       -> end while;       -> end;       -> //  mysql > DELIMITER ;
    • repeat···· end repeat语句
    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc5 ()       -> begin        -> declare v int;       -> set v=0;       -> repeat       -> insert into t values(v);       -> set v=v+1;       -> until v>=5       -> end repeat;       -> end;       -> //  mysql > DELIMITER ;

    类似do…while语句。

    • loop ·····end loop语句
    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc6 ()       -> 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;       -> //  mysql > DELIMITER ;

    loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。

    • ITERATE迭代
    mysql > DELIMITER //  mysql > CREATE PROCEDURE proc10 ()       -> 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;       -> //  mysql > DELIMITER ;

    通过引用复合语句的标号,来从新开始复合语句。

    内置函数                                                                                      

    • 字符串

    CHARSET(str) //返回字串字符集

    CONCAT (string2 [,... ]) //连接字串

    INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0

    LCASE (string2 ) //转换成小写

    LEFT (string2 ,length ) //从string2中的左边起取length个字符

    LENGTH (string ) //string长度

    LOAD_FILE (file_name ) //从文件读取内容

    LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置

    LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length

    LTRIM (string2 ) //去除前端空格

    REPEAT (string2 ,count ) //重复count次

    REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str

    RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length

    RTRIM (string2 ) //去除后端空格

    STRCMP (string1 ,string2 ) //逐字符比较两字串大小,

    SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,

    注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1

    TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符

    UCASE (string2 ) //转换成大写

    RIGHT(string2,length) //取string2最后length个字符

    SPACE(count) //生成count个空格

    • 数字数学

    ABS (number2 ) //绝对值

    BIN (decimal_number ) //十进制转二进制

    CEILING (number2 ) //向上取整

    CONV(number2,from_base,to_base) //进制转换

    FLOOR (number2 ) //向下取整

    FORMAT (number,decimal_places ) //保留小数位数

    HEX (DecimalNumber ) //转十六进制

    注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19

    LEAST (number , number2 [,..]) //求最小值

    MOD (numerator ,denominator ) //求余

    POWER (number ,power ) //求指数

    RAND([seed]) //随机数

    ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]

    • 日期时间

    ADDTIME (date2 ,time_interval ) //将time_interval加到date2

    CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区

    CURRENT_DATE ( ) //当前日期

    CURRENT_TIME ( ) //当前时间

    CURRENT_TIMESTAMP ( ) //当前时间戳

    DATE (datetime ) //返回datetime的日期部分

    DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间

    DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime

    DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间

    DATEDIFF (date1 ,date2 ) //两个日期差

    DAY (date ) //返回日期的天

    DAYNAME (date ) //英文星期

    DAYOFWEEK (date ) //星期(1-7) ,1为星期天

    DAYOFYEAR (date ) //一年中的第几天

    EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分

    MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串

    MAKETIME (hour ,minute ,second ) //生成时间串

    MONTHNAME (date ) //英文月份名

    NOW ( ) //当前时间

    SEC_TO_TIME (seconds ) //秒数转成时间

    STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示

    TIMEDIFF (datetime1 ,datetime2 ) //两个时间差

    TIME_TO_SEC (time ) //时间转秒数]

    WEEK (date_time [,start_of_week ]) //第几周

    YEAR (datetime ) //年份

    DAYOFMONTH(datetime) //月的第几天

    HOUR(datetime) //小时

    LAST_DAY(date) //date的月的最后日期

    MICROSECOND(datetime) //微秒

    MONTH(datetime) //月

    MINUTE(datetime) //分返回符号,正负或0

    SQRT(number2) //开平方

    我是天王盖地虎的分割线                                                                

    参考:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921914.html

    参考:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html

     

     

     

    转载请注明出处:http://www.cnblogs.com/yydcdut/

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您什麼時候應該使用複合索引與多個單列索引?您什麼時候應該使用複合索引與多個單列索引?Apr 11, 2025 am 12:06 AM

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)Apr 10, 2025 am 09:36 AM

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL:開發人員的基本技能MySQL和SQL:開發人員的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

描述MySQL異步主奴隸複製過程。描述MySQL異步主奴隸複製過程。Apr 10, 2025 am 09:30 AM

MySQL異步主從復制通過binlog實現數據同步,提升讀性能和高可用性。 1)主服務器記錄變更到binlog;2)從服務器通過I/O線程讀取binlog;3)從服務器的SQL線程應用binlog同步數據。

mysql:簡單的概念,用於輕鬆學習mysql:簡單的概念,用於輕鬆學習Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL:數據庫的用戶友好介紹MySQL:數據庫的用戶友好介紹Apr 10, 2025 am 09:27 AM

MySQL的安裝和基本操作包括:1.下載並安裝MySQL,設置根用戶密碼;2.使用SQL命令創建數據庫和表,如CREATEDATABASE和CREATETABLE;3.執行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.創建索引和存儲過程以優化性能和實現複雜邏輯。通過這些步驟,你可以從零開始構建和管理MySQL數據庫。

InnoDB緩衝池如何工作,為什麼對性能至關重要?InnoDB緩衝池如何工作,為什麼對性能至關重要?Apr 09, 2025 am 12:12 AM

InnoDBBufferPool通過將數據和索引頁加載到內存中來提升MySQL數據庫的性能。 1)數據頁加載到BufferPool中,減少磁盤I/O。 2)臟頁被標記並定期刷新到磁盤。 3)LRU算法管理數據頁淘汰。 4)預讀機制提前加載可能需要的數據頁。

MySQL:初學者的數據管理易用性MySQL:初學者的數據管理易用性Apr 09, 2025 am 12:07 AM

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。