搜索
首页数据库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
如何使用Alter Table语句在MySQL中更改表?如何使用Alter Table语句在MySQL中更改表?Mar 19, 2025 pm 03:51 PM

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

如何为MySQL连接配置SSL/TLS加密?如何为MySQL连接配置SSL/TLS加密?Mar 18, 2025 pm 12:01 PM

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

您如何处理MySQL中的大型数据集?您如何处理MySQL中的大型数据集?Mar 21, 2025 pm 12:15 PM

文章讨论了处理MySQL中大型数据集的策略,包括分区,碎片,索引和查询优化。

哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么?哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么?Mar 21, 2025 pm 06:28 PM

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

如何使用Drop Table语句将表放入MySQL中?如何使用Drop Table语句将表放入MySQL中?Mar 19, 2025 pm 03:52 PM

本文讨论了使用Drop Table语句在MySQL中放下表,并强调了预防措施和风险。它强调,没有备份,该动作是不可逆转的,详细介绍了恢复方法和潜在的生产环境危害。

您如何用外国钥匙代表关系?您如何用外国钥匙代表关系?Mar 19, 2025 pm 03:48 PM

文章讨论了使用外国密钥来代表数据库中的关系,重点是最佳实践,数据完整性和避免的常见陷阱。

如何在JSON列上创建索引?如何在JSON列上创建索引?Mar 21, 2025 pm 12:13 PM

本文讨论了在PostgreSQL,MySQL和MongoDB等各个数据库中的JSON列上创建索引,以增强查询性能。它解释了索引特定的JSON路径的语法和好处,并列出了支持的数据库系统。

如何保护MySQL免受常见漏洞(SQL注入,蛮力攻击)?如何保护MySQL免受常见漏洞(SQL注入,蛮力攻击)?Mar 18, 2025 pm 12:00 PM

文章讨论了使用准备好的语句,输入验证和强密码策略确保针对SQL注入和蛮力攻击的MySQL。(159个字符)

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尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中