mysql5.1版本出现的新特性,是一种虚拟的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存sql的逻辑,不保存查询结果

视图是对特定sql语句结果集的封装

应用场景:

  • 多个地方用到同样的查询结果
  • 该查询结果使用的sql语句较复杂
  1. 重用sql语句
  2. 简化复杂的sql操作,不必知道它的查询细节
  3. 保护数据,提高安全性(解释:封装了对原始表的部分查询,用户只能通过视图得到它所需要的原始表的一部分数据,而不需要用户知道所有的原始表,比如电信一个人的信息原始表有人的各种信息,而它向客户公司需要提供姓名和手机号,使用视图,使客户不需要知道原始表的数据,只得到它们需要的数据)

视图和表的对比

创建语法的关键字 是否实际占用物理空间 使用
视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改
create table 保存了数据 增删改查
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:查询各部门的平均工资级别

  • 1.创建视图查看每个部门的平均工资
CREATE VIEW myv2
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;
SELECT myv2.`ag`,g.grade_level
FROM myv2
JOIN job_grades 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
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`;

(2)视图的修改

create or replace view 视图名 查询语句;
CREATE OR REPLACE VIEW myv3
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
alter view 视图名 查询语句;
ALTER VIEW myv3
SELECT * FROM employees;

(3)视图的删除

语法:drop view 视图名,视图名,...;
DROP VIEW emp_v1,emp_v2,myv3;

(4)视图的查看

DESC myv3;
SHOW CREATE VIEW myv3;

(5)视图的更新

创建一个很简单的视图

CREATE OR REPLACE VIEW myv1
SELECT last_name,email
FROM employees;
INSERT INTO myv1 VALUES('张飞','zf@qq.com');

视图myv1中的数据:

原始表中最后的数据:

原始表中非插入字段补null

使用像更新表一样的语句来更新视图,会更改原始表

UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
DELETE FROM myv1 WHERE last_name = '张无忌';

修改、删除和插入同理,都会在更新视图的同时更新原始表

具备以下特点的视图不允许更新:

  • 1.包含以下关键字的sql语句:分组函数、distinct、group  by、having、union或者union all
CREATE OR REPLACE VIEW myv1
SELECT MAX(salary) m,department_id
FROM employees
GROUP BY department_id;
UPDATE myv1 SET m=9000 WHERE department_id=10;

报错,不允许更新

  • 2.常量视图
CREATE OR REPLACE VIEW myv2
SELECT 'john' NAME;
UPDATE myv2 SET NAME='lucy';
  • 3.Select中包含子查询
CREATE OR REPLACE VIEW myv3
SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
FROM departments;
UPDATE myv3 SET 最高工资=100000;
  • 4.join
CREATE OR REPLACE VIEW myv4
SELECT last_name,department_name
FROM employees e
JOIN departments d
ON e.department_id  = d.department_id;
UPDATE myv4 SET last_name  = '张飞' WHERE last_name='Whalen';
INSERT INTO myv4 VALUES('陈真','xxxx');

update可以更新,insert不可以

  • 5.from一个不能更新的视图
CREATE OR REPLACE VIEW myv5
SELECT * FROM myv3;
UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;
  • 6.where子句的子查询引用了from子句中的表
CREATE OR REPLACE VIEW myv6
SELECT last_name,email,salary
FROM employees
WHERE employee_id IN(
	SELECT  manager_id
	FROM employees
	WHERE manager_id IS NOT NULL
UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

总结:一般会给视图添加一个只读的权限,对视图只做查询;就算不添加权限,我们也很少去更新视图,因为有了上述限制,基本的常用的sql创建的视图都不能被更新

系统变量:

  • 全局变量
  • 会话变量

自定义变量:

  • 用户变量
  • 局部变量

(1)系统变量

说明:变量由系统定义,不是用户定义,属于服务器层面,当服务器启动的时候,服务器会提供这样的系统变量,并赋予默认值,供我们使用。

注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别
使用步骤:
1、查看所有系统变量
show global|【session】variables;
2、查看满足条件的部分系统变量
show global|【session】 variables like '%char%';
3、查看指定的系统变量的值
select @@global|【session】系统变量名;
4、为某个系统变量赋值
set global|【session】系统变量名=值;
set @@global|【session】系统变量名=值;

1)全局变量

作用域:服务器每次启动将为所有全局变量赋初值,针对于所有会话(连接)有效,但不能跨重启,要跨重启要修改配置文件。

  • 1.查看所有全局变量
  • SHOW GLOBAL VARIABLES;

    很多,只截取部分

  • 2.查看满足条件的部分系统变量
  • SHOW GLOBAL VARIABLES LIKE '%char%';

  • 3.查看指定的系统变量的值
  • SELECT @@global.autocommit;

  • 4.为某个系统变量赋值
  • SET @@global.autocommit=0;
    SELECT @@global.autocommit;

  • SET GLOBAL autocommit=1;
    SELECT @@global.autocommit;

2)会话变量

作用域:针对于当前会话(连接)有效

  • 1.查看所有会话变量
  • SHOW SESSION VARIABLES;
    

  • 2.查看满足条件的部分会话变量
  • SHOW SESSION VARIABLES LIKE '%char%';

  • 3.查看指定的会话变量的值
  • SELECT @@autocommit;

  • SELECT @@session.tx_isolation;

  • 4.为某个会话变量赋值
  • SET @@session.tx_isolation='read-uncommitted';
    SELECT @@session.tx_isolation;

  • SET SESSION tx_isolation='read-committed';
    SELECT @@session.tx_isolation;

(2)自定义变量

说明:变量由用户自定义,而不是系统提供的
使用步骤:
1、声明
2、赋值
3、使用(查看、比较、运算等)

1)用户变量

作用域:针对于当前会话(连接)有效,作用域同于会话变量

应用在任何地方,即begin和end里面或外面均可

赋值操作符   =或:=

  • 1.声明并初始化
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
SET @name='john';
SELECT @name;
  • 2.赋值(更新变量的值)
  • 方式一:
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值;
SET @name=1;
SELECT @name;
SELECT 字段 INTO @变量名
FROM 表;
SET @count=1;
SELECT COUNT(*) INTO @count
FROM employees;
SELECT @count;
  • 3.使用(查看变量的值)
SELECT @变量名;

案例:声明两个变量,求和并打印

SET @m=1;
SET @n=1;
SET @sum=@m+@n;
SELECT @sum;

2)局部变量

作用域:仅仅在定义它的begin end块中有效
应用在 begin end中的第一句话

DECLARE 变量名 类型;
DECLARE 变量名 类型 【DEFAULT 值】;
  • 2.赋值(更新变量的值)
  • 方式1:
SET 局部变量名=值;
SET 局部变量名:=值;
SELECT @局部变量名:=值;
SELECT 字段 INTO @变量名
FROM 表;
  • 3.使用(查看变量的值)
SELECT @变量名;

案例:声明两个变量,求和并打印

//直接这么写执行报错
DECLARE m INT DEFAULT 1;
DECLARE n INT DEFAULT 1;
DECLARE SUM INT;
SET SUM=m+n;
SELECT SUM;
//上述语句需要写在begin,end语句中

3)用户变量和局部变量的对比

作用域 定义位置 语法
用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
局部变量 定义它的BEGIN END中 BEGIN END的第一句话 一般不用加@,需要指定类型
语法说明如下。 < 视图 名>:指定 视图 的名称。该名称在数据库中必须是唯一的,不能与其他表或 视图 同名。 <SELECT语句>:指定创建 视图 的 SELECT 语句,可用于查询多个基础表或源 视图 。 对于创建 视图 中的 SELECT 语句的指定存在以下限制: 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他 视图 的相关权限。 SELECT 语句不能引用系统或用户 变量 。 SELECT 语句不能包含 FROM 子句中的子查 SET @tb='climate_baotou'; SET @ sql = CONCAT('SELECT * FROM ', @tb); PREPARE st FROM @ sql ; EXECUTE st; DEALLOCATE PREPARE st ////////////////////////////////////// ///////////////////////////////////... 存储过程是实现经过编译并存储在数据库中的一段 sql 语句的集合。封装,复用可以接受参数 也可返回数据减少网络的交互,提升效率用户 变量 是用户根据需要自己定义的 变量 ,用户 变量 不需要提前声明,在用的时候直接用@ 变量 名使用就可以。作用域未当前连接1 赋值-- 赋值 set @var_name = expr [ , @var_name = expr , . . . ];select 字段名 into @var_name from 表名;2 使用。 简单理解为 视图 是一个虚拟表,行和列的数据来自定义 视图 的查询中使用的表,并且是在使用 视图 时动态生成的,只保存了 sql 逻辑,不保存查询结果。1、宠用 sql 语句 2、简化复杂的 sql 操作,不必知道它的查询细节 3、保护数据,提高安全性(只提供客户想知道的数据) 4、查看 视图 5、删除 视图 6、更新 视图 更新 视图 中的数据 7、 视图 与表的对比 看作定义在 SQL Server上的虚拟表。 视图 正如其名字的含义一样,是另一种查看数据的入口。 常规 视图 本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表。 从数据库系统内部来看, 视图 是由一张或多张表中的数据组成的,从数据库系统外部来看, 视图 就如同一张表一样,对表能够进行的一般操作都可以应用于 视图 。 例如查询,插入,修改,删除操作等,但插入、修改、删... 我试图用SET @rank = 0创建一个 视图 ;在里面,但它给了我错误.尝试过不同的东西,但它没有用.谁能指点我正确的方向?CREATE VIEW S1_Bottom_Performer_AHT as (SET @rank=0SELECT @rank := @rank+1 AS '#',ei.SM,ei.TM,es.Month_Date,ei.emp_id,ei.DNAME,ei.STATUS,e... 创建 视图 时需要注意以下几点。 (1)运行创建 视图 的语句需要用户具有创建 视图 (create view)的权限,若加了[or replace]时,还需要用户具有删除 视图 (drop view)的权限。 这篇文章主要是认识一下 mysql 中的 变量 ,本来是不准备整理的,但是发现后面的存储过程等等在实际用的时候还挺多。 mysql 里面的 变量 你可以和java中的 变量 进行对比理解。主要分为两种:系统 变量 和自定义 变量 。自定义 变量 是重点。 一、系统 变量 系统 变量 那肯定就是 mysql 数据库为我们提供的,再细化的话又可以分为两种:全局 变量 和会话 变量 。 1、查看所有的系统 变量 只需要输入show global var... 视图 就是一条SELECT语句执行后返回的结果集。所以我们在创建 视图 的时候,主要的工作就落在创建这条 SQL 查询语句上。 视图 是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变, 视图 也会跟着改变) 视图 一般不执行增删改操作,只用来查询。 方便操作,特别是查询操作,减少复杂的 SQL 语句,增强可读性; 更加安全,数据库授权命令不...