数据库对象与视图

1.数据库对象

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量

2.为什么要使用视图?

有时候我们需要针对不同的用户提供不同的查询视图.
①操作简单
②减少数据冗余
③数据安全
④适应灵活多变的需求
⑤能够分解复杂的查询逻辑

3.视图的理解?

①视图可以理解为一个虚拟表,本身不存储数据,本质上可以看做一个存储起来的select语句.
②视图中涉及到的表,叫做基表
③对视图中的数据进行操作,基表中的数据也会发生变化
④删除视图本身,不会对基表产生影响
⑤视图的应用场景: 针对小型项目,不推荐使用视图,大型项目可以考虑。
⑥视图的优点,简化查询,控制数据的访问

视图中的数据大部分情况下是可以更新的,但在以下情况下是不能更新的:

①视图中有基表没有的列

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_02

运行结果:

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_03


②select中使用了join联合查询

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_04


运行结果:

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_05


利用视图进行数据格式化

mysql 中视图部门注释 mysql中的视图用处大吗_java_06

视图结构的修改:

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_07

存储过程与函数

存储过程与视图的区别?
①视图理解为一张虚拟表 ---------存储过程理解为sql语句的批处理!
②视图没有经过预编译,存储过程经过了预编译
③视图一般用于查询,结构比较简单
存储过程可以直接操作底层数据表,结构可以很复杂

存储过程和存储函数的区别?
1.存储过程可以没有返回值存储函数必须有返回值
2.存储函数可以用在查询语句当中,存储过程不行

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_08

存储过程

存储过程的三个参数: IN OUT INOUT

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_09


无参数:

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_10

带IN

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_11


带OUT

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_12


带IN OUT

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_13

带INOUT

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_14

存储函数

创建简单的存储函数

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_15


调用简单的存储函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_16

变量、流程控制与游标

变量

变量分为系统变量用户自定义变量

1.系统变量

系统变量分为全局系统变量(需要添加global关键字)以及会话系统变量(需要添加session关键字)。
从下图看,可理解到有些系统变量既是全局系统变量又是会话系统变量

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_17

全局系统变量针对于所有会话有效,但是不能重启MySQL服务。
会话系统变量针对当前会话有效。

对于既是全局系统变量又是会话系统变量,我们可以指定他是全局系统变量或者是会话系统变量。

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_18

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_19


mysql 中视图部门注释 mysql中的视图用处大吗_mysql_20


修改系统变量

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_21

2.用户自定义变量

用户自定义变量又分为会话用户变量和局部变量
①会话用户变量作用范围:当前会话
②局部变量作用范围:begin ---- end之间,所以只能用于存储过程或存储函数

会话用户变量:

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_22


局部变量:

①使用declare定义局部变量
②只能放在begin—end当中
③且必须放在第一行
④还应该有类型

mysql 中视图部门注释 mysql中的视图用处大吗_java_23

注意带IN OUT参数存储过程的调用。(call时,OUT参数也要写上,通过select查询)

mysql 中视图部门注释 mysql中的视图用处大吗_java_24


mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_25

MySQL程序出错的处理机制

定义条件和处理程序

定义条件是事先定义程序执行过程中可能遇到的问题。
处理程序是定义再遇到了问题时应当采取的处理方式。


错误演示:(email不可为空)

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_26


在navicat和命令行下的错误提示:

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_27


mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_28


此时x的值为1(要与下面有错误处理程序的存储过程做对比)


1.定义条件

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_29


mysql 中视图部门注释 mysql中的视图用处大吗_java_30

2.定义处理程序

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_31


mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_32


案例解析:

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_33


最后执行,x的值为3

流程控制

分支结构之IF

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_34

案例解析:

案例一:

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_35


案例二:

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_36


总结:要记着最后要加END IF

分支结构之CASE

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_37


案例解析:

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_38

循环结构之LOOP

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_39

循环结构之WHILE

mysql 中视图部门注释 mysql中的视图用处大吗_java_40


mysql 中视图部门注释 mysql中的视图用处大吗_java_41

循环结构之REPEAT

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_42

对比三种循环结构:
1.三种循环结构名称都可以被省略,但是如果循环种添加了循环控制语句(LEAVE或ITERATE)则必须添加名称
2.while 先判断后执行
repate 先执行后判断
loop 以上两种情况都可以

LEAVE和ITERATE的使用

leave不仅可以用在循环结构当中,还可以用在begin----end当中,可以理解为java中的break

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_43

iterate只能用在循环结构当中,相当于java中的continue

游标(对结果集中的数据进行逐条读取)

游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。可以理解为指针。

游标的缺点:
在使用游标时,会对数据进行加锁,在业务并发量大时,不仅会影响业务之间的效率,还会消耗系统资源,造成内存的不足。

游标的使用步骤

1.声明游标
2.打开游标
3.使用游标
4.关闭游标

案例解析:

mysql 中视图部门注释 mysql中的视图用处大吗_java_44

触发器

触发器的作用:
①保证数据完整性
②帮助我们记录日志
③对操作数据前,对数据进行合法性检查

触发器的缺点:
①可读性比较差
②相关数据的变更,导致触发器出错

mysql 中视图部门注释 mysql中的视图用处大吗_java_45


mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_46

创建触发器

简单案例:

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_47

复杂案例:

mysql 中视图部门注释 mysql中的视图用处大吗_java_48


结果:

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_49

查看触发器

mysql 中视图部门注释 mysql中的视图用处大吗_java_50

小细节
对一个表建立了触发器,当表中的数据满足了触发器触发的条件时,一定会触发触发器吗?
不一定,当是由于外键约束而造成的触发条件,不会触发触发器。

MySQL8新特性

新特性之窗口函数

窗口函数的特点是可以分组,而且可以在分组内进行排序,另外,窗口函数不会因为分组而减少原表中的行数,这对我们在原表数据基础上进行分组统计、排序非常有用。

自己的理解:
MySQL 8.0之前的分组函数,会将每一组合并成一条记录;而窗口函数,会保留原来的记录数,将结果置于每一条记录当中。

序号函数

以下三种序号函数的区别:

对于排序字段的重复记录的处理不同

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_51

1.ROW_NUMBER()

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_52


mysql 中视图部门注释 mysql中的视图用处大吗_数据库_53


mysql 中视图部门注释 mysql中的视图用处大吗_java_54


mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_55


2.RANK()

mysql 中视图部门注释 mysql中的视图用处大吗_java_56


mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_57


3.DENSE_RANK

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_58


mysql 中视图部门注释 mysql中的视图用处大吗_mysql_59

分布函数

1.PERCENT_RANK()函数

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_60

2.CUME_DIST()函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_61

前后函数

1.LAG(expr,n)函数

mysql 中视图部门注释 mysql中的视图用处大吗_系统变量_62


2.LEAD(expr,n)函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_63

首尾函数

1.FIRST_VALUE(expr)函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_64


2.LAST_VALUE(expr)函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_65

其他函数

1.NTH_VALUE(expr,n)函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_66


2.NTILE(n)函数

mysql 中视图部门注释 mysql中的视图用处大吗_mysql 中视图部门注释_67

新特性之公用表表达式

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_68

公用表表达式分为普通公用表表达式普通公用表表达式

普通公用表表达式:

子查询和CTE的简单对比:

mysql 中视图部门注释 mysql中的视图用处大吗_数据库_69

递归公用表表达式:

mysql 中视图部门注释 mysql中的视图用处大吗_java_70

mysql 中视图部门注释 mysql中的视图用处大吗_mysql_71