视图

Mysql从5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生产的,只保存了sql,不保存查询结果。

应用场景:

  • 多个地方用到同样的查询结果
  • 该查询结果使用的sql语句较复杂

示例:

CREATE VIEW my_vl
AS
SELECT studengname,majorname
from students s
INNER JOIN major m
ON s.majorid=m.majorid
WHERE s,majorid=1;

SELECT * FROM my_vl WHERE studengname like '张%'
# 总结:将某些复杂的sql语句封装成视图,然后查询视图得到结果

一、创建视图 CREATE VIEW 视图名 AS 查询语句;

二、修改视图

方式1:CREATE OR REPLACE VIEW 视图名

AS

查询语句;

方式2:ALTER VIEW 视图名

AS

查询语句;

三、删除视图

DROP VIEW 视图名,视图名..;

四、查看视图

DESC 视图名;(查看视图的结构)

SHOW CREATE VIEW 视图名;(查看视图的创建过程)

SELECT * FROM 视图名;(查看视图的结果集)

视图的可更新性和视图中查询的定义有关系,一下类型的视图是不能更新的。

  • 包含一下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
  • 常量视图()
  • Select中包含子查询
  • join
  • from一个不能更新的视图
  • where子句的子查询引用了from子句中的表

总结:一般视图时不允许做更新操作的。更新视图会更新到原始表

视图的好处:

  • 重用sql语句
  • 简化复杂的sql操作,不必知道它的查询细节
  • 保护数据,提高安全性

视图与表的对比

创建语法的关键字

是否实际占用物理空间

使用

视图

create view

只是保存了sql逻辑

增删改查,只是一般不能增删改


create table

保存了数据

增删改查

变量

系统变量:

  • 全局变量:作用域:服务器每次启动将为所有的全局变量赋初始值,针对于所有的会话(连接)有效,但不能跨重启。(如若需每次启动之后值被修改,则需要去修改配置文件)
  • 会话变量:作用域:仅仅针对于当前会话(连接)有效

自定义变量:

  • 用户变量:作用域:针对于当前会话(连接)有效,同于会话变量的作用域应用在任何地方,也就是begin end里面或begin end的外面

局部变量:作用域:仅仅在定义它的begin end中有效,应用在begin end中的第一句话!!

/*
一、系统变量
说明:变量由系统提供,不是用户定义,数据服务器层面
使用的语法:
1、查看所有的系统变量
*/
SHOW GLOBAL|[SESSION] VARIABLES;
#2、查看满足条件部分系统变量
SHOW GLOBAL|[SESSION] VARIABLES like '%char%';
#3、查看指定的某个系统变量的值
SELECT @@global|[session].系统变量名;
#4、为某个系统变量赋值
#方式一:
set global |[session] 系统变量名 = 值;
#方式二:
set @@global |[session].系统变量名 = 值;
-- 注意:
-- 如果时全局级别,则需要加global,如果是会话级别,则需要加session,如果不写,则默认session

/*
二、自定义变量
说明:变量是用户自定义的,不是由系统的
使用步骤:声明、赋值、使用(查看、比较、运算等)
*/
#①声明并初始化
set @用户变量名 = 值;或
set @用户变量名 :=值;或
select @用户变量名 :=值
#②赋值(更新用户变量的值)
方式一:通过SET或SELECT
set @用户变量名 = 值;或
set @用户变量名 :=值;或
select @用户变量名 :=值
方式二:通过select into 
select 字段 into @变量名
FROM 表;
#③使用(查看用户变量的值)
SELECT @用户变量名;

/*
局部变量
*/
#①声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;
#②赋值
方式一:通过SET或SELECT
set 局部变量名 = 值;或
set 局部变量名 :=值;或
select @局部变量名 :=值
方式二:通过select into 
select 字段 into @局部变量名
FROM 表;
#③使用
SELECT 局部变量名;

对比用户变量和局部变量

作用域

定义和使用的位置

语法

用户变量

当前会话

会话中的任何地方

必须加@符号,不用限定类型

局部变量

BEGIN END 中

只能在BEGIN END中,且为第一句话

一般不用加@符号(用select的时候需要加@),需要限定类型