视图:

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

1、  尽量使用视图完成读操作

2、  如果使用视图,则需要注意,对视图的修改,也是对基表的修改,会即时生效;

3、  删除视图时,不会销毁实体表内的数据
  1. SELECT
  2. *
  3. FROM
  4. (
  5. SELECT
  6. nid,
  7. NAME
  8. FROM
  9. tb1
  10. WHERE
  11. nid > 2
  12. ) AS A
  13. WHERE
  14. A. NAME > 'alex';

临时表搜索

  1. CREATE VIEW v1 AS SELECT
  2. man_to_woman.nid,
  3. man. NAME AS mname,
  4. woman. NAME AS wname
  5. FROM
  6. man_to_woman
  7. LEFT JOIN man ON man_to_woman.man_id = man.nid
  8. LEFT JOIN woman ON man_to_woman.woman_id = woman.nid
  9. WHERE
  10. man. NAME = 'mingming'

1 创建视图

  1. drop view v1

2 删除视图

  1. -- 格式:ALTER VIEW 视图名称 AS SQL语句
  2.  
  3. ALTER VIEW v1 AS
  4. SELET A.nid,
  5. B. NAME
  6. FROM
  7. A
  8. LEFT JOIN B ON A.id = B.nid
  9. LEFT JOIN C ON A.id = C.nid
  10. WHERE
  11. A.id > 2
  12. AND C.nid < 5

3 修改视图

  1. select *from v1 查找视图
  2.  
  3. where nid >1;
  4. v1 nid 大于1的数据

4 使用视图

使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用。

存储过程:

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

存储过程:既能显示搜索结果,又能拿到返回结果; 返回结果通过参数形式返回

  1. -- 创建存储过程
  2.  
  3. delimiter //
  4. create procedure p1()
  5. BEGIN
  6. select * from t1;
  7. END//
  8. delimiter ;
  9.  
  10. -- 执行存储过程
  11.  
  12. call p1()

无参数存储过程

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

  • in          仅用于传入参数用
  • out        仅用于返回值用
  • inout     既可以传入又可以当作返回值
  1. delimiter $$ -- 指定结束符号
  2. drop procedure if exists proc1 $$
  3. create procedure proc1(
  4. in i1 int, -- 进入 i1 int
  5. out i2 int
  6. )
  7. begin
  8. declare d2 int default 3; -- 声明变量
  9. if i1 = 1 then
  10. set i2 = 100 + d2;
  11. ELSEIF i1 = 2 then
  12. set i2 = 200 + d2;
  13. else
  14. set i2 = 1000 + d2;
  15. end if;
  16. end $$
  17. delimiter ;
  18. call proc1(1, @u);
  19. Select @u; -- @u等于i2

有参数存储过程

  1. drop procedure if exists proc1 $$ 判断
  2.  
  3. drop procedure proc1(1) -- 删除存储过程 删除时先做判断

删除存储过程

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

执行存储过程

触发器:

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

1, 创建基本语法

  1. # 插入前
  2. CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
  3. BEGIN
  4. ...
  5. END
  6.  
  7. # 插入后
  8. CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
  9. BEGIN
  10. ...
  11. END
  12.  
  13. # 删除前
  14. CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
  15. BEGIN
  16. ...
  17. END
  18.  
  19. # 删除后
  20. CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
  21. BEGIN
  22. ...
  23. END
  24.  
  25. # 更新前
  26. CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
  27. BEGIN
  28. ...
  29. END
  30.  
  31. # 更新后
  32. CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
  33. BEGIN
  34. ...
  35. END
  1. delimiter $$
  2. CREATE trigger chufaqi_userinfo before insert on userinfo for each ROW
  3. BEGIN
  4. INSERT into man(name) VALUES('haha');
  5. end $$
  6. delimiter;
  7. insert into userinfo(username) VALUES('gonggong'),('taijian');
  8. delimiter $$
  9. DROP trigger if exists chufaqi_userinfo $$
  10. CREATE trigger chufaqi_userinfo before insert on userinfo for each ROW
  11. BEGIN
  12. if new.username = 'gonggong' then
  13. insert into man(name) values(new.username);
  14. end if;
  15. end $$
  16. delimiter ;
  17.  
  18. insert into userinfo(username) VALUES('gonggong'),('taijian');

插入前触发器

  1. delimiter $$
  2.  
  3. CREATE trigger chufaqi_userinfo AFTER insert on userinfo for each ROW
  4. BEGIN
  5. if new.username = 'gonggong' then
  6. insert into man(name) values(new.username);
  7. end if;
  8. end $$
  9. delimiter ;
  10.  
  11. insert into userinfo(username) VALUES('gonggong11'),('taijian22');

插入后触发器

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

2,删除触发器

  1. delimiter $$
  2. DROP trigger if exists chufaqi_userinfo $$
  3. CREATE trigger chufaqi_userinfo before DELETE on userinfo for each ROW
  4. BEGIN
  5. insert into man(name) values(old.username);
  6. end $$
  7. delimiter ;
  8.  
  9. DELETE from userinfo WHERE nid = 7;

删除触发器

3、使用触发器

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

  1. insert into userinfo(username) VALUES('gonggong11'),('taijian22');

使用触发器

函数

mysql 中提供了许多内置函数 如

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

更多函数:猛击这里 OR 猛击这里

  1. delimiter $$
  2. create function v1(
  3. i1 int,
  4. i2 int)
  5. returns int
  6. BEGIN
  7. declare num int;
  8. set num = i1 + i2;
  9. return(num);
  10. END $$
  11. delimiter ;

自定义函数

  1. drop function func_name;

删除函数

  1. drop function func_name;

删除函数

  1. # 获取返回值
  2. declare @i VARCHAR(32);
  3. select UPPER('alex') into @i;
  4. SELECT @i;
  5.  
  6. # 在查询中使用
  7. select f1(123,nid) ,name from man;

执行函数

事务

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

  1. delimiter $$
  2. create PROCEDURE p1(
  3. OUT p_return_code tinyint
  4. )
  5. BEGIN
  6. DECLARE exit handler for sqlexception
  7. BEGIN
  8. -- ERROR
  9. set p_return_code = 1; 返回值=1
  10. rollback; 回滚
  11. END;
  12.  
  13. DECLARE exit handler for sqlwarning
  14. BEGIN
  15. -- WARNING
  16. set p_return_code = 2;
  17. rollback;
  18. END;
  19.  
  20. START TRANSACTION; -- 开始事务
  21. update userinfo set asset = asset - 5 where name = 'xixi'
  22. update userinfo set asset = asset + 5 where name = 'haha'
  23.  
  24. COMMIT; 提交
  25.  
  26. -- SUCCESS
  27. set p_return_code = 0;
  28.  
  29. END$$
  30. delimiter ;

支持事务的存储过程

  1. DECLARE @i TINYINT;
  2. call p1(@i);
  3. select @i;

执行存储过程

索引

索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。

 索引种类;

     普通索引     仅快速查找
     唯一索引     仅快速查找+ 列值唯一约束    可有 null
     主键索引      仅快速查找 + 列值唯一约束   +只能有一次不能重复 不可有null
     组合索引      多列值组合索引,用于组合搜索  比合并索引的效率快很多,
     全文索引      对文本的内容进行一个分词,全文进行搜索
     索引合并     使用多个单列索引进行组合搜索
     覆盖索引     select 的数据列只能用从索引中获取,不必读取数据行:
  1. create table in1(
  2. nid int not null auto_increment primary key,
  3. name varchar(32) not null,
  4. email varchar(64) not null,
  5. extra text,
  6. index ix_name (name)
  7. )

创建表+索引

  1. create index index_name on table_name(column_name)

创建索引

  1. drop index_name on table_name;

删除索引

  1. explain select * from tb1 where name = 'alex'; 查看索引
  2.  
  3. show index from name 查看生成的索引

查看索引

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

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

2、唯一索引

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

  1. create table in1(
  2. nid int not null auto_increment primary key,
  3. name varchar(32) not null,
  4. email varchar(64) not null,
  5. extra text,
  6. unique ix_name (name)
  7. )

创建表 + 唯一索引

  1. create unique index 索引名 on 表名(列名)

创建唯一索引

  1. drop unique index 索引名 on 表名

删除唯一索引

3、主键索引

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

  1. create table in1(
  2. nid int not null auto_increment primary key,
  3. name varchar(32) not null,
  4. email varchar(64) not null,
  5. extra text,
  6. index ix_name (name)
  7. )
  8.  
  9. OR
  10.  
  11. create table in1(
  12. nid int not null auto_increment,
  13. name varchar(32) not null,
  14. email varchar(64) not null,
  15. extra text,
  16. primary key(ni1),
  17. index ix_name (name)
  18. )

创建表+创建主键

  1. alter table 表名 add primary key(列名);

创建主键

  1. alter table 表名 drop primary key;
  2. alter table 表名 modify 列名 int, drop primary key;

删除主键

4、组合索引

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

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

  1. create table in3(
  2. nid int not null auto_increment primary key,
  3. name varchar(32) not null,
  4. email varchar(64) not null,
  5. extra text
  6. )

创建表

  1. create index ix_name_email on in3(name,email);

创建组合索引

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

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

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

更多详细 请参考 :猛击这里

其他

1,条件语句:

  1. delimiter \\
  2. CREATE PROCEDURE proc_if ()
  3. BEGIN
  4.  
  5. declare i int default 0;
  6. if i = 1 THEN
  7. SELECT 1;
  8. ELSEIF i = 2 THEN
  9. SELECT 2;
  10. ELSE
  11. SELECT 7;
  12. END IF;
  13.  
  14. END\\
  15. delimiter ;

2、循环语句

  1. delimiter \\
  2. CREATE PROCEDURE proc_while ()
  3. BEGIN
  4.  
  5. DECLARE num INT ;
  6. SET num = 0 ;
  7. WHILE num < 10 DO
  8. SELECT
  9. num ;
  10. SET num = num + 1 ;
  11. END WHILE ;
  12.  
  13. END\\
  14. delimiter ;

while循环

  1. delimiter \\
  2. CREATE PROCEDURE proc_repeat ()
  3. BEGIN
  4.  
  5. DECLARE i INT ;
  6. SET i = 0 ;
  7. repeat
  8. select i;
  9. set i = i + 1;
  10. until i >= 5
  11. end repeat;
  12.  
  13. END\\
  14. delimiter ;

repeat循环

  1. delimiter \\
  2. CREATE PROCEDURE proc_loop ()
  3. BEGIN
  4.  
  5. declare i int default 0;
  6. loop_label: loop
  7. select i;
  8. set i=i+1;
  9. if i>=5 then
  10. leave loop_label;
  11. end if;
  12. end loop;
  13.  
  14. END\\
  15. delimiter ;

loop

3 动态执行sql 语句

  1. delimiter $$
  2. DROP PROCEDURE IF EXISTS proc_sql $$
  3. CREATE PROCEDURE proc_sql () #创建存储过程
  4. BEGIN
  5. declare p1 int;
  6. set p1 = 11;
  7. set @p1 = p1;
  8.  
  9. PREPARE prod FROM 'select * from man where nid > ?';
  10. EXECUTE prod USING @p1; -- 执行sql @p1 等于11
  11. DEALLOCATE prepare prod;
  12.  
  13. END$$
  14. delimiter ;
  1. call pror_sql('select * from man where nid >?',11);

执行 sql

MYSQL (二)的更多相关文章

  1. 转载:Centos7 从零编译Nginx+PHP+MySql 二

    序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...

  2. python Mysql (二)

    Mysql (二) 一. 事务 a.数据库开启事务命令 1 2 3 4 #start transaction 开启事务 #Rollback 回滚事务,即撤销指定的sql语句(只能回退insert de ...

  3. MySQL二进预编译制安装

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL二进预编译制安装时间:2019年2月25日内容:MySQL二进制预编译安装重点:MySQL二进制预 ...

  4. MYSQL(二)

    上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...

  5. MySQL(二) 数据库数据类型详解

    序言 今天去健身了,感觉把身体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这里讲清楚了,以后在看到什么数据类型,咱度应该认识,对我来说,最不熟悉的应该就是时间类型这块了.但是通过 ...

  6. Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)

    上一篇介绍如何在linux系统下搭建ssh环境 这篇开始将如何搭建web服务器 1,下载文件 在官网下载好 tomcat.jdk.mysql的linux压缩包 后缀名为.tar.gz 并通过xftp上 ...

  7. Mysql(二):库操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  8. Mysql(二)函数与连接

    一.函数 1.if函数 if(exp1, exp2, exp3)     判断exp1是否为true(不为0,并且不为nlll),如果为true,返回 exp2的值,否则返回exp3的值. selec ...

  9. mysql二:库操作

    一.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 performance_schema: My ...

  10. 【千纸诗书】—— PHP/MySQL二手书网站后台开发之知识点记录

    前言:使用PHP和MySQL开发后台管理系统的过程中,发现有一些通用的[套路小Tip],这里集中记录一下.结合工作中ing的后台业务,我逐渐体会到:除了技术知识外.能使用户体验好的“使用流程设计”积累 ...

随机推荐

  1. iOS10 适配问题-Xcode8

    前段时间升级了Xcode8,整体来说对OC的影响不大,但是还是跳一个坑,消耗了不少时间.这里总结下遇到的适配问题. 1.权限问题 Xcode8 访问相机.相册等需要权限的地方崩溃 解决办法: 在使用私 ...

  2. http转https 和 微信小程序设置了合法请求域名,小程序一直提示不在合法域名列别中

    hotapp 有免费的https proxy ,可以免费代理请求任何http或者https服务,只要设置好合法域名为https://wxapi.hotapp.cn , 就可以请求网址如请求小程序联盟的 ...

  3. IOS 网络浅析-(十二 UIWebView简介)

    在这篇随笔里,我们只要知道UIWebView是什么就可以了. UIWebView 是苹果提供的用来展示网页的UI控件,它也是最占内存的控件. iOS8.0之后出现了webkit框架,WKWebView ...

  4. servlet应用及知识点总结

    1. servlet的web.xml中的配置 ------------------------------------------------------------------1. response ...

  5. 【译】Spring 4 @Profile注解示例

    前言 译文链接:http://websystique.com/spring/spring-profile-example/ 本文将探索Spring中的@Profile注解,可以实现不同环境(开发.测试 ...

  6. 原创 C++之常量(一)

    1概述 一个C++程序就是一系列数据与操作的集合.当一个C++程序开始运行的时候,与该程序相关的数据就会被加载到内存中.当数据与内存发生关联的时候,这些数据就会具有如下的特性: 数据在内存中的地址.这 ...

  7. linux基本知识

    1.默认不写端口号就是80端口   127.0.0.1.localhost都代表本机 2.linux下的用户管理: id:可以查看当前用户whoami:查看当前的用户who:看当前已经登录的用户w:也 ...

  8. HTTP Session、Cookie机制详解

    一.什么是http session,有什么用 HTTP协议本身是无状态的,本身并不能支持服务端保存客户端的状态信息,于是,Web Server中引入了session的概念,用来保存客户端的状态信息. ...

  9. 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)

    关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...

  10. css实现页面元素居中

    水平居中 对于已知宽度的块级元素实现水平居中只需要设置 margin-left:auto; margin-right:auto; 对于多个块级元素实现水平居中只需要设置 //1 父类{ text-al ...