|
MySQL直接传个值就可以(MySQL是将预处理的SQL储存起来,用的时候传值直接就执行,就不需要每次请求连接MySQL在重新执行)
6:MySQL事务处理(增删改查后只要没有commit,全可以回滚)
*myisam引擎不支持事务,innodb(支持外键和事务)才支持事务
修改表引擎方法:alter table t1 engine=innodb
一:事务操作
查看是否自动提交:select @@autocommit;
关闭自动提交
set autocommit=0;
delete from t1 where id>5; 数据只是临时删除,如果commit就真正的执行删除语句
rollback; 只要没commit还原刚才删除的数据
commit;
二:还原点的使用:
insert into t1 values("user4");
savepoint p1;
insert into t1 values("user5");
savepoint p2;
insert into t1 values("user6");
savepoint p3;
--3个数据已经插进去啦,能后你觉得user6不要,你就找到还原点 savepoint p2就行
rollback to p2; --还原到P2 user6不要
commit;
7:MySQL存储(可以认为是自定义的函数)
创建一个存储:
\d //
create procedure p1()
begin
set @i=0;
while @i<10 do
insert into t2(name) values(concat("user",@i)); --这里可以做增删改查。。。都行
set @i=@i+1;
end while;
end;
//
执行一个存储:
\d ;
call p1();
查看存储:
show procedure status;
show create procedure p1\G --查看p1存储的基本信息
8:MySQL触发器(自动执行)
*查询没有必要做触发器!:select * from t1 union select * from t2;
一:增加触发器
\d //
创建一个名字为tg1的触发器,当向表中插入数据时,就向t2表中插入一条数据
create trigger tg1 before insert on t1 for each row
begin
insert into t2(id) values(new.id); --new.id 比如向t1表里面插入了id=4的 能后new.id=4 直接复制到这
end//
准备好t1 表 和 t1表
向t1表中插入多条数据
查看:show triggers;
删除触发器:drop trigger t2;
二:删除触发器(注意下:删除的时候2个表的值一定要对称,比如t1:1,2,3 t2:11,12,13这么删除是不行会报错,以一定要对称
比如t1和t2表都有user1,这样删除就是没问题 )
\d //
create trigger tg2 before delete on t1 for each row
begin delete from t2 where id=old.id; --插入的时候里面没有这个值叫new.id 提前有的值叫old.id
end//
三:更改触发器:
create trigger tg3 before update on t1 for each row
begin update t2 set id=new.id where old.id; --(update t1 set name="leyangjun"-new.id where name="zhangfei"-old.id)
end//
9:重排auto_increment值
MySQL数据库自动增长的ID如何恢复:
清空表的时候,不能用delete from tableName;
而是用truncate tableName;
这样auto_increment就恢复成1了
或者清空内容后直接用alter命令修改表:alter table tableName auto_increment=1;
场景:
1:t1表里面有id字段分别对应 1,2,3,4,5,6,7,8,9的记录,
2:能后我们delete删除,能后在插入数据,你会发现插入的时候是从10,11,12,13.....开始而不是1
3:清空的时候我们执行下这个归档为1即可:
alter table tableName auto_increment=1;
4:能后在插入的时候就是从1开始的啦
====================================================================================================================================
2.常用的SQL技巧
一:正则表达式的使用 --(注意匹配到了是1 没有则为0)
select "linux is very ok" regexp ".*" ; --匹配所有
select "linux is very ok" regexp "^linux" --匹配以linux为开头的
->通用的一些:
^ 在字符串的开始处进行匹配 a? 匹配1个或0个
$ 在字符串的末尾处进行匹配 a1|a2 匹配a1或a2
. 匹配任意单个字符,包括换行符号 a(m) 匹配m个a
[...] 匹配括号内的任意字符 a(m,) 匹配至少m个a
[^...]匹配不出现括号内的任意字符 a(m,n) 匹配m到n个a
a* 匹配0个或多个a(包括空串) a(,n) 匹配0到n个a
a+ 匹配1个或多个(不包括空串) (...) 将模式元素组成单一元素
匹配邮箱(根据匹配.,正则效率高):
--但是正则比like的缺点就是更消耗程序消耗资源
1使用正则表达式“$” 和 [...] 进行匹配:
select name,email from leyangjun where email REGEXP "@163[.,]com$"; --[.,]匹配. 或 ,
2使用like方式查询:
select name,email from leyangjun where email like "@163.com" or email like "%@163,com";
二:巧用rand()提取随机行(select rand()*100)
MySQL数据库中随机函数rand()是取一个0-1之间的数,利用这个函数一起order by能够把数据随机排序
select * from stu order by rand(); --随机排序
select * from stu order by rand() limit 3; --抽样调差可以玩
三:利用group by 的 with rollup 子句统计
*注意:with rollup不可以和order by同时使用
使用group by的with rollup 子句可以检索出更多的分组聚合信息
select cname,pname,count(pname) from demo group by cname,pname;
使用with rollup可以统计出更多的信息:
select name,pname,count(pname) from demo group by cname,pname with rollup; --会吧算出来的数加起来 比如:bj hd 5 sh hd 4 最后会增加个null 列 总数9
四:用bit group functions做统计(用的少),就是二进制进行运算
*只有聚合分组的时候这个2个函数才会有意义。
在使用group by 语句时可以同时使用bit_and 、bit_or函数来完成统计工作。这两个函数的
作用主要是做数值之间的逻辑运算。
2个函数把数值转成二进制
bit_or或运算->二进制的值-就是0和1(0,1=1 0,0=0 1,1=1):
select id,bit_or(kind) from order_rab group by id;
bit_and是&&运算(只有1,1=1,其他值全为0):
select id,bit_and(kind) from order_rab group by id;
五:使用外键需要注意的问题(不鼓励在MySQL中使用外键)
外键:我这个表的字段是楞一个表的主键,依赖关系
create table temp(id int,name char(20),foreign key(id) references outTable(id) on delete cascade on update casca |