13人参与 • 2025-04-25 • Mysql
视图是一个虚拟表,其内容由查询定义。与实际的物理表类似,视图也包含一系列具有名称的列和行数据。视图的数据变化会影响基表,反之,基表的数据变化也会影响视图。
创建视图
创建视图的基本语法如下:
create view 视图名 as select 查询语句;
示例:查看学生的学号、姓名、成绩和课程号:
select s1.sno, snme, sdept, grade, cno from student s1 join score s2 on s1.sno = s2.sno;
创建视图 v_s_s
,该视图包含学生学号、姓名、成绩和课程号:
create view v_s_s as select s1.sno, snme, sdept, grade, cno from student s1 join score s2 on s1.sno = s2.sno;
修改视图中的数据:假设我们希望修改马小燕课程号 001
的成绩为 100,若视图支持更新操作,可以修改原表数据:
update v_s_s set grade = 100 where sno = '马小燕' and cno = '001';
删除视图
删除视图的语法如下:
drop view 视图名;
视图与基表之间存在紧密的关系,视图数据的修改会影响基表的数据,反之亦然。为了确保系统的稳定性,使用视图时需要特别注意以下限制:
视图和基于查询结果创建的表在以下方面有所不同:
视图:
视图是动态的,它始终基于最新的查询结果。当视图中的数据发生变化时,实际的数据表也会发生变化。视图不存储数据本身,而是存储查询逻辑。当查询视图时,实际上是执行视图定义中的查询语句。
语法示例:
create view t_name as select 查询数据;
创建表:
使用 create table
可以将查询结果保存为一个物理表。与视图不同,创建的表会将数据永久存储在数据库中,数据修改不会影响原始数据表。创建的表可以具有索引等性能优化。
语法示例:
create table t_name as select 查询数据;
在 mysql 中,视图虽然提供了极大的便利,但在某些情况下需要对其进行适当的限制,以确保数据的一致性和完整性。以下是常见的视图限制及其应用:
视图的修改限制
with check option
,该选项确保通过视图进行的更新操作符合视图中的条件,否则修改会被拒绝。例如,创建一个只允许修改 grade >= 60
的视图:
create view v_students as select sno, snme, grade from student where grade >= 60 with check option;
视图查询限制
视图能够简化复杂的查询,但也需要根据实际需求进行适当限制。为了确保不暴露敏感数据,可以设计只包含非敏感字段或经过加密/脱敏处理的视图。
权限控制与安全性
权限设置示例:
grant select on v_employee_view to 'user1';
使用视图时,应当考虑权限控制,通过为不同用户分配不同的视图访问权限,可以确保数据安全。视图可以提供一个中介层,使得用户仅能访问特定数据,而不暴露整个表的数据。
对于敏感数据,视图的设计应遵循最小权限原则,避免直接暴露敏感信息。
存储过程是一组 sql 语句的集合,它被存储在数据库中,并可根据需要执行,可以接收输入参数并返回结果。
存储过程的创建需要修改语句分隔符,以避免与 sql 语句的结束符(;
)发生冲突:
delimiter $$ -- 修改分隔符以避免与语句结束符冲突 create procedure procedure_name (parameters) begin -- sql 语句 end$$ delimiter ; -- 恢复分隔符
存储过程的参数包括:
不改变分隔符会出现报错:
调用存储过程的语法如下:
call procedure_name(parameters);
查看所有数据库的存储过程:
show procedure status;
查看当前数据库的存储过程:
show procedure status where db = 'db_name';
db
:存储过程所在的数据库
name
:存储过程的名称
type
:存储过程类型(例如procedure
)
definer
:存储过程的定义者
modified
:最后修改时间
created
:创建时间
security_type
:安全类型
comment
:存储过程的注释
查看存储过程定义的语法:
show create procedure procedure_name;
删除存储过程的语法如下:
drop procedure procedure_name;
查看当前会话的系统变量:
show session variables;
查看全局系统变量:
show global variables;
show session variables like '...'; show global variables like '...';
select @@global.tname;----查看指定全局环境变量 select @@session.tname;----查看当前会话环境变量
aspect | 全局隔离权限 | 会话隔离权限 |
作用范围 | 系统范围,决定了系统的默认行为和限制 | 仅对当前会话有效,独立于全局权限 |
初始化与导入 | 在系统初始化时从全局设置导入 | 在新会话启动时从全局导入配置 |
修改的时效性 | 修改后不会立即影响现有会话,需重新启动会话才会生效 | 当前会话的隔离级别修改不会影响其他会话 |
对系统设计的影响 | 确保系统权限的统一性,易于集中管理 | 确保每个会话可以根据需要调整权限,而不影响其他会话 |
set global transaction_isolation_level = 'read committed';
重新启动一个新的会话:
set session transaction isolation level read committed;
重新启动一个会话:
用户定义变量是会话级别的临时变量,用户可以在 sql 语句中使用它们来存储数据或进行计算。变量名以 @
开头。例如:
使用 set
语句定义变量:
set @variable_name = value;-----方法一 set @variable_name := value;----方法二
例如,定义一个名为 @age
的变量并赋值为 25:
set @age = 25;
也可以直接在查询语句中进行赋值:
select @variable_name := expression;
例如,将查询结果赋值给变量:
select @age := age from users where name = 'john';-----方法一 select age into @age from users where name = 'john';---方法二
局部变量是在存储过程、函数或触发器内部定义的变量,作用范围仅限于该存储过程、函数或触发器的执行期间。它们通常用于临时存储数据、进行计算或传递信息。
在 mysql 中,局部变量通过 declare
语句在存储过程、函数或触发器中声明。局部变量的作用范围仅限于声明它们的存储过程、函数或触发器内部,并且不能在 sql 查询的其他地方使用。
局部变量的特点:
局部变量常用于存储中间计算结果、执行逻辑运算或在存储过程/函数中临时存储查询结果。它们的使用受到以下限制:
declare
语句必须在存储过程、函数或触发器的开头部分,也就是在 begin
语句之前声明。@
开头的命名方式。@
是用于用户定义会话变量的前缀,局部变量不允许使用此命名规则。null
。因此,在使用局部变量时,开发者需要考虑 null
的处理,确保程序的逻辑正确。语法:
declare variable_name data_type [default value];
variable_name
:变量的名称。
data_type
:变量的数据类型(如 int
, varchar
, date
等)。
[default value]
:可选,设置默认值。如果不指定,则默认值为 null
。
例子:
declare @user_id int default 100; declare @user_name varchar(255) default 'john';
到此这篇关于mysql之存储过程的文章就介绍到这了,更多相关mysql存储过程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论