zoukankan      html  css  js  c++  java
  • mysql基础补充(事务,游标等)

    查看emp表:

    1,  

     mysql> desc emp;
    但是不够详细

    2,show create table empG:

     “G”选项的含义是使得记录能够按照字段竖着排列,对于内 容比较长的记录更易于显示。

    3,更新表:

    UPDATE  score set num=1 WHERE sid=1;

    应用:

    1. 视图
    100个SQL:
    88: v1

    select .. from v1
    select asd from v1
    某个查询语句设置别名,日后方便使用

    - 创建
    create view 视图名称 as SQL

    PS: 虚拟
    - 修改
    alter view 视图名称 as SQL

    - 删除
    drop view 视图名称;

    2. 触发器

    当对某张表做:增删改操作时,可以使用触发器自定义关联行为

    insert into tb (....)

    -- delimiter //
    -- create trigger t1 BEFORE INSERT on student for EACH ROW
    -- BEGIN
    -- INSERT into teacher(tname) values(NEW.sname);
    -- INSERT into teacher(tname) values(NEW.sname);
    -- INSERT into teacher(tname) values(NEW.sname);
    -- INSERT into teacher(tname) values(NEW.sname);
    -- END //
    -- delimiter ;
    --

    -- insert into student(gender,class_id,sname) values('女',1,'陈涛'),('女',1,'张根');

    -- NEW,代指新数据
    -- OLD,代指老数据

    3. 函数
    def f1(a1,a2):
    return a1 + a2

    f1()
    bin()

    内置函数:
    执行函数 select CURDATE();

    blog
    id title ctime
    1 asdf 2019-11
    2 asdf 2019-11
    3 asdf 2019-10
    4 asdf 2019-10


    select ctime,count(1) from blog group ctime

    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 default 0;
    set num = i1 + i2;
    return(num);
    END \
    delimiter ;

    SELECT f1(1,100);

    4. 存储过程
    保存在MySQL上的一个别名 => 一坨SQL语句

    别名()

    用于替代程序员写SQL语句


    方式一:
    MySQL: 存储过程
    程序:调用存储过程
    方式二:
    MySQL:。。
    程序:SQL语句
    方式三:
    MySQL:。。
    程序:类和对象(SQL语句)


    1. 简单
    create procedure p1()
    BEGIN
    select * from student;
    INSERT into teacher(tname) values("ct");
    END

    call p1()
    cursor.callproc('p1')
    2. 传参数(in,out,inout)
    delimiter //
    create procedure p2(
    in n1 int,
    in n2 int
    )
    BEGIN

    select * from student where sid > n1;
    END //
    delimiter ;

    call p2(12,2)
    cursor.callproc('p2',(12,2))

    3. 参数 out
    delimiter //
    create procedure p3(
    in n1 int,
    inout n2 int
    )
    BEGIN
    set n2 = 123123;
    select * from student where sid > n1;
    END //
    delimiter ;

    set @v1 = 10;
    call p2(12,@v1)
    select @v1;

    set @_p3_0 = 12
    ser @_p3_1 = 2
    call p3(@_p3_0,@_p3_1)
    select @_p3_0,@_p3_1




    cursor.callproc('p3',(12,2))
    r1 = cursor.fetchall()
    print(r1)


    cursor.execute('select @_p3_0,@_p3_1')
    r2 = cursor.fetchall()
    print(r2)

    =======> 特殊
    a. 可传参: in out inout
    b. pymysql

    cursor.callproc('p3',(12,2))
    r1 = cursor.fetchall()
    print(r1)

    cursor.execute('select @_p3_0,@_p3_1')
    r2 = cursor.fetchall()
    print(r2)

    为什么有结果集又有out伪造的返回值?


    delimiter //
    create procedure p3(
    in n1 int,
    out n2 int 用于标识存储过程的执行结果 1,2
    )
    BEGIN
    insert into vv(..)
    insert into vv(..)
    insert into vv(..)
    insert into vv(..)
    insert into vv(..)
    insert into vv(..)
    END //
    delimiter ;

    4. 事务


    delimiter //
    create procedure p4(
    out status int
    )
    BEGIN
    1. 声明如果出现异常则执行{
    set status = 1;
    rollback;
    }

    开始事务
    -- 由秦兵账户减去100
    -- 方少伟账户加90
    -- 张根账户加10
    commit;
    结束

    set status = 2;


    END //
    delimiter ;

    ===============================
    delimiter \
    create PROCEDURE p5(
    OUT p_return_code tinyint
    )
    BEGIN
    DECLARE exit handler for sqlexception
    BEGIN
    -- ERROR
    set p_return_code = 1;
    rollback;
    END;

    START TRANSACTION;
    DELETE from tb1;
    insert into tb2(name)values('seven');
    COMMIT;

    -- SUCCESS
    set p_return_code = 2;

    END\
    delimiter ;


    5. 游标

    delimiter //
    create procedure p6()
    begin
    declare row_id int; -- 自定义变量1
    declare row_num int; -- 自定义变量2
    declare done INT DEFAULT FALSE;
    declare temp int;

    declare my_cursor CURSOR FOR select id,num from A;
    declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;



    open my_cursor;
    xxoo: LOOP
    fetch my_cursor into row_id,row_num;
    if done then
    leave xxoo;
    END IF;
    set temp = row_id + row_num;
    insert into B(number) values(temp);
    end loop xxoo;
    close my_cursor;


    end //
    delimter ;

    6. 动态执行SQL(防SQL注入)

    delimiter //
    create procedure p7(
    in tpl varchar(255),
    in arg int
    )
    begin
    1. 预检测某个东西 SQL语句合法性
    2. SQL =格式化 tpl + arg
    3. 执行SQL语句

    set @xo = arg;
    PREPARE xxx FROM 'select * from student where sid > ?';
    EXECUTE xxx USING @xo;
    DEALLOCATE prepare prod;
    end //
    delimter ;



    call p7("select * from tb where id > ?",9)

    ===>

    delimiter \
    CREATE PROCEDURE p8 (
    in nid int
    )
    BEGIN
    set @nid = nid;
    PREPARE prod FROM 'select * from student where sid > ?';
    EXECUTE prod USING @nid;
    DEALLOCATE prepare prod;
    END\
    delimiter ;


    数据库相关操作:
    1. SQL语句 *****
    - select xx() from xx ;
    2. 利用MySQL内部提供的功能

    作业:
    一、SQL题 *****

    二、数据库
    表: id name email gender
    alex1
    三百万行

    预习:
    5. 索引

    6. ORM操作 SQLAlchmy
    - 类对象对数据进行操作

  • 相关阅读:
    qt中线程的使用方法
    QT中定时器的使用方法
    Common Lisp学习笔记(八)
    Common Lisp学习笔记(七)
    Common Lisp学习笔记(六)
    vim使用笔记
    Django学习笔记:urlresolvers
    python closures and decorators
    规范命名:变量名的力量
    eclipse openGL glut运行环境配置
  • 原文地址:https://www.cnblogs.com/hlan/p/6958553.html
Copyright © 2011-2022 走看看