zoukankan      html  css  js  c++  java
  • mysql高级

     

     
    MySQL自增列的步长问题
    1. 唯一索引和联合唯一
    2. 外键的变种
    3. SQL数据行的增删改查
    4. 视图
    5. 触发器
    6. 函数
    7. 存储过程
    8. 事务
    9. 游标
    10. 动态执行SQL(防SQL注入)
     
     
     

    1.MySQL自增列的步长问题:
    1.基于会话级别(单次登陆状态下):
    show session variables like 'auto_inc%';    #查看自增长的默认步数,一般为1
    set session auto_increment_increment=2;    #设置自增长会话步长为2
    set session auto_increment_offset=10;    #设置默认自增长初始值
    2.基于全局级别(所有用户生效):
    show global variables like 'auto_inc%';    #查看全局变量中的自增长的默认步长
    set global auto_increment_increment=2;    #设置全局会话步长
    set global auto_increment_offset=10;    #设置全局自增长初始值
     

    2.唯一索引和联合唯一:
    create table t1(
        id int,
        num int,
        name char
        unique uql (num)    #唯一索引
        unique uql (num, name)    #联合唯一
        );
    唯一索引和主键 的共同点:
        1.都有加速查找的功能;
        2.都是唯一,不能重复
    唯一索引和主键的不同点:
        主键既不能重复也不能为空;
        而唯一索引不能重复,但是可以有值为空,比如联合索引中可以设置一个值为null
     

    3.外键的变种:
    1.一对一:博客用户表
    2.一对多:百合网相亲记录表
    3.多对多:用户主机关系表
     

    4.SQL数据行的增删改查:
    增:
    insert into test(name, age) values('name', 18);
    insert into test(name, age) values('name1', 18),('name2', 18);    #一次性插入多个值
    insert into test(name, age) select name,age from test1;    #把某张表中的数据插入
    删:
    delete from test;
    delete from test where id>2 and name='name1';
    改:
    updata test set name='name2',age=19 where id>12 and name='name1';
    查:
    select * from test;
    select id,name from test where id>2;
    select name,age,123 from test;
    select name as rname from test;
    select * from test where id in (1,3,5,7);
    select * from test where id in (select id from test1);
    select * from test where id between 5 and 9;    #闭区间,左右都可以取到
    通配符
    select * from test where name like 'name%';    %匹配无数字符;_匹配一个字符
    分页
    select * from test limit 10;    取前十条
    select * from test limit 0,10;    表示从0开始,取0后面的10条
    select * from test limit 10 offset 20;    表示从20开始,取20后的前10条
    排序
    select * from test order by id desc;    id从大到小排列
    select * from test order by id asc;    id从小到大排列
    select * from test order by age desc, id asc;    多个不同排序
    select * from test order by desc limit 10;    取后十条
    分组(聚合函数:count,max,min,sum,avg求平均值)
    select max(id),id from test group by sex;    如果遇到相同的sex,只会取最大id的
    select count(id),id from test group by sex;    计数
    select count(id) as count,id form test group by sex;
    select count(id),id from test group by sex having count(id)>2;    对于聚合函数结果进行二次筛选时,必须使用having
    连表操作:
    #左右连表 join
    select * from test1,test2 where test1.id = test2.part_id;
    select * from test1 left join test2 on test1.id = test2.part_id;     test1左边会全部显示
    select * from test right join test2 on test1.id = test2.part_id;    test1右边会全部显示
    select * from test innder join test2 on test1.id = test2.part_id;    会把出现null的那一行隐藏
    #上下连表 union
    select id,name from test1
    union    #自动去重
    select id,name from test2;
    select id,name from test1
    union all    #不去重
    select id,name from test2;
    转储mysql文件:
    mysqldump -uroot test1  > test1.sql -p    #数据表结构+数据
    mysqldump -uroot -d test1  > test1.sql -p    #只有数据表结构
    导入mysql文件:
    create databases test1;
    mysqldump -uroot -d test1 < test1.sql -p;
    临时表
    select id from (select id from test where num>60) as B;
    添加条件
    select min(num),min(num)+1,case when num<10 then 0 else min(num) end from score
     

    5.视图:
    #创建
    create view as view1 select * from test where id>10;
    #视图是一个临时表
    #视图是虚拟出来的,不是物理表,因此不能插入数据
    #修改
    alter view 视图名称 as SQL
    #删除
    drop view 视图名称;
     

    6.触发器:
    #插入前
    create trigger t1 BEFORE INSERT on student for EACH ROW
    BEGIN
    INSERT into teacher(tname) values(NEW.sname);
    END
    #插入后 after insert
    #删除前 before delete
    #删除后 after delete
    #更新前 before update
    #更新后 after update
    #由于默认;结束,因此不会执行end,所以要执行触发器之前要先修改终止符
     
    delimiter //
    create trigger t1 BEFORE INSERT on student for EACH ROW
    BEGIN
    INSERT into teacher(tname) values(sname);
    END //
    delimiter ;
    #创建时自动插入:
    drop trigger t1;    #结束上一个触发器
    delimiter //
    create trigger t1 BEFORE INSERT on student for EACH ROW
    BEGIN
    INSERT into teacher(tname) values(NEW.sname);
    END //
    delimiter ;
     
    insert into student(gender,class_if,sname) values('女',1,'abc')
     

    7.函数:
    #自定义函数(有返回值)
    #创建函数
    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,100);
    内置函数:
    时间重点
     

    8.SQL存储过程:
    1.简单存储过程
    delimiter //
    create PROCEDURE p1()
    BEGIN
        select * from student;
        insert into teacher(tname) values('ct');
    END
    delimiter ;
    #调用存储过程
    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
    #调用
    call p2(12,2);
    cursor.callproc('p2',(12,2))
    delimiter //
    create PROCEDURE p2(
        in n1 int,
        out n2 int    #out伪装返回值
    )
    BEGIN
        set n2 = 123123;
        select * from student where sid>n1;
    END
    #调用
    set @vi = 0     #创建了一个session级的变量叫做v1,可以在外部接收
    call p2(12,@v1)
    select @v1;    接收变量
    cursor.execute('select @_p2_0,@_p2_1')    #pymysql中接收存储过程变量
    存储过程的特性:
        a.可传参 (in out inout)
        b.pymysql
    为什么有结果值又有out伪造的返回值:
        out的作用:用于标识存储过程的执行结果,如1为失败,2为成功,3为局部成功
     

    9.事务:
    delimiter //
    create procedure p4(
        out status int
    )
    BEGIN
        1.声明如果出现异常则执行{
            set status = 1;
            rollback;    #回滚
        }
        开始事务
            --a账户减少100
            --b账户增加100
            commit;
        结束
        set status = 2;
        #如果这里的事务执行顺利,会得到变量等于2,不会执行回滚
    END //
    delimiter ;
    delimiter \
    create PROCESDURE p1(
        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 = 0;
        
        END\
    delimiter ;
    #正确的返回0,错误的返回1
     

    10.游标:
    delimiter //
    create procedure p6()
    begin
        declare row_id int;    --自定义变量1
        declare row_num varchar(50);    --自定义变量2
        declare done INT DEFAULT FALSE;  
     
        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;    #取一行数据赋值给row_id和row_num
            if done then
                leave xxoo;
            END IF;
            insert into teacher(tname) values(ssname);
        end loop xxoo;    #终止循环
    close my cursor;    #关闭游标
     
    end //
    delimter;
     

    11.动态执行SQL(防SQL注入):
    delimiter //
    create procefure p7(
        in tpl varchar(255),
        in arg int
    )
    begin
        1.预检测某个东西,SQL语句合法化
        2.SQL = 格式化 tp+arg
        3.执行SQL语句
        
       set @x0 = arg;   #声明变量
       PREPARE(准备) XXX(变量) FROM 'select * from student where sid > ?';
        EXECUTE(执行) xxx USING @arg(替换上面的?);
        DEALLOCATE prepare prod;(执行已经格式化完成的SQL语句)
     
    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 ;
  • 相关阅读:
    298. Binary Tree Longest Consecutive Sequence
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    163. Missing Ranges
    336. Palindrome Pairs
    727. Minimum Window Subsequence
    211. Add and Search Word
    年底购物狂欢,移动支付安全不容忽视
    成为程序员前需要做的10件事
    全球首推iOS应用防破解技术!
  • 原文地址:https://www.cnblogs.com/ninglinglong/p/13622006.html
Copyright © 2011-2022 走看看