一、视图
- 视图的定义
视图是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影。同一张表可以创建多个视图。创建视图的语法:
create view view_name as select 语句
- 视图的作用(示例数据库:employees)
① 简化查询
比如说要查询公司里面每个部门的员工数,并且按照人数由多到少进行排序,如果写SQL语句的话每次都要这么写:
select `dept_emp`.`dept_no` AS `dept_no`,count(1) AS `emp_sum` from `dept_emp` group by `dept_emp`.`dept_no` order by `emp_sum` desc;
如果创建成视图的话,每次只要查询视图就行了
create VIEW `v_test` AS select `dept_emp`.`dept_no` AS `dept_no`,count(1) AS `emp_sum` from `dept_emp` group by `dept_emp`.`dept_no` order by `emp_sum` desc
视图的查看方式和表的查看方式一样(建议在视图前加上"v_"前缀来区分表和视图)
② 权限控制
比如说公司A有一张用户表,公司B现在需要公司A用户表的用户信息,但是公司A不想让公司B获取用户的一些敏感信息(比如说家庭住址之类的),这时就可以公司A创建一个不含用户敏感信息的视图,然后再把这个视图的查询权限赋予公司B就可以了。
- 视图常用操作
alter view {view_name} as select xxxxx # 修改视图
drop view {view_name} # 删除视图
show create view {view_name} # 查看视图创建的语句
二、函数
- 自定义函数
自定义函数应该属于某个数据库,函数内部可以有各种编程语言的元素:变量,流程控制,函数调用;还可以有增删改等语句,但是不可以有select(或show或desc)这种返回结果集的语句!
首先修改参数set global log_bin_trust_function_creators = 1
,然后声明一个定界符:delimiter $$
例:创建一个求阶乘的函数
查看自定义函数
show function status
- 系统函数
① 数字类
select rand() # 生成0到1之间的随机数
select * from books order by rand() limit 2; # 随机取出两条记录
select floor(3.8) # 向下取整 (3)
select ceil(3.4) #向上取整 (4)
select round(3.4) #四舍五入 (3)
② 字符串类
select ucase('i am big') # 大写字母转换
select lcase('I AM SMALL') # 小写字母转换
select left('abcde',3) # 从左边截取字符串
select right('abcde',3) # 从右边截取字符串
select substring('abcdefg',2,3) # 从第二个字符开始截取三个字符
select concat('I am ','张三!') # 连接两个字符串
③ 时间类
select unix_timestamp() # 获取Unix时间戳(1513582865)
select from_unixtime(unix_timestamp()) # 格式化Unix时间戳(2017-12-18 15:41:42)
select curdate() # 返回今天的时间日期
select now() # 获取当前的时间
select year(now()) 年,month(now()) 月 ,day(now()) 日, hour(now()) 小时,minute(now()) 分钟,second(now()) 秒
select datediff(now(),'2005-8-1') # 获取时间差
select date_add(curdate(),interval -1 day) # 取出昨天的时间
扩展:取出所有1997-07加入公司的员工
use employees;
select * from current_dept_emp where date_format(from_date,'%Y%m') = "199707" order by from_date;
三、存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程
存储过程的优点
① 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而
一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度
② 当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此
复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用
③ 存储过程可以重复使用,可减少数据库开发人员的工作量
④ 安全性高,可设定只有某些用户才具有对指定存储过程的使用权
- 创建存储过程
create procedure 存储过程名(参数,参数,…)
begin
//代码
end
例:输入一个字符串,若等于h则取出价格大于100的商品,反之则取出小于100的商品
四、触发器
触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。触发器必须定义在表上,并且自动执行,不能直接调用。例:现在有一个书目表和订单表,新建一个触发器,当订单表里面有订单是,自动更新书目表里面对应书本的库存量。
- after 与 before 的区别
after是先完成数据的增删改,再触发,触发器中的语句晚于监视的增删改,无法影响前面的增删该动作。就类似于先吃饭,再付钱。
before是先完成触发,再增删改,触发的语句先于监视的增删改发生,我们有机会判断修改即将发生的操作。就类似于先付钱,再吃饭