事务
1.4个特性
原子性,即要么泡妞成功,要么泡妞不成功,绝对不能出现暧昧不清的情况
一致性,即如果对方对你好,你就不能耍脾气,也要对对方好,状态要保持一致
隔离性,谈恋爱期间钱归钱,爱归爱,两者不能混淆,爱不应收到穷富的干扰
持久性,恋爱成功后,婚姻应该是一辈子的,是永久性的,海枯石烂至死不渝
2.设置手动提交
set autocommit=false;
3.回滚数据
rollback;
4.提交数据
commit;
5.回滚点
savepoint aaa;
rollback to aaa;
6.ddl语句会自动提交
create ,drop ,alter
多表连接
1.交叉连接
select * from emp cross join dept;
2.内连接
select * from emp inner join dept on emp.deptid=dept.deptid;
select empname, deptlocation from emp inner join dept on emp.deptid=dept.deptid where empname='aaa';
3.自然连接
select * from emp natural join dept;
4.左外连接
select * from emp left join dept on emp.deptid=dept.deptid;
5.右外连接
select * from emp right join dept on emp.deptid=dept.deptid;
6.全外连接
select * from emp full join dept; 同交叉连接
7.自连接 在同一座城市的不同部门
select * from dept d1,dept d2 where d1.deptlocation=d2.deptlocation and d1.deptid<>d2.deptid;
子查询
1.查找aaa所在部门名称
select empname,deptname from emp inner join dept on emp.deptid=dept.deptid where empname='aaa';
select deptname from dept where deptid=(select deptid from emp where empname='aaa');
2.查找拥有工资5000元以上员工的部门名称及所在地
select deptname,deptlocation from dept where deptid in(select deptid from emp group by deptid having max(salary)>5000);
3.查找3号部门工资最高的人的名字
1.查3号部门的最高工资
2.查拥有这个工资的人
select empname from emp where salary=(select max(salary) from emp where deptid=1) and deptid=1;
4.查找每个部门工资最高的人的名字
xiaoqiang2 832.51 423.12
select empname from emp e1 where salary =(select max(salary) from emp e2 where e1.deptid=e2.deptid);
嵌套 相关
表:
员工表:emp
empid empname deptid salary
部门表:dept
deptid deptname deptlocation
触发器
触发器:trigger 监视某种情况并出发某个动作
表名字store 列名字 goodsId goodsNum goodsName
表名字sale 列名字 orderid salegoodsid saleNum
当订单表增加一项时,仓储表发生对应变化:
---总是鼠标会减掉2个
delimiter $
create trigger tg after insert on sale for each row
begin
update store set goodsNum=goodsNum-2000 where goodsId=1;
end$
删除触发器: drop trigger tg;
一个insert或者其他的操作指令只能有一个触发器,所以要删掉
订单下多少,就减掉多少
delimiter $
create trigger tg2 after insert on sale for each row
begin
update store set goodsNum=goodsNum-new.saleNum where goodsId=new.salegoodsid;
end$
删除订单数据,仓储数据也恢复
delimiter $
create trigger tg3 after delete on sale for each row
begin
update store set goodsNum=goodsNum+old.saleNum where goodsId=old.salegoodsid;
end$
修改订单数据,仓储数据也修改
delimiter $
create trigger tg4 after update on sale for each row
begin
update store set goodsNum=goodsNum+(old.saleNum-new.saleNum) where goodsId=old.salegoodsid;
end$
before after区别演示:
delimiter $
create trigger tg5 before insert on sale for each row
begin
declare max integer;
select goodsNum into max from store where goodsid=new.salegoodsid;
if new.saleNum>max then
set new.saleNum=max;
end if;
update store set goodsNum=goodsNum-new.saleNum where goodsid=new.salegoodsid;
end$
视图索引
1.创建
create view myv1 as select empname from emp e1 where salary =(select max(salary) from emp e2 where e2.deptid=e1.deptid);
2.查看
show tables;
3.删除
drop view myv1;
4.修改
alter view myv1 as select empname,salary,sex from emp;
5.视图和原表的关系
原表中数据发生变化,则视图数据变化,反之亦然
注意向视图中插入数据的操作并不总是能执行
6.查看索引
show index from emp;
7.添加索引:如果有某一列经常作为查询的依据,那么我们可以给该列加上一个索引
create index in1 on emp (salary);
主键列默认会有索引 唯一约束列默认会有索引
8.删除索引
alter table emp drop index empname;
drop index in1 on emp;
存储过程
begin
if choice='y' then
select * from emp where empsalary>num;
else
select * from emp where empsalary<num;
end if;
end;
传入一个int值,求该值到1的和
5
create procedure p5(num int)
begin
declare temp int;
declare total int;
set temp=1;
set total=0;
while temp<=num do
set total=total+temp;
set temp=temp+1;
end while;
select total from dual;
end;
//函数 有返回值 存储过程 没有返回值
第一一个函数 调用方式 select p6(参数);
set global log_bin_trust_function_creators=TRUE;
create function p6(num int) returns int
begin
declare temp int;
declare total int;
set temp=1;
set total=0;
while temp<=num do
set total=total+temp;
set temp=temp+1;
end while;
return total;
end;