一、外键

外键是设置当前表中的某一列与别一数据表中的主键列关联。主要目的是控制与外键表中的数据,保持数据一致性,完整性,也就是说:当前表中这一列的数据必须是关联外键列中的某一数据,而且相关联的两个数据列的类型必须相同;当关联外键列某一数据修改或删除时,将触当前表的某一项相应操作。

特点:1、与另一张表的主键相对应

   2、外键的存在是为了保证数据的一致性

   3、外键的类型与另一张表的主键的类型相同

   4、外键中的值在另一张表的主键中必须存在

   5、人为创建的关联,起约束作用

   6、一张表中的外键可以有多个

 

主键

外键

索引

定义:

唯一标识一条记录,不能有重复的,不允许为空

表的外键是另一表的主键, 外键可以有重复的, 可以是空值

该字段没有重复值,但可以有一个空值

作用:

用来保证数据完整性

用来和其他表建立联系用的

是提高查询排序的速度

个数:

主键只能有一个

一个表可以有多个外键

一个表可以有多个惟一索引

  1. 创建外键constraint fk_cc foreign key (color_id) references color(nid)
  2.  
  3. 命令创建
  4. 添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
  5.  
  6. 删除外键:alter table 表名 drop foreign key 外键名称

连表操作之一对多:是指创建的俩张表中,一张表中的数据对应另一张表中的多个数据

连表操作之多对多:是指为了建立俩张表之间的关系,我们可以新建另一张表来对应这俩张表之间多对多之间的关系

  1. 连表
  2. 无对应关系则不显示
  3. select A.num, A.name, B.name
  4. from A,B
  5. Where A.nid = B.nid
  6.  
  7. 无对应关系则不显示
  8. select A.num, A.name, B.name
  9. from A inner join B
  10. on A.nid = B.nid
  11.  
  12. A表所有显示,如果B中无对应关系,则值为null
  13. select A.num, A.name, B.name
  14. from A left join B
  15. on A.nid = B.nid
  16.  
  17. B表所有显示,如果B中无对应关系,则值为null
  18. select A.num, A.name, B.name
  19. from A right join B
  20. on A.nid = B.nid
  21.  
  22. 其中A left join B on xxxx 表示以左边表为主,A表中数据全部显示,B表中的数据如果A表中没有则不显示------------以A为主
  23. 其中A right join B on xxxx 表示以右边表为主,B表中数据全部显示,A表中的数据如果A表中没有则不显示------------以B为主
  24. 其中A inner join B on xxxx 表示获取AB表中公有的部分,其余不显示---------------------------------------以公共为主

多张表可以连接

  1. select A.num, A.name, B.name from A
  2. lefe join B on A.nid = B.nid
  3. lefe join C on A.nid = C.nid

二、sql注入

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构

(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

1、sql注入的一种方式就是利用字符串的拼接

  1. #这是一种常见的sql注入的方式,利用字符串的拼接
  2. temp = "select name from userinfo where username='%s'and password =='%s'" %(userinfo,password)
  3. effect_row = cursor.execute(temp)

解决办法:因为pymysql已经为我们做了防止注入,所以我们用他的方法就可以了,其内部就是把特殊字符进行了转译

  1. effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))

三、视图

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

适用于:很多的sql语句共同对一个结果集进行操作

1、创建视图

  1. CREATE VIEW v1 AS
  2. SELECT * FROM man_to_women
  3. LEFT JOIN man on man_to_women.man_id = man.nid
  4. LEFT JOIN women on man_to_women.man_id = women.nid

2、删除视图

  1. --格式:DROP VIEW 视图名称
  2. DROP VIEW v1

3、修改视图

  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

4、使用视图

使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建、更新和删除操作,仅能做查询用,当我们对真实表进行修改时,视图中的数据会相应的发生变化。

  1. select * from v1

四、触发器

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

我们先写一个触发器(这个触发器关联一张或多张表),当我们在对关联的表进行操作的时候,会主动触发这个触发器做出对其他表的操作行为

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. 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 ;

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

old.字段名 表示(BEFORE DELETE,BEFORE UPDATA)删除前后,更新前后的该字段的数据

new.字段名 表示(BEFORE INSERT,BEFROE UPDATA)插入前后,更新前后的该字段的数据

2、删除触发器

  1. DROP TRIGGER 触发器名

3、使用触发器

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

五、存储过程

存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了

1、创建存储过程

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

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

  • in          仅用于传入参数用
  • out        仅用于返回值用
  • inout     既可以传入又可以当作返回值

局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的);

申明局部变量语法:declare @变量名 数据类型;例如:declare @num int;

  1. -- 创建有参数存储过程
  2. delimiter $$
  3. create procedure p1(
  4. in i1 int,
  5. in i2 int,
  6. inout i3 int,
  7. out r1 int
  8. )
  9. BEGIN
  10. DECLARE temp1 int; -- 表示声明一个变量,声明变量必须提前
  11. DECLARE temp2 int default 0;
  12.  
  13. set temp1 = 1;
  14. set r1 = i1 + i2 + temp1 + temp2;
  15. set i3 = i3 + 100;
  16.  
  17. end $$
  18. delimiter ;
  19.  
  20. -- 执行存储过程
  21. DECLARE @t1 INT default 3;
  22. DECLARE @t2 INT;
  23. CALL p1 (1, 2 ,@t1, @t2); -- @xx用于获取返回值
  24. SELECT @t1,@t2;

============储存过程既能返回获取执行select 的结果集 又可以获取out,inout返回值=================

2、删除存储过程

  1. drop procedure proc_name;

3、执行储存过程

  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)

pymysql执行存储过程

  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. cursor.fetchall() #获取执行select的结果集
  10.  
  11. cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
  12. # 获取执行完存储的参数,其中@_p1_0表示根据索引获取存储过程第一个参数的值
  13. result = cursor.fetchall() # 获取存储过程的返回值
  14.  
  15. conn.commit()
  16. cursor.close()
  17. conn.close()

六、函数

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

基本函数

  1. delimiter $$
  2. create function f1(
  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;

七、事务

事务用于将某些操作的多个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; --------把返回值设置成2
  17. rollback;
  18. END;
  19.  
  20. START TRANSACTION; -------开始事物
  21. DELETE from tb1; ------用于事物的sql语句
  22. insert into tb2(name)values('seven'); ------用于事物的sql语句
  23. COMMIT; ------如果都正确的话则提交,否则执行上面的方法
  24.  
  25. -- SUCCESS
  26. set p_return_code = 0; -------如果执行成功设置返回值为0
  27.  
  28. END $$
  29. delimiter ;

支持事物的存储过程

  1. 执行事务:
  2. DECLARE @i TINYINT;
  3. call p1(@i);
  4. select @i;

八、其他

  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 ;

条件语句

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

while循环

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

动态执行SQL语句

------用于防止sql注入(在没有用pymysql方法的情况下,第二种防止sql注入)

  1. delimiter $$
  2. DROP PROCEDURE IF EXISTS proc_sql $$
  3. CREATE PROCEDURE proc_sql (
  4. in strSQL VARCHAR(128),
  5. in nid int
  6. )
  7. BEGIN
  8. set @p1 = nid;
  9. set @sqll = strSQL;
  10.  
  11. PREPARE prod FROM @sqll;
  12. EXECUTE prod USING @p1;
  13. DEALLOCATE prepare prod;
  14.  
  15. END $$
  16. delimiter ;

动态执行sql语句

  1. pymysql执行
  2. row = cursor.callporc('proc_sql',('select * from tb2 where nid > ?',6))

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. 【转】java 自动装箱与拆箱

    java 自动装箱与拆箱 这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆: java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的 ...

  2. Python 数据排序和列表迭代和列表推导应用

    1.In-place sorting 原地排序 data=[6,4,5,2,3,1] print ('before sort', data) data.sort() print ('after sor ...

  3. android学习笔记20——ProgressDialog进度条对话框

    ProgressDialog==>进度条对话框 ProgressDialog本身就代表一个进度条对话框,程序只需要创建ProgressDialog实例,并将其显示出来就是一个进度条对话框:开发者 ...

  4. 138. Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  5. CSS实现背景透明,文字不透明(各浏览器兼容)

    /*CSS*/.waps{ background:url(07158.bmp) no-repeat top center fixed; width:1004px; text-align:center; ...

  6. 黄聪:利用OpenXml生成Word2007文档(转)

    原文:http://blog.csdn.net/francislaw/article/details/7568317 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一Op ...

  7. 黄聪:WordPress 多站点建站教程(五):获取子站点用户信息(通过输入站点ID号来获取该站点的所有用户)

    得到站点ID为1的用户 <ul> <?php $blogusers = get_users('blog_id=1'); foreach ($blogusers as $user) { ...

  8. Android: 触屏fling/scroll/drag的区别及其详细过程

    Google了一下,终于搞清了touch screen下的几种操作模式(对应的是事件). 对于一个view, 常用的操作有点击(click)和长按(long press)二种.实际上,这些操作类型是A ...

  9. UVA116 单向 DSP(多段图最短路)

    单向 DSP [题目链接]单向 DSP [题目类型]dp &题解: 紫书P271 这块的字典序排序我觉得挺厉害的,每次都把那3步sort一下,之后if (v< d[i][j]) 这块的小 ...

  10. CF 501C Misha and Forest 好题

    C. Misha and Forest   Let's define a forest as a non-directed acyclic graph (also without loops and ...