MySQL视图
视图 (view) 视图 view(保存sql逻辑) 表 table(占用)
- 虚拟表: 和普通表一样 mysql5.1版本出现的新特性,通过表动态生成的数据,只保存sql逻辑,不保存查询结果
- 应用场景:
- 多个地方用到同样的查询结果
- 该查询结果使用的sql语句较复杂
- 示例:
CREATE VIEW v1 创建一个v1的view视图表AS
select stuname ,majorName
from stu.stuinfo s
inner join major m on s.majorid = m.id;
SELECT * FROM v1 WHERE stuname LIKE '%三' 调用v1的视图表 -
# 查找job表,employees,department表中员工名包含a的
use myemployees;
create view myv1
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 myv1 where last_name like '%a%';
- 创建视图:
- create view 视图名
- as
- 查询语句;
- 特点:
- 重用sql语句
- 简化复杂的sql操作,不必知道它的查询细节
- 保护数据,提高安全性
- 视图的修改
-
- create or repacle view 视图名 方式一
- as
- 查询语句;
- alter view 视图名
- as
- 查询语句;
-
- 删除视图
- drop view 视图名,视图名;
- 查看视图
-
desc 视图名;
show create view 视图名
-
- 视图的更新:
- insert 可以在视图中使用,也可以对原始表进行更新
- update 可以子啊视图中使用,原始表也随之更改
- 具备一下特点的视图不允许更新
- 分组函数 ,distinct,group by,having,union 或者 union all
- 常量视图
- select中包含子查询
- 含有join语句的连接其他表的
- from 一个不能更新的视图
- where子句的子查询引用了from子句中的表
- delete 和 truncate 在事务中使用的区别
- truncate 在事务中进行了rollback 回滚但是我在回滚之前的truncate操作会永久性的生效,不会受rollback影响。
- delete 在事务中进行操作,rollback回滚之后回恢复delete之前的状态
变量
- 分类
- 系统变量
- 全局变量 系统变量是由系统提供的,不是用户定义的,属于服务器层面使用语法(全局加global)
- show global {session} variables; 查看所有的系统变量
- show global session variables like “%char%” 查看满足条件的部分系统变量
- 查看指定的系统变量的值 select @@global {session};
- 未某个系统变量赋值 set global 【session】 系统变量名 = 值 set@@global 【session】 。系统变量名 = 值;
- 会话变量 (仅仅针对于当前会话连接有效)
- 查看所有会话变量 show session variables;
-
show session variables;
show variables;
show variables like '%char%'; - select @@会话变量名;
- 赋值 set 会话变量名=' ';
- set session 会话变量名 = ‘ ’;
自定义变量(变量自定义,不是系统提供的) 使用步骤: 声明,赋值,使用
- 用户变量 (可以放在任何位置 begin end 里面或者外面)
- 作用域,针对于当前会话连接有效
- 生明并初始化:
- set @用户变量名 = 值;
- set @yhblm :=值;
- select @yhblm:=值;
- 赋值
- 通过set 或select
- set @用户变量名 = 值;
- set @yhblm :=值;
- select @yhblm:=值;
- select 字段 into yhblm from 表;
- 局部变量
- 仅仅在局部变量有效 在begin end里面
- 声明:
- declare 变量名 类型;
- declare 变量名default 值;
- 赋值:
- 通过set或select
- set jbblm = 值;
- set jbblm:=值;
- select jbblm:=值;
- select 字段 into jbblm from 表;
- 应用在begin end 的第一句话;
- 全局变量 系统变量是由系统提供的,不是用户定义的,属于服务器层面使用语法(全局加global)
- 存储过程和函数(类似于java中的方法)
- 提高代码重用性,简化操作 ,减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
- 存储过程
- 一组预先编译好的sql语句的集合。
- 创建语法
- create procedure 存储过程名(参数列表)
- begin
- 存储过程体(一组合法的sql语句)
- end
- 注意:
- 如果存储体只有一句话,begin end 可以省略 ,存储过程体每一条必须加分号
- 存储过程的结尾可以使用delimiter重新设置
- 语法:
- delimiter 结束标记
- 案例
- delimiter $
- 调用语法:
- call 存储过程名(实参列表)
- 参数列表包含三部分:
- 参数模式
- 参数名
- 参数类型
- 举例:
- in:该参数可以作为输入 该参数需要调用方法传入值
- out :该参数可以作为返回值
- inout:既可以作为输入,又可以输出
- 定义一个theSal2的存储过程函数,通过部门名称获取每个部门的平均薪资
delimiter $
create procedure theSal2(in deptname varchar(3),out sal double(10,2))
begin
select avg(salary) into sal
from departments d
left join employees e on d.department_id = e.department_id
where d.department_name = deptname;
end $
call theSal1('Adm',@sal)$;
select @sal$; -
theSal3 根据部门名称查询部门的平均薪资和部门的总人数
delimiter $
create procedure theSal3(in deptname varchar(3),out sal double(10,2),out number int(10))
begin
select count(*) ,avg(salary) into number,sal
from departments d
left join employees e on d.department_id = e.department_id
where d.department_name = deptname
group by d.department_id;
end $
call theSal3('Shi',@sal,@number);
select @sal;
select @number; -
delimiter $ # inout
create procedure myp9(inout a int,inout b int)
begin
set a = a*2;
set b = b+3;
end $
set @aa = 10$;
set @bb = 20$;
call myp9(@aa,@bb)$;
select @aa,@bb;
删除存储过程(存储过程无法去修改begin 到end 里面的存储过程语句)
- 语法:drop procedure 存储过程名称 一次删除一个
-
drop procedure myp9;
- 查看存储过程的信息; show create procedure 存储过程名称
-
show create procedure myp8

浙公网安备 33010602011771号