事务

  • 数据库开启事务命令
  1. #start transaction 开启事务
  2. #Rollback 回滚事务,即撤销指定的sql语句(只能回退insert delete update语句),回滚到上一次commit的位置
  3. #Commit 提交事务,提交未存储的事务
  4. #savepoint 保留点 ,事务处理中设置的临时占位符 你可以对它发布回退(与整个事务回退不同)
  • 事务操作演示
  1. create table account(
  2. id int,
  3. name varchar(32),
  4. balance double);
  5. insert into account values(1,"alex",8000);
  6. insert into account values(2,"egon",2000);
  7. #方式一: 更改数据后回滚,数据回到原来
  8. select * from account;
  9. +------+------+---------+
  10. | id | name | balance |
  11. +------+------+---------+
  12. | 1 | alex | 8000 |
  13. | 2 | egon | 2000 |
  14. +------+------+---------+
  15. start transaction; #开启事务后,更改数据发现数据变化
  16. update account set balance=balance-1000 where id=1; #alex减去1000
  17. select * from account;
  18. +------+------+---------+
  19. | id | name | balance |
  20. +------+------+---------+
  21. | 1 | alex | 7000 |
  22. | 2 | egon | 2000 |
  23. +------+------+---------+
  24. rollback; #回滚后,发现数据回到原来
  25. select * from account;
  26. +------+------+---------+
  27. | id | name | balance |
  28. +------+------+---------+
  29. | 1 | alex | 8000 |
  30. | 1 | egon | 2000 |
  31. +------+------+---------+
  32. #方式二: 更改数据后提交
  33. select * from account;
  34. +------+------+---------+
  35. | id | name | balance |
  36. +------+------+---------+
  37. | 1 | alex | 8000 |
  38. | 2 | egon | 2000 |
  39. +------+------+---------+
  40. update account set balance=balance-1000 where id=1;
  41. pdate account set balance=balance+1000 where id=2;
  42. Commit;
  43. select * from account;
  44. +------+------+---------+
  45. | id | name | balance |
  46. +------+------+---------+
  47. | 1 | alex | 7000 |
  48. | 2 | egon | 3000 |
  49. +------+------+---------+
  • python中调用数据库启动事务
  1. import pymysql
  2. #添加数据
  3. conn = pymysql.connect(host='10.37.129.3', port=3306, user='egon', passwd='123456', db='wuSir',charset="utf8")
  4. cursor = conn.cursor()
  5. try:
  6. insertSQL0="INSERT INTO account (name,balance) VALUES ('oldboy',4000)"
  7. insertSQL1="UPDATE account set balance=balance-1000 WHERE id=1"
  8. insertSQL2="UPDATE account set balance=balance+1000 WHERE id=2"
  9. cursor = conn.cursor()
  10. cursor.execute(insertSQL0)
  11. conn.commit()
  12. #主动触发Exception,事务回滚,回滚到上面conn.commit()
  13. cursor.execute(insertSQL1)
  14. raise Exception
  15. cursor.execute(insertSQL2)
  16. cursor.close()
  17. conn.commit()
  18. except Exception as e:
  19. conn.rollback()
  20. conn.commit()
  21. cursor.close()
  22. conn.close()

视图

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

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

触发器

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

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

  • 创建基本语法
  1. # 插入前
  2. CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
  3. BEGIN
  4. ...
  5. END
  6. # 插入后
  7. CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
  8. BEGIN
  9. ...
  10. END
  11. # 删除前
  12. CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
  13. BEGIN
  14. ...
  15. END
  16. # 删除后
  17. CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
  18. BEGIN
  19. ...
  20. END
  21. # 更新前
  22. CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
  23. BEGIN
  24. ...
  25. END
  26. # 更新后
  27. CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
  28. BEGIN
  29. ...
  30. END
  • 触发器演示
  1. #----------------------示例一:
  2. #创建触发器
  3. delimiter //
  4. create trigger t2 before insert on student for each row
  5. BEGIN
  6. insert into teacher(tname) values("张三");
  7. END //
  8. delimiter ;
  9. #student插入数据,查看teacher表中是否有数据
  10. insert into student(gender,class_id,sname) values("女",3,"王五");
  11. #删除触发器
  12. drop trigger t2;
  13. #----------------------示例二
  14. #重新创建 new
  15. delimiter //
  16. create trigger t2 before insert on student for each row
  17. BEGIN
  18. insert into teacher(tname) values(NEW.sname);
  19. END //
  20. delimiter ;
  21. #创建的触发的name 相同
  22. insert into student(gender,class_id,sname) values("女",3,"李五");

函数

  • 部分内置函数
  1. CHAR_LENGTH(str)
  2. 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
  3. 对于一个包含五个二字节字符集, LENGTH()返回值为 10, CHAR_LENGTH()的返回值为5
  4. CONCAT(str1,str2,...)
  5. 字符串拼接
  6. 如有任何一个参数为NULL ,则返回值为 NULL
  7. CONCAT_WS(separator,str1,str2,...)
  8. 字符串拼接(自定义连接符)
  9. CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
  10. CONV(N,from_base,to_base)
  11. 进制转换
  12. 例如:
  13. SELECT CONV('a',16,2); 表示将 a 16进制转换为2进制字符串表示
  14. FORMAT(X,D)
  15. 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 0, 则返回结果不带有小数点,或不含小数部分。
  16. 例如:
  17. SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
  18. INSERT(str,pos,len,newstr)
  19. str的指定位置插入字符串
  20. pos:要替换位置其实位置
  21. len:替换的长度
  22. newstr:新字符串
  23. 特别的:
  24. 如果pos超过原字符串长度,则返回原字符串
  25. 如果len超过原字符串长度,则由新字符串完全替换
  26. INSTR(str,substr)
  27. 返回字符串 str 中子字符串的第一个出现位置。
  28. LEFT(str,len)
  29. 返回字符串str 从开始的len位置的子序列字符。
  30. LOWER(str)
  31. 变小写
  32. UPPER(str)
  33. 变大写
  34. LTRIM(str)
  35. 返回字符串 str ,其引导空格字符被删除。
  36. RTRIM(str)
  37. 返回字符串 str ,结尾空格字符被删去。
  38. SUBSTRING(str,pos,len)
  39. 获取字符串子序列
  40. LOCATE(substr,str,pos)
  41. 获取子序列索引位置
  42. REPEAT(str,count)
  43. 返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count
  44. count <= 0,则返回一个空字符串。
  45. str count NULL,则返回 NULL
  46. REPLACE(str,from_str,to_str)
  47. 返回字符串str 以及所有被字符串to_str替代的字符串from_str
  48. REVERSE(str)
  49. 返回字符串 str ,顺序和字符顺序相反。
  50. RIGHT(str,len)
  51. 从字符串str 开始,返回从后边开始len个字符组成的子序列
  52. SPACE(N)
  53. 返回一个由N空格组成的字符串。
  54. SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
  55. 不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
  56. mysql> SELECT SUBSTRING('Quadratically',5);
  57. -> 'ratically'
  58. mysql> SELECT SUBSTRING('foobarbar' FROM 4);
  59. -> 'barbar'
  60. mysql> SELECT SUBSTRING('Quadratically',5,6);
  61. -> 'ratica'
  62. mysql> SELECT SUBSTRING('Sakila', -3);
  63. -> 'ila'
  64. mysql> SELECT SUBSTRING('Sakila', -5, 3);
  65. -> 'aki'
  66. mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
  67. -> 'ki'
  68. TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
  69. 返回字符串 str 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTHLEADINTRAILING中没有一个是给定的,则假设为BOTH remstr 为可选项,在未指定情况下,可删除空格。
  70. mysql> SELECT TRIM(' bar ');
  71. -> 'bar'
  72. mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
  73. -> 'barxxx'
  74. mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
  75. -> 'bar'
  76. mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
  77. -> 'barx'

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

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

存储过程

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

  • 创建存储过程
  1. 无参数存储过程 演示
  1. #定义存储过程
  2. delimiter //
  3. create procedure p1()
  4. BEGIN
  5. select * from student;
  6. insert into teacher(tname) values("alex");
  7. END //
  8. delimiter ;
  9. #调用
  10. call p1();
  1. pymysql 调用存储过程
  1. import pymysql
  2. conn = pymysql.connect(host='10.37.129.3', port=3306, user='egon', passwd='123456', db='wuSir',charset="utf8")
  3. cursor = conn.cursor()
  4. cursor.callproc("p1")
  5. conn.commit()
  6. result = cursor.fetchall()
  7. print(result)
  8. cursor.close()
  9. conn.close()

MySQL数据库(二)的更多相关文章

  1. docker 安装mysql数据库 <二>

    一.下载mysql数据库 #网易镜像中心https://c.163.com/hub#/m/home/ #采用网易加速地址,不加速时下载非常的慢 docker pull hub.c..com/libra ...

  2. 一、初识MySQL数据库 二、搭建MySQL数据库(重点) 三、使用MySQL数据库 四、认识MySQL数据库的数据类型 五、操作MySQL数据库的数据(重点)

    一.初识MySQL数据库 ###<1>数据库概述     1. 数据库         长期存储在计算机内的,由组织的可共享的数据集合         存储数据的仓库         文件 ...

  3. PDO操作mysql数据库(二)

    从 MySQL 数据库读取数据 <?php $server = "localhost"; $user = "root"; $pwd = "123 ...

  4. JavaWeb用Jdbc操作MySql数据库(二)

    一.仍然使用前面的环境和示例数据库. 二.建立发出注册请求的页面index3.jsp. <%@ page language="java" import="java. ...

  5. mySQL数据库二:命令行的使用

    在做整理的时候,上一篇刚开始只是简单的做了个数据类型的开头,在这里简单说一下mySQL的使用以及它的命令行 1.准备工作 有一个好的开发工具可以几何倍数的增加我们的工作效率,所以,工具是必不可少的,首 ...

  6. mysql数据库(二):查询(SELECT)

    一. 数据库查询—查询(SELECT) 单表查询 多表联合查询 二. 查询—单表查询 查询特定字段: select <字段1,字段2,...> from <表名>; 示例:查询 ...

  7. JAVA使用JDBC连接MySQL数据库 二

    JAVA连接MySQL稍微繁琐,所以先写一个类用来打开或关闭数据库: public class DBHelper { String driver = "com.mysql.jdbc.Driv ...

  8. python操作mysql数据库系列-操作MySql数据库(二)

    接口测试框架层级目录结构示意图: page目录下面的mysqlTest.py:存放的是mysql的操作代码 utils目录下面的helper.py:存放的是公共的配置方法 log目录log.md:存放 ...

  9. Mysql数据库二:表的增删改查

    ----建表CREATE TABLE emp( id int PRIMARY key auto_increment, name char(10) , birthday DATE , salary FL ...

随机推荐

  1. dp之01背包hdu2639(第k优解)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 题意:给出一行价值,一行体积,让你在v体积的范围内找出第k大的值.......(注意,不要 和它的第一题混 ...

  2. jfinal中Interceptor的使用

    一.拦截器是用于对action请求的拦截处理,发生在进入action方法体之前的拦截操作,这样方便了对请求实例做一些文章.   二.自定义.系统已有拦截器都需要实现Interceptor接口,这样才能 ...

  3. 基于HTML5 Canvas 实现的 Loading 效果

    Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像.更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Load ...

  4. 方程式漏洞之复现window2008/win7 远程命令执行漏洞

    前几天就想写的,因为一些缘故就没写.此次是在外网环境下进行的.大家在内网中也一个样. 方法: 使用Eternalblue模块,剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS:win版 ...

  5. php7 扩展模块添加

    php 扩展模块添加   1. 新增安装扩展模块的位置 [root@node_22 ~]# ls /usr/local/php7/lib/php/extensions/no-debug-non-zts ...

  6. JS 数组以及对象的深拷贝总结

    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 前言 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示:  如上,arr的修改,会影响arr2的值,这 ...

  7. 解决阿里云部署 office web apps ApplicationFailedException 报错问题

    查找这个问题,确实花费了很长时间,所以具体解析一下问题原因吧. 报错如下: 问题详情链接 New-OfficeWebAppsFarm:Office Online服务无法启动.有关详细信息,请参阅Win ...

  8. 负margin应用案例几则(转载+总结)

    (一)自适应布局——左栏改右栏 这里先写个一列固定列宽,另一列自适应的两列布局,效果图: 侧栏移至右边,效果图: 其HTML <div class="wrap"> &l ...

  9. openstacksdk resource2 打印__dict__

    在一个继承resource2的实体里,打印self.__dict__结果是: {'_body': <openstack.resource2._ComponentManager object at ...

  10. es6 javascript的class的静态方法、属性和实例属性

    http://blog.csdn.net/qq_30100043/article/details/53542966