zoukankan      html  css  js  c++  java
  • 二、Mysq(二)

    原文参考:http://www.cnblogs.com/wupeiqi/articles/5713323.html

    还有一个是课件,看着也像博客,但不知道是谁的

    内置函数

    触发器

    存储过程

    索引

    与python交互

    内置函数

    1、字符串函数

    • 查看字符的ascii码值ascii(str),str是空串时返回0
    select ascii('a');
    • 查看ascii码值对应的字符char(数字)
    select char(97);
    • 拼接字符串concat(str1,str2...)
    select concat(12,34,'ab');
    • 包含字符个数length(str)
    select length('abc');
    • 截取字符串
      • left(str,len)返回字符串str的左端len个字符
      • right(str,len)返回字符串str的右端len个字符
      • substring(str,pos,len)返回字符串str的位置pos起len个字符
    select substring('abc123',2,3);
    • 去除空格
      • ltrim(str)返回删除了左空格的字符串str
      • rtrim(str)返回删除了右空格的字符串str
      • trim([方向 remstr from str)返回从某侧删除remstr后的字符串str,方向词包括both、leading、trailing,表示两侧、左、右
    select trim('  bar   ');
    select trim(leading 'x' FROM 'xxxbarxxx');
    select trim(both 'x' FROM 'xxxbarxxx');
    select trim(trailing 'x' FROM 'xxxbarxxx');
    • 返回由n个空格字符组成的一个字符串space(n)
    select space(10);
    • 替换字符串replace(str,from_str,to_str)
    select replace('abc123','123','def');
    • 大小写转换,函数如下
      • lower(str)
      • upper(str)
    select lower('aBcD');

    2、数学函数

    • 求绝对值abs(n)
    select abs(-32);
    • 求m除以n的余数mod(m,n),同运算符%
    select mod(10,3);
    select 10%3;
    • 地板floor(n),表示不大于n的最大整数
    select floor(2.3);
    • 天花板ceiling(n),表示不小于n的最大整数
    select ceiling(2.3);
    • 求四舍五入值round(n,d),n表示原数,d表示小数位置,默认为0
    select round(1.6);
    • 求x的y次幂pow(x,y)
    select pow(2,3);
    • 获取圆周率PI()
    select PI();
    • 随机数rand(),值为0-1.0的浮点数
    select rand();
    • 还有其它很多三角函数,使用时可以查询文档

    3、日期时间函数

    • 获取子值,语法如下
      • year(date)返回date的年份(范围在1000到9999)
      • month(date)返回date中的月份数值
      • day(date)返回date中的日期数值
      • hour(time)返回time的小时数(范围是0到23)
      • minute(time)返回time的分钟数(范围是0到59)
      • second(time)返回time的秒数(范围是0到59)
    select year('2016-12-21');
    • 日期计算,使用+-运算符,数字后面的关键字为year、month、day、hour、minute、second
    select '2016-12-21'+interval 1 day;
    • 日期格式化date_format(date,format),format参数可用的值如下

      • 获取年%Y,返回4位的整数

        * 获取年%y,返回2位的整数

        * 获取月%m,值为1-12的整数

      • 获取日%d,返回整数

        * 获取时%H,值为0-23的整数

        * 获取时%h,值为1-12的整数

        * 获取分%i,值为0-59的整数

        * 获取秒%s,值为0-59的整数

    select date_format('2016-12-21','%Y %m %d');
    • 当前日期current_date()
    select current_date();
    • 当前时间current_time()
    select current_time();
    • 当前日期时间now()
    select now() 

    触发器

    对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。

    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
    View Code

    示例1:

     1 delimiter //
     2 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
     3 BEGIN
     4 
     5 IF NEW. NAME == 'alex' THEN
     6     INSERT INTO tb2 (NAME)
     7 VALUES
     8     ('aa')
     9 END IF;
    10 END//
    11 delimiter ;

    示例2:

    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 ;

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

    2、删除触发器

    DROP TRIGGER tri_after_insert_tb1;

    3、使用触发器

    触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

    insert into tb1(num) values(666)

    存储过程

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

    1、创建存储过程

    -- 创建存储过程
    
    delimiter //
    create procedure p1()
    BEGIN
        select * from t1;
    END//
    delimiter ;
    
    
    
    -- 执行存储过程
    
    call p1()
    View Code

    对于存储过程,可以接收参数,其参数有三类:

    • 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 ;
    
    -- 执行存储过程
    set @t1 =4;
    set @t2 = 0;
    CALL p1 (1, 2 ,@t1, @t2);
    SELECT @t1,@t2;
    
    有参数的存储过程
    View Code
     delimiter //
                        create procedure p1()
                        begin
                            select * from v1;
                        end //
                        delimiter ;
    1、结果集
       delimiter //
                        create procedure p2(
                            in n1 int,
                            inout n3 int,
                            out n2 int,
                        )
                        begin
                            select * from v1;
                            set n2 = n1 + 100;
                            set n3 = n3 + n1 + 100;
                        end //
                        delimiter ;
    2、结果集+有参
       delimiter \
                        CREATE PROCEDURE p4 (
                            in nid int
                        )
                        BEGIN
                            PREPARE prod FROM 'select * from student where sid > ?';
                            EXECUTE prod USING @nid;
                            DEALLOCATE prepare prod; 
                        END\
                        delimiter ;
    3、动态执行sql语句
    delimiter //
                        create procedure p3()
                        begin 
                            declare ssid int; -- 自定义变量1  
                            declare ssname varchar(50); -- 自定义变量2  
                            DECLARE done INT DEFAULT FALSE;
    
    
                            DECLARE my_cursor CURSOR FOR select sid,sname from student;
                            DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                            
                            open my_cursor;
                                xxoo: LOOP
                                    fetch my_cursor into ssid,ssname;
                                    if done then 
                                        leave xxoo;
                                    END IF;
                                    insert into teacher(tname) values(ssname);
                                end loop xxoo;
                            close my_cursor;
                        end  //
                        delimter ;
    4、游标

    2、删除存储过程

    drop procedure proc_name;

     3、执行存储过程

    -- 无参数
    call proc_name()
    
    -- 有参数,全in
    call proc_name(1,2)
    
    -- 有参数,有in,out,inout
    set @t1=0;
    set @t2=3;
    call proc_name(1,2,@t1,@t2)
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import pymysql
     4 
     5 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
     6 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
     7 # 执行存储过程
     8 cursor.callproc('p1', args=(1, 22, 3, 4))
     9 # 获取执行完存储的参数
    10 cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
    11 result = cursor.fetchall()
    12 
    13 conn.commit()
    14 cursor.close()
    15 conn.close()
    16 
    17 
    18 print(result)
    pymysql执行存储过程 

    事务

    • 当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回
    • 使用事务可以完成退回的功能,保证业务逻辑的正确性
    • 事务四大特性(简称ACID)
      • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
      • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
      • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
      • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
    • 要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
    • 查看表的创建语句
    show create table students;
    • 修改表的类型
    alter table '表名' engine=innodb;
    • 事务语句
    开启begin;
    提交commit;
    回滚rollback;
    delimiter \
    create PROCEDURE p1(
        OUT p_return_code tinyint
    )
    BEGIN 
      DECLARE exit handler for sqlexception 
      BEGIN 
        -- ERROR 
        set p_return_code = 1; 
        rollback; 
      END; 
     
      DECLARE exit handler for sqlwarning 
      BEGIN 
        -- WARNING 
        set p_return_code = 2; 
        rollback; 
      END; 
     
      START TRANSACTION; 
        DELETE from tb1;
        insert into tb2(name)values('seven');
      COMMIT; 
     
      -- SUCCESS 
      set p_return_code = 0; 
     
      END\
    delimiter ;
    View Code

    索引

    索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。

    MySQL中常见索引有:

    • 普通索引
    • 唯一索引
    • 主键索引
    • 组合索引

    1、普通索引

    普通索引仅有一个功能:加速查询

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        index ix_name (name)
    )
    创建表+索引
    创建索引
    create index index_name on table_name(column_name)
    drop index_name on table_name; #删除
    show index from table_name; # 查看索引

    注意:对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。

    create index ix_extra on in1(extra(32));

    2、唯一索引

    唯一索引有两个功能:加速查询 和 唯一约束(可含null)

    create table in1(
        nid int not null auto_increment primary key,
        name varchar(32) not null,
        email varchar(64) not null,
        extra text,
        unique ix_name (name)
    创建表+唯一索引
    create unique index 索引名 on 表名(列名) # 创建唯一索引
    drop unique index 索引名 on 表名  #删除

    3、主键索引

    主键有两个功能:加速查询 和 唯一约束(不可含null)

    alter table 表名 add primary key(列名); #创建主键
    alter table 表名 drop primary key;
    alter table 表名  modify  列名 int, drop primary key; #删除

    4、组合索引

    组合索引是将n个列组合成一个索引

    其应用场景为:频繁的同时使用n列来进行查询,如:where n1 = 'alex' and n2 = 666。

    create index 索引名 on 表名(name,email);
    create index ix_name_email on in3(name,email);

    如上创建组合索引之后,查询:

    • name and email  -- 使用索引
    • name                 -- 使用索引
    • email                 -- 不使用索引

    注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。

    其他 

    delimiter //
    CREATE PROCEDURE proc_if ()
    BEGIN
        
        declare i int default 0;
        if i = 1 THEN
            SELECT 1;
        ELSEIF i = 2 THEN
            SELECT 2;
        ELSE
            SELECT 7;
        END IF;
    
    END //
    delimiter ;
    if语句
    delimiter //
    CREATE PROCEDURE proc_while ()
    BEGIN
    
        DECLARE num INT ;
        SET num = 0 ;
        WHILE num < 10 DO
            SELECT
                num ;
            SET num = num + 1 ;
        END WHILE ;
    
    END //
    delimiter ;
    while
    delimiter //
    CREATE PROCEDURE proc_repeat ()
    BEGIN
    
        DECLARE i INT ;
        SET i = 0 ;
        repeat
            select i;
            set i = i + 1;
            until i >= 5
        end repeat;
    
    END //
    delimiter ;
    repeat

    数据库与python交互:

    • pip install pymysql

    Connection对象

    • 用于建立与数据库的连接
    • 创建对象:调用connect()方法
    conn=connect(参数列表)
    • 参数host:连接的mysql主机,如果本机是'localhost'
    • 参数port:连接的mysql主机的端口,默认是3306
    • 参数db:数据库的名称
    • 参数user:连接的用户名
    • 参数password:连接的密码
    • 参数charset:通信采用的编码方式,默认是'gb2312',要求与数据库创建时指定的编码一致,否则中文会乱码
    对象的方法
    • close()关闭连接
    • commit()事务,所以需要提交才会生效
    • rollback()事务,放弃之前的操作
    • cursor()返回Cursor对象,用于执行sql语句并获得结果

    Cursor对象

    • 执行sql语句
    • 创建对象:调用Connection对象的cursor()方法
    cursor1=conn.cursor() 
    对象的方法
    • close()关闭
    • execute(operation [, parameters ])执行语句,返回受影响的行数
    • fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
    • fetchmany(n)  获取前n行数据
    • fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回
    • scroll(value[,mode])将行指针移动到某个位置
      • mode表示移动的方式
      • mode的默认值为relative,表示基于当前行移动到value,value为正则向下移动,value为负则向上移动
      • mode的值为absolute,表示基于第一条数据的位置,第一条数据的位置为0
    对象的属性
    • rowcount只读属性,表示最近一次execute()执行后受影响的行数
    • connection获得当前连接对象
    #!/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()
      
    # 执行SQL,并返回收影响行数
    effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
      
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
      
    # 执行SQL,并返回受影响行数
    #effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
    
    cursor.execute("select * from hosts")
      
    # 获取第一行数据
    row_1 = cursor.fetchone()
      
    # 获取前n行数据
    # row_2 = cursor.fetchmany(3)
    # 获取所有数据
    # row_3 = cursor.fetchall()
      
      
    # 提交,不然无法保存新建或者修改的数据
    conn.commit()
      
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()
  • 相关阅读:
    33.数组声明方式(var构造函数) 、检测数组类型、数组的属性(封装好的就一个length)、数组的方法
    31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind
    31.
    30.函数作用域链 (GO AO 也叫词法作用域链)、 调用栈、调用栈涉及this绑定
    29.包装类(构造函数) 包装类作用及调用栈
    916. Word Subsets
    246. Strobogrammatic Number
    445. Add Two Numbers II
    2. Add Two Numbers
    341. Flatten Nested List Iterator
  • 原文地址:https://www.cnblogs.com/jiangzijiang/p/8520811.html
Copyright © 2011-2022 走看看