5TCL语言

    科技2022-08-01  108

    TCL语言的学习

    Transaction Control Language事物控制语言

    1事务(TCL语言)

    **概念:**一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

    **案例:**转账

    张三丰 1000 郭襄 1000

    update 表 set 张三丰的余额=500 where name=‘张三丰’ 意外 update 表 set 郭襄的余额=1500 where name=‘郭襄’

    **特性:**ACID

    原子性(Atomicity):一个事务不可再分割,要么都执行要么都不执行一致性(Consistency):一个事务执行会使数据从一个一致状态切换到另外一个一致状态隔离性(Isolation):一个事务的执行不受其他事务的干扰持久性(Durabil):一个事务一旦提交,则会永久的改变数据库的数据

    事务的创建:

    隐式事务:事务没有明显的开启和结束的标记 比如insert、update、delete语句

    显式事务:事务具有明显的开启和结束的标记

    前提:必须先设置自动提交功能为禁用

    set autocommit=0;

    步骤1:开启事务 set autocommit=0; start transaction;可选的

    步骤2:编写事务中的sql语句(select insert update delete) 语句1; 语句2; …

    步骤3:结束事务 commit;提交事务 rollback;回滚事务

    案例:

    set autocommit=0; 开启事务的语句; update 表 set 张三丰的余额=500 where name='张三丰' update 表 set 郭襄的余额=1500 where name='郭襄' 结束事务的语句; commit;

    事务的隔离级别:

    事务的隔离级别: 脏读 不可重复读 幻读 read uncommitted:√ √ √ (读未提交) read committed: × √ √ (读已提交) repeatable read: × × √ (可重复读) serializable × × × (串行化) mysql中默认 第三个隔离级别 repeatable read oracle中默认第二个隔离级别 read committed 查看隔离级别 select @@tx_isolation 设置隔离级别 set session|global transaction isolation level 隔离级别;

    ①演示事务的使用步骤

    #开启事务 set autocommit=0; start transaction; #编写一组事务的语句 update account set balance = 500 where username='张无忌'; update account set balance = 1500 where username='赵敏'; #结束事务 commit; # 结束 rollback; # 回滚 # 查看account表 SELECT * FROM account;

    ②演示事务对于delete和truncate的处理的区别

    delete 可以回滚trancate 不可以回滚 set autocommit=0; start transaction; delete from account; # trancate from account; rollback;

    ③演示savepoint的使用

    set autocommit=0; start transaction; delete from account where id=25; savepoint a;#设置保存点 delete from account where id=28; rollback to a ;#回滚到保存点 SELECT * FROM account;

    2视图

    **含义:**虚拟表,和普通表一样使用

    mysql5.1版本出现的新特性,是通过表动态生成的数据比如:舞蹈班和普通班级的对比

    视图与表的对比:

    创建语法的关键字 是否实际占用物理空间 使用 视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改 表 create table 保存了数据 增删改查 #案例:查询姓张的学生名和专业名 # 原来的做法 select stuname, majorname from stuinfo s join major m on s.majorid=m.id where s.stuname like '张%'; # 创建视图的做法 create view myv1 as select stuname, majorname from stuinfo s join major m on s.majorid=m.id; select * from myv1 where stuname like '张%';

    ①创建视图

    语法: create view 视图名 as 查询语句;

    USE myemployees; #1.查询姓名中包含a字符的员工名、部门名和工种信息 #①创建 create view myv1 as select last_name, department_name, job_title from employees e join departments d on e.department_id=d.department_id join jobs j on j.job_id=e.job_id; #②使用 select * from myv1 where last_name like '%a%'; #2.查询各部门的平均工资级别 #①创建视图查看每个部门的平均工资 create view myv2 as select avg(salary) ag,department_id from employees group by department_id; #②使用 select myv2.ag, g.grade_level from myv2 join job_grade g on myv2.ag between g.lowest_sal and g.highest_sal; #3.查询平均工资最低的部门信息 SELECT * FROM myv2 ORDER BY ag LIMIT 1; #4.查询平均工资最低的部门名和工资 create view myv3 as select * from myv2 order by ag limit 1; # 使用 select d.*, m.ag from myv3 m join departments d on m.department_id=d.department_id;

    ②视图的修改

    方式一:(一般都是用这种,替换原有视图)

    create or replace view 视图名 as 查询语句;

    SELECT * FROM myv3 create or replace view myv3 as select avg(salary), job_id from employees group by job_id; 方式二: alter view 视图名 as 查询语句; ALTER VIEW myv3 AS SELECT * FROM employees;

    ③删除视图

    drop view 视图名,视图名,…;

    DROP VIEW emp_v1,emp_v2,myv3;

    ④查看视图

    DESC myv3; # 查看视图结构 SHOW CREATE VIEW myv3; # 查看视图创建过程

    ⑤视图的更新(视图一般不更新)

    CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary" FROM employees; CREATE OR REPLACE VIEW myv1 AS SELECT last_name,email FROM employees; SELECT * FROM myv1; SELECT * FROM employees; #1.插入 INSERT INTO myv1 VALUES('张飞','zf@qq.com'); #2.修改 UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞'; #3.删除 DELETE FROM myv1 WHERE last_name = '张无忌'; #具备以下特点的视图不允许更新 #①包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all CREATE OR REPLACE VIEW myv1 AS SELECT MAX(salary) m,department_id FROM employees GROUP BY department_id; SELECT * FROM myv1; #更新 UPDATE myv1 SET m=9000 WHERE department_id=10; #②常量视图 CREATE OR REPLACE VIEW myv2 AS SELECT 'john' NAME; SELECT * FROM myv2; #更新 UPDATE myv2 SET NAME='lucy'; #③Select中包含子查询 CREATE OR REPLACE VIEW myv3 AS SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资 FROM departments; #更新 SELECT * FROM myv3; UPDATE myv3 SET 最高工资=100000; #④join CREATE OR REPLACE VIEW myv4 AS SELECT last_name,department_name FROM employees e JOIN departments d ON e.department_id = d.department_id; #更新 SELECT * FROM myv4; UPDATE myv4 SET last_name = '张飞' WHERE last_name='Whalen'; INSERT INTO myv4 VALUES('陈真','xxxx'); #⑤from一个不能更新的视图 CREATE OR REPLACE VIEW myv5 AS SELECT * FROM myv3; #更新 SELECT * FROM myv5; UPDATE myv5 SET 最高工资=10000 WHERE department_id=60; #⑥where子句的子查询引用了from子句中的表 CREATE OR REPLACE VIEW myv6 AS SELECT last_name,email,salary FROM employees WHERE employee_id IN( SELECT manager_id FROM employees WHERE manager_id IS NOT NULL ); #更新 SELECT * FROM myv6; UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

    案例讲解

    视图

    #一、创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱 CREATE OR REPLACE VIEW emp_v1 AS SELECT last_name,salary,email FROM employees WHERE phone_number LIKE '011%'; #二、创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息 CREATE OR REPLACE VIEW emp_v2 AS SELECT MAX(salary) mx_dep,department_id FROM employees GROUP BY department_id HAVING MAX(salary)>12000; SELECT d.*,m.mx_dep FROM departments d JOIN emp_v2 m ON m.department_id = d.`department_id`; 一、创建视图 emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱 create view emp_v1 as select last_name, salary, email from empolyees where phone_number like '011%'; 二、要求将视图 emp_v1 修改为查询电话号码以‘011’开头的并且邮箱中包含 e 字符的员工姓名和邮箱、电话号码 create or replace view emp_v1 as select last_name, email, phone_number from employees where phone_number like '011%' and email like '%e%'; 三、向 emp_v1 插入一条记录,是否可以? insert into emp_v1 values('JIWWW', 'EJSKA', '11101229'); 可以! 四、修改刚才记录中的电话号码为‘0119’ update emp_v1 set phone_number='0119' where last_name = 'JIWWW'; 五、删除刚才记录 delete from emp_v1 where last_name = 'JIWWW'; 六、创建视图 emp_v2,要求查询部门的最高工资高于 12000 的部门信息 create or replace view emp_v2 as select d.* from departments d join employees e on d.department_id = e.department_id group by d.department_id having max(salary)>12000; 七、向 emp_v2 中插入一条记录,是否可以? 不可以!以为含有 group by 的视图不可以修改 八、删除刚才的 emp_v2 和 emp_v1 drop view emp_v1, emp_v2;

    事务

    1.创建一个表,里面有 id 为主键,stuname 唯一键,seat 座位号,要求将 id 设置成自增 create table test(id int primary key auto_increase, stuname varchar(20) unique, seat int); 2.要求用事务的方式插入 3 行数据 set autocommit=0; start transaction; INSERT INTO test VALUES(1, 'Tom', 1001); INSERT INTO test VALUES(2, 'Jack', 1002); INSERT INTO test VALU ES(3, 'Lily', 1003); commit; 3.要求用事务的方式删除数据,并回滚 set autocommit = 0; start transaction; delete from test; rollback; 或者设置保存点 set autocommit = 0; start transaction; savepoint a; delete from test; rollback to a;
    Processed: 0.010, SQL: 8