您的位置:首页 > 数据库 > MySQL

MySQL 之 视图、触发器、流程控制、函数

2019-05-17 16:57 691 查看

文章目录

  • 触发器
  • 流程控制
  • 自定义函数
  • 内置函数
  • 视图

    视图概念

    视图可以简单理解成虚拟表,它和数据库中真实存在数据表不同,视图中的数据是基于真实表查询得到的。视图和真实表一样具备相似的结构。真实表的更新,查询,删除等操作,视图也支持。所以视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可。

    视图好处

    • 提升真实表的安全性:
      视图是虚拟的,可以只授予用户视图的权限而不授予真实表的权限,起到保护真实表的作用。

    • 定制化展示数据:
      基于同样的实际表,可以通过不同的视图来向不同需求的用户定制化展示数据。

    • 简化数据操作:
      适用于查询语句比较复杂使用频率较高的场景,可以通过视图来实现。

    视图的操作

    创建一个视图

    create  view  视图名 【(字段名1,字段名2,..... )】  as  select语句的完整代码 ;
    创建一个teacger2course的视图
    create view teacher2course as
    select * from teacher inner join course on teacher.tid = course.teacher_id;

    修改一个视图

    修改视图,其实就是修改视图中的select语句而已——相当于重写一下该select语句;

    alter  view  视图名  as  新的select语句;

    删除一个视图

    drop view 视图名;

    强调
    1、在硬盘中,视图只有表结构文件,没有表数据文件
    2、视图通常是用于查询,尽量不要修改视图中的数据

    触发器

    触发器是提供给程序员和数据分析员来保证数据完整性的一种方法,是一种特殊类型的存储过程,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。

    触发器的特点

    • 优点:
      1.可以基于数据库的值使用户具有操作数据库的某种权利。
      2.可以跟踪用户对数据库的操作。
      3.触发器可以对数据库中相关的表进行连环更新。触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。
      4.同步实时地复制表中的数据。
      5.自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。

    触发器的操作

    创建触发器

    CREATE TRIGGER 触发器名称
    触发时机
    触发操作
    ON 表名
    FOR EACH ROW
    触发体

    描述:

    触发器名称:用来表示触发器的名称,可以自己定义,一般见名知意。
    触发时机:标识触发器的触发时机,取值是BEFORE或AFTER。
    触发操作 :标识触发事件,取值为INSERT,UPDATE和DELETE
    表名:标识建立触发器的表名,即在哪张表上建立触发器
    触发体:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

    由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
    不能在一个表中建两个相同类型的触发器,所以一个表最多只能建6个触发器

    DELIMITER改变分隔符:
    DELIMITER是MySQL用来改变监视器中分离符的命令。默认的分隔符是【;】,但是,存储过程本身就是命令的集合,所以一定还会含有其他的分隔符。那么它们彼此之间冲突和混淆,所以在创建存储过程之前,我们需要将默认符换成一个完全无关的符号,只要不与其他关键字发生歧义即可,通常使用的是【$$】。在完成创建之后,我们再将其回复即可。但需要提醒的是:分隔符的改变只会在启动期间有效,重新启动后,会自动恢复到默认状态。

    #案例
    CREATE TABLE cmd (
    id INT PRIMARY KEY auto_increment,
    USER CHAR (32),
    priv CHAR (10),
    cmd CHAR (64),
    sub_time datetime, #提交时间
    success enum ('yes', 'no') #0代表执行失败
    );
    
    CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
    );
    
    delimiter $$    # 将mysql默认的结束符由;换成$$
    create trigger tri_after_insert_cmd after insert on cmd for each row
    begin
    if NEW.success = 'no' then    # 新记录都会被MySQL封装成NEW对象
    insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
    end if;
    end $$
    delimiter
    30f25
    ;   # 结束之后记得再改回来,不然后面结束符就都是$$了
    
    # 往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
    INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
    )
    VALUES
    ('linwow','0755','ls -l /etc',NOW(),'yes'),
    ('linwow','0755','cat /etc/passwd',NOW(),'no'),
    ('linwow','0755','useradd xxx',NOW(),'no'),
    ('linwow','0755','ps aux',NOW(),'yes');
    
    # 查询cmd表记录
    select * from cmd;
    mysql> select * from cmd;
    +----+--------+------+-----------------+---------------------+---------+
    | id | USER   | priv | cmd             | sub_time            | success |
    +----+--------+------+-----------------+---------------------+---------+
    |  1 | linwow | 0755 | ls -l /etc      | 2019-05-17 15:46:34 | yes     |
    |  2 | linwow | 0755 | cat /etc/passwd | 2019-05-17 15:46:34 | no      |
    |  3 | linwow | 0755 | useradd xxx     | 2019-05-17 15:46:34 | no      |
    |  4 | linwow | 0755 | ps aux          | 2019-05-17 15:46:34 | yes     |
    |  5 | linwow | 0755 | ls -l /etc      | 2019-05-17 15:48:17 | yes     |
    |  6 | linwow | 0755 | cat /etc/passwd | 2019-05-17 15:48:17 | no      |
    |  7 | linwow | 0755 | useradd xxx     | 2019-05-17 15:48:17 | no      |
    |  8 | linwow | 0755 | ps aux          | 2019-05-17 15:48:17 | yes     |
    +----+--------+------+-----------------+---------------------+---------+
    
    # 查询errlog表记录
    select * from errlog;
    mysql> select * from errlog;
    +----+-----------------+---------------------+
    | id | err_cmd         | err_time            |
    +----+-----------------+---------------------+
    |  1 | cat /etc/passwd | 2019-05-17 15:46:34 |
    |  2 | useradd xxx     | 2019-05-17 15:46:34 |
    +----+-----------------+---------------------+

    删除触发器

    drop trigger tri_after_insert_cmd;

    流程控制

    常用的流程控制语句:

    if语句
    if语句用于进行条件判断。根据是否满足条件,将执行不同的语句。

    IF 判断条件 THEN 执行语句
    [ELSEIF 判断条件 THEN 执行语句] ...
    [ELSE 执行语句]
    END IF

    case语句

    CASE 语句也用于条件判断,可以实现比 IF 语句更复杂的判断。

    第一种
    CASE 条件判断的变量
    WHEN 变量取值 THEN 执行语句
    [WHEN 变量取值 THEN 执行语句] ...
    [ELSE 执行语句]
    END CASE
    第二种
    CASE
    WHEN 变量取值 THEN 执行语句
    [WHEN 变量取值 THEN 执行语句] ...
    [ELSE 执行语句]
    END CASE

    while循环语句

    WHILE语句也是有条件控制的循环语句。但WHILE语句和REPEAT语句是不一样的。

    WHILE 循环执行的条件 DO
    执行语句
    END WHILE

    loop循环语句

    LOOP 语句可以使某些特定的语句重复执行,实现一个简单的循环。但 LOOP 语句本身没有结束循环的语句,遇到LEAVE语句等才能停止循环。

    LOOP
    执行语句
    IF 结束条件THEN LEAVE
    END LOOP

    repeat循环语句

    REPEAT语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环。

    REPEAT
    执行语句
    UNTIL 结束条件
    END REPEAT

    if条件语句

    delimiter //
    CREATE PROCEDURE proc_if ()
    BEGIN
    
    declare i int default 0;
    if i = 1 THEN
    SELECT 1;
    ELSEIF i = 2 THEN
    SELECT 2;
    ELSE
    SELECT 7;
    END IF;
    
    END //
    delimiter ;

    while循环

    delimiter //
    CREATE PROCEDURE proc_while ()
    BEGIN
    
    DECLARE num INT ;
    SET num = 0 ;
    WHILE num < 10 DO
    SELECT
    num ;
    SET num = num + 1 ;
    END WHILE ;
    
    END //
    delimiter ;

    自定义函数

    自己定义函数,能够实现特定的功能。有时在自己定义函数的时候会报错ERROR 1418 (HY000),不是Mysql 函数不能创建,是未开启功能,我们要先开启功能。

    mysql> show variables like '%func%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin_trust_function_creators | OFF   |
    +---------------------------------+-------+
    
    mysql> set global log_bin_trust_function_creators=1;
    
    mysql> show variables like '%func%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin_trust_function_creators | ON    |
    +---------------------------------+-------+

    创建函数

    create function 函数名(参数列表)
    returns 返回值类型
    函数体

    描述:

    函数名:应该合法的标识符,并且不应该与已有的关键字冲突。一个函数应该属于	某数据库,可以使用db_name.fun_name的形式执行当前函数所属数据库,否则默	认为当前数据库。
    参数列表:可以有一个或者多个函数参数,甚至是没有参数也是可以的。
    返回值:指明返回值类类型。
    函数体:自定义函数的函数体由多条可用的MySQL语句,流程控制,变量声明等	语句构成。需要指明的是函数体中一定要含有return 返回语句。

    调用函数

    select 函数名(参数列表)

    删除函数

    DROP FUNCTION IF EXISTS 函数名;
    # 功能:返回字符串
    delimiter $$
    create function fun1()
    returns varchar(255)
    begin
    return 'I am a funcation';
    end
    $$
    delimiter ;
    
    # 通过select 函数名来执行函数
    select fun1();
    
    mysql> select fun1();
    +------------------+
    | fun1()           |
    +------------------+
    | I am a funcation |
    +------------------+
    
    # 功能:实现两个整数相加
    delimiter $$
    create function fn_add(a int,b int )
    returns int
    begin
    return a+b;
    end
    $$
    delimiter ;
    
    select fn_add(200,50);
    
    mysql> select fn_add(200,50);
    +----------------+
    | fn_add(200,50) |
    +----------------+
    |            250 |
    +----------------+
    
    # 删除自定义函数fn_add
    drop function if exists fn_add;

    内置函数

    一、数值函数

    ​ 1.abs(x):返回绝对值

    ​ 2.ceil(x)或ceiling(x):返回大于x的最小整数

    ​ 3.floor(x):返回小于x的最大整数

    ​ 4.mod(x,y):返回x与y的模

    ​ 5.rand():返回0-1之间的随机数

    ​ 6.round(x,y):返回参数x的y位小数的四舍五入结果

    ​ 7.truncate(x,y):返回数字x截断为y位小数的结果

    ​ 8.pi():返回圆周率

    ​ 9.sqrt(x):返回x的算术平方根

    ​ 10.sign(x):返回x的符号,正为1,负为-1,零为0

    ​ 11.pow(x,y)或power(x,y):返回x的y次方

    ​ 12.exp(x):返回e的x次方

    ​ 13.log(x):返回x的自然对数

    ​ 14.log10(x):返回以10为底的对数

    ​ 15.radians(x):返回角度换弧度

    ​ 16.degrees(x):返回弧度换角度

    ​ 17.sin(x):返回x的正弦

    ​ 18.asin(x):返回x的反正弦

    ​ 19.cos(x):返回x的余弦

    ​ 20.acos(x):返回x的反余弦

    ​ 21.tan(x):返回x的正切

    ​ 22.atan(x):返回x的反正切

    ​ 23.cot(x):返回x的余切

    二、字符串函数

    ​ 1.concat(s1,s2…sn):把传入的参数连接成一个字符串

    ​ 2.insert(str,x,y,insert):从str的x位置开始,替换y长度的字符串为insert

    ​ 3.lower(str),upper(str):将字符串转换为大写,小写

    ​ 4.left(str,x) right(str,x) 返回str左边(右边)x个字符,x为null则返回null

    ​ 5.lpad(str,n,pad) rpad(str,n,pad) 用pad对字符串str从最左边(右边)进行填充,直到总长度达到n

    ​ 6.trim(),ltrim(),rtrim()去掉两边,左边,右边空格

    ​ 7.replace(str,a,b) 在字符串str中用字符串b替换所有的字符串a

    ​ 8.strcmp(s1,s2):如果S1比S2小,返回-1;如果S1比S2大则返回1;如果相等则返回0(比较的是ASC2码)

    ​ 9.substring(str,x,y) 返回字符串str中从位置x起,长度为y的子字符串

    ​ 10.length(str):返回str所包含的字节长度

    ​ 11.har_length(str):返回str所包含的字符长度

    ​ 12.concat_ws(x,s1,s2…):使用x连接其他参数并产生字符串

    ​ 13.repeat(str,count):返回str重复

    ​ 14.space(N):返回长度为N的空白字符串

    ​ 15.locate(substr,str),locate(substr,pos),instr(str,substr),position(substr IN str):返回字符串中指定字符串的位置,其中instr的参数位置与其他函数相反

    ​ 16.elt(N,str1,str2,str3…):返回参数strN,若N大于str参数个数,则返回NULL

    ​ 17.field(str,str1,str2,str3,…):返回str后的str…列表中第一次出现的位置,所找不到str或str为null,则返回0

    三、日期函数
    1.curdate() ,current_date():用于获取当前日期,格式为‘YYYY-MM-DD’

    ​ 2.UTC_DATE():返回当前世界标准时间

    ​ 3.CURTIME(),CURRENT_TIME():用于获取当前的世界,格式为‘HH:MM:SS’

    ​ 4.UTC_TIME(),CURRENT_TIMESTAMP(),LOCALTIME(),SYSDATE(),NOW():用于获取当前的日期时间,格式为‘YYYY-MM-DD HH:MM:SS’

    5.UTC_TIMESTAMP(),UNIX_TIMESTAMP():返回一个时间戳

    6.month(date):返回date的月份

    7.monthname(date):返回date的月份名

    8.dayname(date):返回date的日期名

    9.day(date),dayofmonth(date):返回1-31或0

    10.dayofweek(date):返回1-7,对应星期天-星期六

    11.dayofyear(date):返回1-365或366

    12.week(date[,mode]):判断是一年的第几周,mode为人为定义一周从星期几开始

    13.weekofyear(date):从星期一开始计算一周

    14.hour(time):返回时间中的小时数,可以大于24

    15.minute(time):返回时间中的分钟数

    16.second(time):返回时间中的秒数

    17.to_days(date):从第0年至date的天数

    18.to_secnds(date):从第0年至date的秒数

    19.adddate(date,interval expr unit),adddate(expr,days),date_add(date,interval expr unit),addtime(expr1,expr2) :日期加

    20.date_sub(date,interval expr unit),subtime(expr1,expr2):日期减

    21.date_format(date,format):格式化日期

    22.datediff(expr1,expr2):返回相差的天数

    23.timediff(expr1,expr2):返回相隔的时间

    四、流程控制语句

    ​ 1. if(value,t,f):如果value为真,那么值为t,否则为f

    ​ 2.ifnull(t,f): 如果t为null,那么值为f

    ​ 3.case when [value1] then [result1]…else[default]end:如果value1成立,那么值为result1,否则为default

    五、系统信息函数
    1.database() ,schema():获取正在操作的数据库

    2.version():获取正在操作的数据库的版本

    3.user(),session_user(),system_user(),current_user():获取当前用户名@主机

    4.connection_id():显示连接号

    5.inet_aton(ip) 将字符串地址转换为网络地址

    六、加密和压缩

    1.password(): 对mysql用户加密

    2.md5(): 对用户密码加密

    3.sha1(),sha():进行哈希加密

    4.compress(str):返回二进制码

    具体可参照官方文档:https://dev.mysql.com/doc/refman/5.6/en/func-op-summary-ref.html

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐