事务
/*
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
事务的ACID属性:
原子性:不可分割,要么全部都发生,要么都不发生
一致性:使数据库从一个一致性状态变换到另一个一致性状态
隔离性:一个事务的执行不被其他事务所干扰
持久性:事务一旦提交,改变就是永久的
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、delete语句
显式事务:事务具有明显的开启和结束的标记
前提:先设置自动提交功能为禁用 set autocommit = 0;
*/
#演示事务的使用步骤
#开启事务
SET autocommit=0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance =500 WHERE username = '张无忌';
UPDATE account SET balance =1500 WHERE username = '赵敏';
#结束事务
COMMIT;
#查看当前隔离级别
SELECT @@tx_isolation;
#设置当前MySQL连接的隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
#演示savepoint的使用
set autocommit=0;
delete from account where id=25;
savepoint a;
delete from account where id=28;
rollback to a;
视图
/*
含义:虚拟表,和普通表一样使用,是通过表动态生成的数据
应用场景:
多个地方用到同样的查询结果
该查询结果使用的sql语句较复杂
好处:
重用sql语句
简化复杂的sql操作,不必指导它的查询细节
保护数据,提高安全性
创建语法的关键字 是否实际占用物理空间 使用
视图 create view 否 增删改查,一般不能增删改
表 create table 是 增删改查
*/
创建视图
#一、创建视图
#案例1:查询姓名中包含a字符的员工名、部门名和工种信息
CREATE VIEW v1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d
ON d.department_id=e.department_id
JOIN jobs j
ON j.job_id=e.job_id;
SELECT * FROM v1 WHERE last_name LIKE '%a%';
#案例2:查询各部门的平均工资级别
CREATE VIEW v2
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;
SELECT v2.`avg(salary)`,g.grade_level
FROM v2
JOIN job_grades g
ON v2.`avg(salary)` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
#案例3:查询平均工资最低的部门信息
SELECT * FROM v2
ORDER BY ag LIMIT 1;
#案例4:查询平均工资最低的部门名和工资
CREATE VIEW v3
AS
SELECT * FROM v2
ORDER BY ag LIMIT 1;
SELECT d.*,v3.ag
FROM v3
JOIN departments d
ON d.`department_id`=v3.department_id;
视图的修改
#二、视图的修改
#方式一
/*
create or replace 视图名
as
查询语句;
*/
#方式二
/*
alter view 视图名
as
查询语句;
*/
视图的删除
#三、删除视图
/*
drop view 视图名,视图名······
*/
DROP VIEW v1,v2,v3;
视图的更新
#四、查看视图
DESC v1;
#五、视图的更新
#1.插入
INSERT INTO v1 VALUES('张飞','as@qq.com',10000);
#2.修改
UPDATE v1 SET last_name='张无忌' WHERE last_name ='张飞';
#3.删除
DELETE FROM v1 WHERE last_name='张无忌';
#具备以下特点的视图不允许更新
/*
分组函数、distinct group by、having 、union或union all
select中包含子查询、join、from 一个不能更新的视图、where子句的子查询引用了from中的表
*/
变量
/*
系统变量:
全局变量
会话变量
自定义变量:
用户变量
局部变量
系统变量
#一、系统变量
变量由系统提供,不是用户定义,属于服务器层面
使用的语法:
#1、查看所有的系统变量
SHOW GLOBAL VARIABLES;
#2.查看满足条件的部分变量
SHOW GLOBAL VARIABLES LIKE'%char%';
#3.查看指定的某个系统变量的值
SELECT @@global.系统变量名;
#4.为某个系统变量赋值
SET GLOBAL 系统变量名=值;
SET global.系统变量名=值;
#查看所有会话变量
SHOW SESSION VARIABLES;
自定义变量
#二、自定义变量
/*
作用域 定义和使用的位置 语法
用户变量 当前对话 会话中的任何地方 必须加@符号
局部变量 begin end中 只能在begin end中, 一般不用加@符号
且为第一句话
*/
#1.用户变量
针对于当前会话(连接)有效,同于会话变量的作用域
#声明并初始化
SET @用户变量名=值;
SET @用户变量名:=值;
SELECT @用户变量名:=值;
#赋值
SET @用户变量名=值;
SELECT 字段 INTO 变量名
FROM 表;
#查看用户变量的值
SELECT @用户变量名;
#2.局部变量
仅仅在定义它的begin END 中有效
#声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;
#赋值
SET 变量名=值;
SELECT @变量名=值;
SELECT 字段 INTO 变量名
FROM 表;
#使用
SELECT 局部变量名;