• (二)MySQL中级篇


    1.视图view

    视图是一个虚拟表,其内容由查询定义。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。

    视图的优点:

    ①简化了操作,把经常使用的数据定义为视图。

    安全性,用户只能查询和修改能看到的数据。

    ③逻辑上的独立性,屏蔽了真实表的结构带来的影响。

    视图的缺点:

    性能差。

    ②修改限制

    A.创建视图

    CREATE VIEW 视图名称 AS  SQL语句

    1 CREATE VIEW stu AS SELECT * FROM student WHERE id<3;

    B.删除视图

    DROP VIEW view1

    1 DROP VIEW stu;

    C.修改视图

    ALTER VIEW 视图名称 AS SQL语句

    1 ALTER VIEW stu AS SELECT * FROM CLIENT;

    D.使用视图

    select * from v1

    1 SELECT * FROM stu;

    2.存储过程procedure

      应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中的一个查询sql语句,

    那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现这,不容易维护。另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。

    而存储例程正好可以帮我们解决这些问题。

    A.创建存储过程

    无参的:

     1 DELIMITER $$        --自定义语句结尾符号,因为这里要执行好多句sql语句,所以就得自定义,以防止出错
     2 
     3 CREATE PROCEDURE pro1()
     4 BEGIN
     5     SELECT * FROM users;
     6 END $$
     7 
      /* 改回默认值 ; */
      delimiter ;
    8 -- 执行存储过程 9 10 CALL pro1()

    带参的:

    • in          仅用于传入参数用
    • out        仅用于返回值用
    • inout     既可以传入又可以当作返回值
     1 -- 创建存储过程
     2 DELIMITER $$
     3 CREATE PROCEDURE p1(
     4     IN i1 INT,                        -- 传入参数i1
     5     IN i2 INT,                        -- 传入参数i2
     6     INOUT i3 INT,                     -- 即传入又能得到返回值
     7     OUT r1 INT                        -- 得到返回值
     8 )
     9 BEGIN
    10     DECLARE temp1 INT;
    11     DECLARE temp2 INT DEFAULT 0;  
    12     SET temp1 = 1;
    13     SET r1 = i1 + i2 + temp1 + temp2; 
    14     SET i3 = i3 + 100;
    15 END $$
    1 -- 执行存储过程
    2 -- DECLARE @t1 INT default 3;           --  设置变量默认值为3
    3 SET @t1=8;
    4 DECLARE @t2 INT;                     --  设置变量
    5 CALL p1 (1, 2 ,@t1, @t2);            --  执行存储过程,并传入参数,t2自动取消
    6 SELECT @t1,@t2;                      --  查看存储过程输出结果

    mysql存储过程将查出来的结果集赋给一个变量

    DELIMITER $$
    CREATE PROCEDURE p2(OUT param INT)
        BEGIN
    DECLARE X INT;
    SELECT COUNT(NAME) INTO X FROM table WHERE NAME='rjl';
    SET param = X;
        END$$
    DELIMITER ;

    B.删除存储过程

    1 DROP PROCEDURE p1;

    C.java 语言调用存储过程

      详细介绍:http://www.cnblogs.com/57rongjielong/p/7765915.html

    3.函数function

    函数也可以传参数,也可以接收返回值,但是函数没办法得到执行语句得到的结果,存储过程可以

    A.内置函数

    B.自定义函数

     1 DELIMITER $$
     2 CREATE FUNCTION f1(
     3     x1 INT,
     4     y1 INT)
     5 RETURNS INT
     6 BEGIN
     7     DECLARE num INT;
     8     SET num = x1 + y1;
     9     RETURN num;
    10 END $$
    11 DELIMITER ;
    12 
    13 SELECT f1(50,50);

    C.删除函数:

    DROP FUNCTION f1;

    4.事务
    事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

    1 START TRANSACTION;
    2 SELECT * FROM users;
    3 SAVEPOINT sel;
    4 ***********
    5 ROLLBACK sel;
    6 COMMIT;

    5.触发器TRIGGER

    ——对表的行进行【增/删/改】前后的行为。触发器无法由用户直接调用,这是对表的【增/删/改】操作被动引发的。

     1 # 插入前
     2 CREATE TRIGGER tri1 BEFORE INSERT ON tb1 FOR EACH ROW
     3 BEGIN
     4     ...
     5 END
     6 
     7 # 插入后
     8 CREATE TRIGGER tri2 AFTER INSERT ON tb1 FOR EACH ROW
     9 BEGIN
    10     ...
    11 END
    12 
    13 # 删除前
    14 CREATE TRIGGER tri3 BEFORE DELETE ON tb1 FOR EACH ROW
    15 BEGIN
    16     ...
    17 END
    18 
    19 # 删除后
    20 CREATE TRIGGER tri4 AFTER DELETE ON tb1 FOR EACH ROW
    21 BEGIN
    22     ...
    23 END
    24 
    25 # 更新前
    26 CREATE TRIGGER tri5 BEFORE UPDATE ON tb1 FOR EACH ROW
    27 BEGIN
    28     ...
    29 END
    30 
    31 # 更新后
    32 CREATE TRIGGER tri6 AFTER UPDATE ON tb1 FOR EACH ROW
    33 BEGIN
    34     ...
    35 END

     例一:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

    DELIMITER $$
    CREATE TRIGGER tri_before_insert BEFORE INSERT ON student FOR EACH ROW
    BEGIN
    IF new.sex = '' THEN
        UPDATE users SET qq='123456';
    END IF;
    END $$
    DELIMITER ;
    
    INSERT INTO student(sex,address) VALUES('','广东广州');

    例二:

    DELIMITER $$
    CREATE TRIGGER tri_after_delete AFTER DELETE ON student FOR EACH ROW
    BEGIN
    IF old.sex='' THEN
        INSERT INTO CLIENT(sex,address) VALUES('','中国');
    END IF;
    END$$
    DELIMITER ;
    
    DELETE FROM student WHERE sex='';

    删除触发器

    DROP TRIGGER tri_before_insert;
  • 相关阅读:
    python进阶-lambda和列表生成器
    【pandas】条件查询 分组标记
    【Python】生成html文档-使用dominate
    Python对列表内部的字典进行排序 --lambda,sort
    【python3】通过hashlib 和base64 对字符串进行加密
    【Pandas】统计某个值的出现次数
    git 创建分支,切换分支,merge操作
    如何将excel单元格中一部分数据提取到另一单元格?
    整型数的溢出解决办法
    CentOS6.9安装SonarQube7.6
  • 原文地址:https://www.cnblogs.com/57rongjielong/p/8075561.html
Copyright © 2020-2023  润新知