暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

Linux Windows server学习交流 2020-05-23
130
本章内容:
  • 视图、增/删/改/查

  • 触发器、增/删/改/查

  • 存储过程、增/删/改/查

  • 存储过程三种传参,pymysql 怎么用?

  • 函数、增/删/改/查/return值

  • 内置函数

  • 事务

  • 索引


一、视图

视图是查询命令结果构成的一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集合,并可以当作表来查询使用。

1、创建视图

    --格式:CREATE VIEW 视图名称 AS  SQL语句
    CREATE VIEW v1 AS
    SELET nid,
    name
    FROM
    A
    WHERE
    nid > 4
    复制

    2、删除视图

      --格式:DROP VIEW 视图名称


      DROP VIEW v1
      复制

      复制

      3、修改视图

        -- 格式:ALTER VIEW 视图名称 AS SQL语句


        ALTER VIEW v1 AS
        SELET A.nid,
        B. NAME
        FROM
        A
        LEFT JOIN B ON A.id = B.nid
        LEFT JOIN C ON A.id = C.nid
        WHERE
        A.id > 2
        AND C.nid < 5
        复制

        4、使用视图

        视图的使用和普通表一样,由于视图是虚拟表,所以无法对其真实表进行创建、更新和删除操作,仅做查询用。

          select * from v1
          复制

           

          二、触发器

          对某个表进行【增/删/改】操作的前后触发一些操作即为触发器,如果希望触发增删改的行为之前或之后做操作时,可以使用触发器,触发器用于自定义用户对表的行进行【增/删/改】前后的行为。

          1、基本语法

          复制
            # 插入前
            CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
            BEGIN
            ...
            END


            # 插入后
            CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
            BEGIN
            ...
            END


            # 删除前
            CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
            BEGIN
            ...
            END


            # 删除后
            CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
            BEGIN
            ...
            END


            # 更新前
            CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
            BEGIN
            ...
            END


            # 更新后
            CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
            BEGIN
            ...
            END
            复制

            复制

            2、创建触发器

            创建触发器基本语法是以下code:

            但有一点要注意,触发器内关键字NEW表示即将插入的数据行,OLD表示即将删除的数据行。

            复制
              # 插入前触发器


              delimiter
              CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
              BEGIN


              IF NEW. NAME == 'nick' THEN
              INSERT INTO tb2 (NAME)
              VALUES
              ('aa')
              END
              END//
              delimiter ;
              复制

              复制
              复制
                # 插入后触发器


                delimiter
                CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
                BEGIN
                IF NEW. num = 666 THEN
                INSERT INTO tb2 (NAME)
                VALUES
                ('666'),
                ('666') ;
                ELSEIF NEW. num = 555 THEN
                INSERT INTO tb2 (NAME)
                VALUES
                ('555'),
                ('555') ;
                END IF;
                END//
                delimiter ;
                复制

                复制

                3、删除触发器

                  DROP TRIGGER tri_after_insert_tb1;
                  复制

                  4、使用触发器

                  触发器是由于对表的增、删、改操作时被动执行的

                    insert into tb1(numvalues(666)
                    复制

                    三、存储过程

                    存储过程是一个SQL语句集合,类似函数,需要主动调用。

                    1、创建存储过程

                    复制
                      # 无参数存储过程


                      # 创建存储过程
                      delimiter
                      create procedure p1()
                      BEGIN
                      select * from t1;
                      END//
                      delimiter ;


                      # 执行存储过程
                      call p1()
                      复制

                      都说了类似函数,那必须得可以接收参数,且参数有三类:

                      • in          仅用于传入参数用

                      • out        仅用于返回值用

                      • inout     既可以传入又可以当作返回值

                      复制
                        # 有参数存储过程


                        # 创建存储过程
                        delimiter \\ # 结尾分号改为\\
                        create procedure p1(
                        in i1 int,
                        in i2 int,
                        inout i3 int,
                        out r1 int
                        )
                        BEGIN
                        DECLARE temp1 int; # 创建申明局部变量
                        DECLARE temp2 int default 0;
                        set temp1 = 1;
                        set r1 = i1 + i2 + temp1 + temp2;
                        set i3 = i3 + 100;
                        end\\
                        delimiter ;


                        # 执行存储过程
                        DECLARE @t1 INT default 3;
                        DECLARE @t2 INT;
                        CALL p1 (1, 2 ,@t1, @t2);
                        SELECT @t1,@t2;
                        复制

                        复制

                        2、删除存储过程

                          drop procedure proc_name;
                          复制
                          3、执行存储过程
                          复制

                          执行为函数名加括号;

                          DECLARE代表创建一个局部变量

                          复制
                            # 无参数
                            call proc_name()


                            # 有参数,全in
                            call proc_name(1,2)


                            # 有参数,有in,out,inout
                            DECLARE @t1 INT;
                            DECLARE @t2 INT default 3;
                            call proc_name(1,2,@t1,@t2)
                            复制

                            pymysql执行存储过程

                              #!/usr/bin/env python
                              # -*- coding:utf-8 -*-
                              import pymysql


                              conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
                              cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
                              # 执行存储过程
                              cursor.callproc('p1', args=(1, 22, 3, 4))
                              # 获取执行完存储的参数
                              cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
                              result = cursor.fetchall()


                              conn.commit()
                              cursor.close()
                              conn.close()




                              print(result)
                              复制


                              文章转载自Linux Windows server学习交流,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论