zoukankan      html  css  js  c++  java
  • MySQL数据库(二)

    事务

    • 数据库开启事务命令
    #start transaction 开启事务
    #Rollback 回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚到上一次commit的位置
    #Commit 提交事务,提交未存储的事务
    #savepoint 保留点 ,事务处理中设置的临时占位符 你可以对它发布回退(与整个事务回退不同)
    
    • 事务操作演示
    create table account(
        id int,
        name varchar(32),
        balance double);
    
    insert into account values(1,"alex",8000);
    insert into account values(2,"egon",2000);
    
    
    
    #方式一: 更改数据后回滚,数据回到原来
    
    select * from account;
        +------+------+---------+
        | id   | name | balance |
        +------+------+---------+
        |    1 | alex |    8000 |
        |    2 | egon |    2000 |
        +------+------+---------+
    
    start transaction;      #开启事务后,更改数据发现数据变化
    
    update account set balance=balance-1000 where id=1;   #alex减去1000
    select * from account;
        +------+------+---------+
        | id   | name | balance |
        +------+------+---------+
        |    1 | alex |    7000 |
        |    2 | egon |    2000 |
        +------+------+---------+
    
    
    rollback;               #回滚后,发现数据回到原来
    
    select * from account;
        +------+------+---------+
        | id   | name | balance |
        +------+------+---------+
        |    1 | alex |    8000 |
        |    1 | egon |    2000 |
        +------+------+---------+
    
    
    #方式二: 更改数据后提交
    
    select * from account;
        +------+------+---------+
        | id   | name | balance |
        +------+------+---------+
        |    1 | alex |    8000 |
        |    2 | egon |    2000 |
        +------+------+---------+
    
    update account set balance=balance-1000 where id=1;
    pdate account set balance=balance+1000 where id=2;
    Commit;
    
     select * from account;
        +------+------+---------+
        | id   | name | balance |
        +------+------+---------+
        |    1 | alex |    7000 |
        |    2 | egon |    3000 |
        +------+------+---------+
    
    • python中调用数据库启动事务
    import pymysql
    
    #添加数据
    
    conn = pymysql.connect(host='10.37.129.3', port=3306, user='egon', passwd='123456', db='wuSir',charset="utf8")
    
    cursor = conn.cursor()
    
    
    try:
        insertSQL0="INSERT INTO account (name,balance) VALUES ('oldboy',4000)"
        insertSQL1="UPDATE account set balance=balance-1000 WHERE id=1"
        insertSQL2="UPDATE account set balance=balance+1000 WHERE id=2"
    
        cursor = conn.cursor()
    
        cursor.execute(insertSQL0)
        conn.commit()                   
    
    
        #主动触发Exception,事务回滚,回滚到上面conn.commit() 
        cursor.execute(insertSQL1)
        raise Exception
        cursor.execute(insertSQL2)
        cursor.close()
        conn.commit()
    
    except Exception as e:
    
        conn.rollback()
        conn.commit()
    
    
    cursor.close()
    conn.close()
    

    视图

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

    • 创建视图
    #格式:CREATE VIEW 视图名称 AS  SQL语句
      
    #演示
    create view v1 as select * from student where sid > 10;
     
    #下次调用
    select * from v1;
    
    • 删除视图
    #格式:DROP VIEW 视图名称
     
    #演示
    drop view v1;
    
    • 修改视图
    #格式:ALTER VIEW 视图名称 AS SQL语句
     
    #演示
    alter view v1 as select * from student where sid > 13;
    

    触发器

    对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。
    特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

    • 创建基本语法
    # 插入前
    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
    
    • 触发器演示
    #----------------------示例一:
    
    #创建触发器
    
    delimiter //
    create trigger t2 before insert on student for each row
    BEGIN
    insert into teacher(tname) values("张三");
    END //
    delimiter ;
    
    #student插入数据,查看teacher表中是否有数据
    
    insert into student(gender,class_id,sname) values("女",3,"王五");
    
    #删除触发器
    
    drop trigger t2;
    
    #----------------------示例二
    
    #重新创建  new   
    
    delimiter //
    create trigger t2 before insert on student for each row
    BEGIN
    insert into teacher(tname) values(NEW.sname);
    END //
    delimiter ;
    
    #创建的触发的name 相同
    insert into student(gender,class_id,sname) values("女",3,"李五");
    

    函数

    • 部分内置函数
    CHAR_LENGTH(str)
            返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
            对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。
    
        CONCAT(str1,str2,...)
            字符串拼接
            如有任何一个参数为NULL ,则返回值为 NULL。
        CONCAT_WS(separator,str1,str2,...)
            字符串拼接(自定义连接符)
            CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
    
        CONV(N,from_base,to_base)
            进制转换
            例如:
                SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
    
        FORMAT(X,D)
            将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若  D 为 0, 则返回结果不带有小数点,或不含小数部分。
            例如:
                SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
        INSERT(str,pos,len,newstr)
            在str的指定位置插入字符串
                pos:要替换位置其实位置
                len:替换的长度
                newstr:新字符串
            特别的:
                如果pos超过原字符串长度,则返回原字符串
                如果len超过原字符串长度,则由新字符串完全替换
        INSTR(str,substr)
            返回字符串 str 中子字符串的第一个出现位置。
    
        LEFT(str,len)
            返回字符串str 从开始的len位置的子序列字符。
    
        LOWER(str)
            变小写
    
        UPPER(str)
            变大写
    
        LTRIM(str)
            返回字符串 str ,其引导空格字符被删除。
        RTRIM(str)
            返回字符串 str ,结尾空格字符被删去。
        SUBSTRING(str,pos,len)
            获取字符串子序列
    
        LOCATE(substr,str,pos)
            获取子序列索引位置
    
        REPEAT(str,count)
            返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
            若 count <= 0,则返回一个空字符串。
            若str 或 count 为 NULL,则返回 NULL 。
        REPLACE(str,from_str,to_str)
            返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
        REVERSE(str)
            返回字符串 str ,顺序和字符顺序相反。
        RIGHT(str,len)
            从字符串str 开始,返回从后边开始len个字符组成的子序列
    
        SPACE(N)
            返回一个由N空格组成的字符串。
    
        SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
            不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
    
            mysql> SELECT SUBSTRING('Quadratically',5);
                -> 'ratically'
    
            mysql> SELECT SUBSTRING('foobarbar' FROM 4);
                -> 'barbar'
    
            mysql> SELECT SUBSTRING('Quadratically',5,6);
                -> 'ratica'
    
            mysql> SELECT SUBSTRING('Sakila', -3);
                -> 'ila'
    
            mysql> SELECT SUBSTRING('Sakila', -5, 3);
                -> 'aki'
    
            mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
                -> 'ki'
    
        TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
            返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。
    
            mysql> SELECT TRIM('  bar   ');
                    -> 'bar'
    
            mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
                    -> 'barxxx'
    
            mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
                    -> 'bar'
    
            mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
                    -> 'barx'
    

    https://dev.mysql.com/doc/refman/5.7/en/functions.html

    • 显示时间月份
    select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")
     
    2019-11   2
    2019-10   2
    
    • 自定义函数
    #自定义函数
    
    delimiter //
    create function f1(
        i1 int,
        i2 int)
    returns int
    BEGIN
        declare num int;
        set num = i1 + i2;
        return(num);
    END //
    delimiter ;
    
    
    #执行函数
    
    select f1(1,99);
    +----------+
    | f1(1,99) |
    +----------+
    |      100 |
    +----------+
    
    • 删除函数
    #drop function func_name;
    
    • 执行函数
    # 获取返回值
    declare @i VARCHAR(32);
    select UPPER('alex') into @i;
    SELECT @i;
    
    
    # 在查询中使用
    select f1(11,nid) ,name from tb2;
    

    存储过程

    存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

    • 创建存储过程
    1. 无参数存储过程 演示
    #定义存储过程
    
    delimiter //
    create procedure p1()
    BEGIN
      select * from student;
      insert into teacher(tname) values("alex");
    END //
    delimiter ;
    
    #调用
    call p1();
    
    1. pymysql 调用存储过程
    import pymysql
    
    conn = pymysql.connect(host='10.37.129.3', port=3306, user='egon', passwd='123456', db='wuSir',charset="utf8")
    
    cursor = conn.cursor()
    
    cursor.callproc("p1")
    
    conn.commit()
    
    result = cursor.fetchall()
    print(result)
    
    cursor.close()
    conn.close()
    
  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/luchuangao/p/8445318.html
Copyright © 2011-2022 走看看