专业的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 \\\\\\\\
分隔符;
?
?