# 创建视图
mysql> create view emp2dep as select emp.*,dep.name as dep_name from emp inner join dep on emp.dep_id=dep.id;
Query OK,0 rows affected (0.86 sec)# 查看视图
mysql> select *from emp2dep;+----+-------+--------+------+--------+----------+|id| name | sex | age | dep_id | dep_name |+----+-------+--------+------+--------+----------+|1| allen | male |18|200| 技术 ||2| lucy | female |48|201| 人力资源 ||3| lily | male |38|201| 人力资源 ||4| jack | female |28|202| 销售 ||5| tom | male |18|200| 技术 |+----+-------+--------+------+--------+----------+5 rows inset(0.29 sec)# 更新视图中的数据
mysql> update emp2dep set name='ALLEN' where id=1;
Query OK,1 row affected (0.32 sec)
mysql> select *from emp2dep;+----+-------+--------+------+--------+----------+|id| name | sex | age | dep_id | dep_name |+----+-------+--------+------+--------+----------+|1| ALLEN | male |18|200| 技术 ||2| lucy | female |48|201| 人力资源 ||3| lily | male |38|201| 人力资源 ||4| jack | female |28|202| 销售 ||5| tom | male |18|200| 技术 |+----+-------+--------+------+--------+----------+5 rows inset(0.00 sec)# 修改视图里的数据影响基表,查看emp表数据也跟着发生变化了
mysql> select *from emp;+----+-------+--------+------+--------+|id| name | sex | age | dep_id |+----+-------+--------+------+--------+|1| ALLEN | male |18|200||2| lucy | female |48|201||3| lily | male |38|201||4| jack | female |28|202||5| tom | male |18|200||6| andy | female |18|204|+----+-------+--------+------+--------+6 rows inset(0.10 sec)# 修改视图
mysql> alter view emp2dep as select *from emp where id>3;
Query OK,0 rows affected (1.31 sec)
mysql> select *from emp2dep;+----+------+--------+------+--------+|id| name | sex | age | dep_id |+----+------+--------+------+--------+|4| jack | female |28|202||5| tom | male |18|200||6| andy | female |18|204|+----+------+--------+------+--------+3 rows inset(0.32 sec)# 删除视图
mysql> drop view emp2dep;
Query OK,0 rows affected (1.42 sec)
2、触发器
2.1、定义
使用触发器可以定制用户对表进行[增、删、改]操作时前后的行为
注意: 没有查询
# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
sql语句;
END
# 插入后
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
sql语句;
END
# 删除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN
sql语句;
END
# 删除后
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
sql语句;
END
# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
sql语句;
END
# 更新后
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
sql语句;
END
2.2、使用
重点: 触发器无法由用户直接调用,而知由于对表的[增/删/改]操作被动引发的
mysql> create table users(idint primary key auto_increment,name varchar(10),gender tinyint);
Query OK,0 rows affected (2.78 sec)
mysql> create table user_more(name varchar(10));
Query OK,0 rows affected (3.00 sec)# 需求: 插入users数据前将name字段先插入user_more表中
mysql> delimiter $$ # 自定义语句结束符,避免冲突
mysql> create trigger tri_before_insert_users before insert on users for each row
begin
insert into user_more values(NEW.name);
end $$ # sql执行结束
Query OK,0 rows affected (0.61 sec)
mysql> delimiter ;# 修改mysql结束标识再改为;
mysql> insert into users values(null,'tom',1);
Query OK,1 row affected (0.57 sec)
mysql> select *from users;+----+------+--------+|id| name | gender |+----+------+--------+|1| tom |1|+----+------+--------+1 row inset(0.00 sec)
mysql> select *from user_more;+------+| name |+------+| tom |+------+1 row inset(0.00 sec)
mysql> select *from user;+----+----------+---------+|id| user | salary |+----+----------+---------+|1| zhangsan |1000.00||2| lisi |1000.00||3| wangwu |1000.00|+----+----------+---------+3 rows inset(0.11 sec)# 原子操作(买家zhangsan向卖家wangwu转账100元,其中lisi是中介得到10元,卖家wangwu得到90元)
start transaction;
update user set salary=900 where user='zhangsan';# 买支付100元
update user set salary=1010 where user='lisi';# 中介拿走10元
update user set salary=1090 where user='wangwu';# 卖家拿到90元
commit;# 真正提交到数据库内# 出现异常,回滚到初始状态
start transaction;
update user set salary=900 where user='zhangsan';# 买支付100元
update user set salary=1010 where user='lisi';# 中介拿走10元
update user set salary=1090 where user='wangwu';# 卖家拿到90元,出现异常没有拿到
rollback;# 回滚
commit;
mysql> select *from user;+----+----------+---------+|id| user | salary |+----+----------+---------+|1| zhangsan |1000.00||2| lisi |1000.00||3| wangwu |1000.00|+----+----------+---------+3 rows inset(0.00 sec)# pymysql操作try:
cursor.execute(sql_1)
cursor.execute(sql_2)
cursor.execute(sql_3)except Exception as e:
connect.rollback()# 事务回滚print('事务处理失败', e)else:
connect.commit()# 事务提交print('事务处理成功', cursor.rowcount)# 关闭连接
cursor.close()
connect.close()
总结: 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性
delimiter //
CREATE PROCEDURE proc_if ()
BEGIN
declare i int default 0;if i =1 THEN
SELECT 1;
ELSEIF i =2 THEN
SELECT 2;
ELSE
SELECT 7;
END IF;
END //
delimiter ;
5.2、循环语句
# while循环
delimiter //
CREATE PROCEDURE proc_while ()
BEGIN
DECLARE num INT ;
SET num =0;
WHILE num <10 DO
SELECT
num ;
SET num = num +1;
END WHILE ;
END //
delimiter ;# repeat循环
delimiter //
CREATE PROCEDURE proc_repeat ()
BEGIN
DECLARE i INT ;
SET i =0;
repeat
select i;set i = i +1;
until i >=5
end repeat;
END //
delimiter ;# loop
BEGIN
declare i int default 0;
loop_label: loop
set i=i+1;if i<8 then
iterate loop_label;
end if;if i>=10 then
leave loop_label;
end if;
select i;
end loop loop_label;
END