专业的SQL Server、MySQL数据库同步软件

MySQL自增列的步长

唯一索引和联合唯一性

外键的变体

SQL数据行的添加,删除和修改

查看

触发

函数

存储过程

交易

光标

动态SQL执行(抗SQL注入)

1.MySQL自增量列步长问题:

1.基于会话级别(单次登录):

显示会话变量,例如” auto_inc%”; ?? #查看自我成长默认步骤数通常为1

设置会话auto_increment_increment = 2; ?? #设置2的自增长会话步骤

设置会话auto_increment_offset = 10; #设置默认的初始值

2.基于全局级别(对所有用户有效):

显示全局变量,例如” auto_inc%”; #查看全局变量中自增长的默认步长

设置全局auto_increment_increment = 2; #设置全局会话步长

设置全局auto_increment_offset = 10; #设置全局自动增量初始值

2.唯一索引和联合唯一:

创建表t1(

id int,

num int,

名称char

唯一的uql(数字)? #Unique index

唯一的uql(数字,名称)? #联合唯一

);

唯一索引和主键具有共同点:

? 1.全部具有加速搜索功能;

? 2.所有内容都是唯一的,不能重复

唯一索引和主键之间的区别:

?主键不能重复也不能为空;

?并且唯一索引不能重复,但是可以具有的值,例如,您可以在联合索引

中设置null的值

3.外键的变体:

1.一对一:博客用户表

2.一对多:莉莉网恋记录表

3.多对多:用户主机关系表

4.添加,删除和修改SQL数据行:

添加:

插入测试(名称,年龄)值(“名称”,18);

插入测试中(名称,年龄)值(” name1″,18),(” name2″,18); #一次性插入多个值

插入测试中(名称,年龄)从test1中选择名称,年龄; #将数据插入表

删除:

从测试中删除;

从测试中删除ID为\的gt; 2 和 name =” name1″;

更改:

updata测试集名称=” name2″,年龄= 19,其中id \\ u> 12和名称=” name1″;

检查:

从测试中选择*;

选择id,从测试中获得名称,其中id> 2;

从测试中选择姓名,年龄,123;

从测试中选择名称为rname;

从测试中选择* 其中(1,3,5,7)中的ID;

从测试中选择* 其中id在(从test1中选择id);

从测试中选择* 其中id在5到9之间; #关闭间隔,左右均可拍摄

通配符

从测试中选择* 其中的名称,例如” name%”; %匹配无数个字符; _匹配字符

分页

从测试中选择* 限制10; 拿前十个

从测试中选择* 极限0,10; 表示从0开始,取0之后的10项

从测试中选择* 限制10偏移20; 表示从20开始,然后是20之后的前10个

排序

从测试中选择* 通过id desc排序; id从大到小排列

从测试中选择* 按ID asc排序; id从小到大

从按年龄desc,id asc的测试顺序中选择*; 多个不同的订单

从测试顺序中选择*,按desc限制10; 拿最后十个

分组(聚合函数:计数,最大值,最小值,总和,平均平均值)

按性别从测试组中选择最大(id),id; 如果遇到相同的性别,将只使用最大的ID

按性别从测试组中选择计数(id),id; 数

选择count(id)作为count,id按性别构成测试组;

从具有性别(id)的性别中选择测试组的id(id), 2; 在对聚合函数的结果执行二次过滤时,必须使用具有

连续表操作:

#左右表联接

从test1,test2中选择*,其中test1.id = test2.part_id;

从test1中选择*? 左连接 test2 on test1.id = test2.part_id; test1的左侧将显示

从测试中选择* =”字体家族:摩纳哥;字体大小:9pt;”>右 ? 加入 test1.id = test2.part_id上的test2; test1的右侧将全部显示

从测试中选择* ? innder ? join test1.id = test2.part_id上的test2; 显示为空的行Hide

#上下表联合

选择id,名称来自test1

工会? #自动重复数据删除

选择id,名称来自test2;

选择id,名称来自test1

全部合并? #不去重

选择id,来自test2的名称;

转储mysql文件:

mysqldump-uroot test1> test1.sql-p#数据表结构+数据

mysqldump-uroot-d test1> test1.sql-p#仅数据表结构

导入mysql文件:

创建数据库test1;

mysqldump-uroot-d test1 \ lt; test1.sql-p;

临时表

从中选择ID(从编号为60的测试中选择ID)作为B;

添加条件

选择min(num),min(num)+1,num的情况。 10,然后从得分

结束,否则最小值(数字)结尾

5.视图:

#创建

将视图创建为view1从测试中选择*,其中id \ gt; 10;

#View是一个临时表

#视图是虚拟的,不是物理表,因此您不能插入数据

#Edit

将视图视图名称更改为SQL

#删除

拖放视图视图名称;

6.触发器:

#插入之前

创建触发器t1 在学生插入之前,为每个行

开始

插入教师(tname)值(NEW.sname);

END

#插入后

#before删除

#删除后删除后

#更新前

#更新后更新

#因为是默认值;结束,它将不会执行结束,因此您必须首先修改终止符

分隔符//

创建触发器t1 插入前 学生在EACH ROW上

BEGIN

插入教师(tname)值(sname) ;

END //

定界符;

#创建时自动插入:

下降触发器t1; #结束上一个触发器

分隔符//

在每个学生的学生插入之前创建触发器t1

开始

插入教师(tname)值(NEW.sname);

END//

分隔符;

插入学生(性别,class_if,sname)值(“Female”,1,” abc”)

7.功能:

#自定义函数(带有返回值)

#创建函数

分隔符\\\\\\\\

创建函数f1(

i1 int,

i2 int)

返回int

开始

声明num int; 声明变量类型为整数

设置num = i1 + i2;

return(num);

END \\\\\\\\

分隔符;

#Run函数

选择f1(1,100);

内置功能:

时间焦点

8.SQL存储过程:

1.简单的存储过程

分隔符//

创建过程p1()

开始

从学生中选择*;

插入教师(tname)值(“ct”);

END

分隔符;

#调用存储过程

调用p1;

cursor.callproc(” p1″)

2.传递参数(in,out,inout)

分隔符//

创建过程p2(

in n1 int,

in n2 int

)

开始

从学生那里选择*,其中sid \\ u> n1;

END

#Call

调用p2(12,2);

cursor.callproc(” p2″,(12,2))

分隔符//

创建过程p2(

in n1 int,

out n2 int? #out伪装了返回值

)

开始

设置n2 = 123123;

从学生那里选择*,其中sid \\ u> n1;

END

#Call

设置@ vi = 0? #创建了一个称为v1的会话级变量,该变量可以从外部接收

调用p2(12,@ v1)

选择@ v1; 接收变量

cursor.execute(”选择@ _p2_0,@ _ p2_1″)? #pymysql接收存储过程变量

存储过程的特征:

可以传递参数(从in到inout)

b.pymysql

为什么会有结果值和伪造的返回值:

角色退出:习惯于标识存储过程的执行结果,例如1表示失败,2表示成功,3表示部分成功

9.事务:

分隔符//

创建过程p4(

退出状态为int

)

开始

1.声明发生异常时执行{

设置状态= 1;

回滚; #rollback

}

开展业务

-减少100的帐户

-b帐户增加了100

提交;

结束

设置状态= 2;

#如果此处的事务顺利执行,您将获得一个等于2的变量,并且将不执行回滚

END//

分隔符;

分隔符\\\\\\\\

创建PROCESDURE p1(

出p_return_code tinyint

)

开始

声明sqlexception的退出处理程序? #此代码表示,如果无法顺利执行,请执行以下代码

开始

?-错误

?设置p_return_code = 1;

?回滚

结束;

开始交易;

?从tb1删除;

?在tb2(名称)中插入值(“七个”);

承诺;

-成功

设置p_return_code = 0;

END \\\\\\\\

分隔符;

#正确返回0,错误返回1

10.光标:

分隔符//

创建过程p6()

开始

声明row_id int; -自定义变量1

声明row_num varchar(50); -自定义变量2

声明完成INT默认默认值;

从A声明my_cursor CURSOR FOR选择ID,num;

声明CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

打开my_cursor; #open光标

xxoo:循环吗? #开始循环

?将my_cursor提取到row_id,row_num; #获取一行数据并将其分配给row_id和row_num

?如果完成了

离开xxoo;

?万一;

?在老师(tname)中插入值(ssname);

结束循环xxoo; #End循环

关闭我的光标; #关闭光标

结束//

除臭剂;

11.动态执行SQL(反SQL注入):

分隔符//

创建proc p7(

在tpl varchar(255)中的

在arg int

)

开始

1.预先检测到某些内容,使SQL语句合法化

2.SQL =格式tp + arg

3.执行SQL语句

设置@ x0 = arg; #declare变量

准备(准备)XXX(变量)FROM”从学生那里选择*,其中sid \\?

执行(执行)xxx使用@arg(替换上面的内容?);

取消分配准备产品;(执行格式化的SQL语句)

结束//

除臭剂;

呼叫p7(”从tb选择ID,其中id \ gt ;”,9)

分隔符\\\\\\\\

创建步骤p8(

in nid int

)

开始

set @ nid = nid;

从”从学生那里选择sid \\?

使用@nid执行产品;

DEALLOCATE准备产品;

END \\\\\\\\

分隔符;