mysql 第9天
视图
1 创建或修改视图
2 以下类型不可更新
包含以下关键字的 SQL 语句:聚合函数(SUM、 MIN、 MAX、 COUNT 等)、 DISTINCT、 GROUP
BY、HAVING、UNION 或者 UNION ALL。
常量视图。
SELECT 中包含子查询。
JION。
FROM 一个不能更新的视图。
WHERE 字句的子查询引用了 FROM 字句中的表。
3 WITH [CASCADED | LOCAL] CHECK OPTION 决定了是否允许更新数据使记录不再满足视图的条
件。这个选项与 Oracle 数据库中的选项是类似的,其中:
LOCAL 是只要满足本视图的条件就可以更新;
CASCADED 则是必须满足所有针对该视图的所有视图的条件才可以更新。
如果没有明确是 LOCAL 还是 CASCADED,则默认是 CASCADED。
4 删除视图, 当有该视图的权限
DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT | CASCADE]
5 查看视图
show tables; 会一同显示视图
SHOW TABLE STATUS
下面演示的是查看 staff_list 视图信息的操作
mysql> show table status like 'staff_list' \G
6 查询某个视图的定义,可以使用 SHOW CREATE VIEW 命令进行查看:
mysql> show create view staff_list \G
或者 mysql> select * from views where table_name = 'staff_list' \G
存储过程和函数
存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合
存储过程和函数的区别在于函数必须有返回值,而存储过程没有
存储过程的参数可以使用IN、OUT、INOUT 类型,而函数的参数只能是 IN 类型的
存储过程和函数的相关操作
1 创建,修改存储过程或者函数
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[ characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
routine_body:
Valid SQL procedure statement or statements
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
调用过程的语法为 CALL sp_name([parameter[,...]])
2
3 对存储过程或者函数进行修改,需要执行ALTER语句
4下面对 characteristic 特征值的部分进行简单的说明。
LANGUAGE SQL:说明下面过程的 BODY 是使用 SQL 语言编写,这条是系统默认的,
为今后 MySQL 会支持的除 SQL 外的其他语言支持的存储过程而准备。
[NOT] DETERMINISTIC: DETERMINISTIC 确定的,即每次输入一样输出也一样的程序,
NOT DETERMINISTIC 非确定的,默认是非确定的。当前,这个特征值还没有被优化
程序使用。
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:这些特征值提供
子程序使用数据的内在信息,这些特征值目前只是提供给服务器,并没有根据这些
特征值来约束过程实际使用数据的情况。CONTAINS SQL 表示子程序不包含读或写
数据的语句。NO SQL 表示子程序不包含 SQL 语句。READS SQL DATA 表示子程序包
含读数据的语句,但不包含写数据的语句。MODIFIES SQL DATA 表示子程序包含写
数据的语句。如果这些特征没有明确给定,默认使用的值是 CONTAINS SQL。
SQL SECURITY { DEFINER | INVOKER }:可以用来指定子程序该用创建子程序者的许
可来执行,还是使用调用者的许可来执行。默认值是 DEFINER。
COMMENT 'string':存储过程或者函数的注释信息。
5 IN 使用IN类型来传递信息,存储过程内部可以对参数的值进行修改,但是修改后的值调用者不可见。不返回
OUT 值在存储过程内修改后返回调用者。
INOUT类型可以向存储过程传递信息,如果值改变,再返回给调用者
6 删除操作 需要有该过程或者函数的ALTER ROUTINE 权限
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
7 查看存储过程或者操作
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']
8 查看定义 SHOW CREATE {PROCEDURE | FUNCTION} sp_name
mysql> show create procedure film_in_stock \G
通过查看 information_schema. Routines 了解存储过程和函数的信息