数据库对象与视图
1.数据库对象
2.为什么要使用视图?
有时候我们需要针对不同的用户提供不同的查询视图. ①操作简单 ②减少数据冗余 ③数据安全 ④适应灵活多变的需求 ⑤能够分解复杂的查询逻辑
3.视图的理解?
①视图可以理解为一个虚拟表,本身不存储数据,本质上可以看做一个存储起来的select语句. ②视图中涉及到的表,叫做基表 ③对视图中的数据进行操作,基表中的数据也会发生变化 ④删除视图本身,不会对基表产生影响 ⑤视图的应用场景: 针对小型项目,不推荐使用视图,大型项目可以考虑。 ⑥视图的优点,简化查询,控制数据的访问
视图中的数据大部分情况下是可以更新的,但在以下情况下是不能更新的: ①视图中有基表没有的列
运行结果:
②select中使用了join联合查询 运行结果:
利用视图进行数据格式化:
视图结构的修改:
存储过程与函数
存储过程与视图的区别? ①视图理解为一张虚拟表 ---------存储过程理解为sql语句的批处理! ②视图没有经过预编译,存储过程经过了预编译 ③视图一般用于查询,结构比较简单 存储过程可以直接操作底层数据表,结构可以很复杂
存储过程和存储函数的区别? 1.存储过程可以没有返回值存储函数必须有返回值 2.存储函数可以用在查询语句当中,存储过程不行
存储过程
存储过程的三个参数: IN OUT INOUT 无参数:
带IN 带OUT 带IN OUT
带INOUT
存储函数
创建简单的存储函数
调用简单的存储函数
变量、流程控制与游标
变量
变量分为系统变量和用户自定义变量
1.系统变量
系统变量分为全局系统变量(需要添加global关键字)以及会话系统变量(需要添加session关键字)。 从下图看,可理解到有些系统变量既是全局系统变量又是会话系统变量
全局系统变量针对于所有会话有效,但是不能重启MySQL服务。 会话系统变量针对当前会话有效。
对于既是全局系统变量又是会话系统变量,我们可以指定他是全局系统变量或者是会话系统变量。
修改系统变量
2.用户自定义变量
用户自定义变量又分为会话用户变量和局部变量 ①会话用户变量作用范围:当前会话 ②局部变量作用范围:begin ---- end之间,所以只能用于存储过程或存储函数
会话用户变量: 局部变量:
①使用declare定义局部变量 ②只能放在begin—end当中 ③且必须放在第一行 ④还应该有类型
注意带IN OUT参数存储过程的调用。(call时,OUT参数也要写上,通过select查询)
MySQL程序出错的处理机制
定义条件和处理程序
定义条件是事先定义程序执行过程中可能遇到的问题。 处理程序是定义再遇到了问题时应当采取的处理方式。
错误演示:(email不可为空) 在navicat和命令行下的错误提示: 此时x的值为1(要与下面有错误处理程序的存储过程做对比)
1.定义条件
2.定义处理程序
案例解析: 最后执行,x的值为3
流程控制
分支结构之IF
案例解析: 案例一: 案例二: 总结:要记着最后要加END IF
分支结构之CASE
案例解析:
循环结构之LOOP
循环结构之WHILE
循环结构之REPEAT
对比三种循环结构: 1.三种循环结构名称都可以被省略,但是如果循环种添加了循环控制语句(LEAVE或ITERATE)则必须添加名称 2.while 先判断后执行 repate 先执行后判断 loop 以上两种情况都可以
LEAVE和ITERATE的使用
leave不仅可以用在循环结构当中,还可以用在begin----end当中,可以理解为java中的break
iterate只能用在循环结构当中,相当于java中的continue
游标(对结果集中的数据进行逐条读取)
游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。可以理解为指针。
游标的缺点: 在使用游标时,会对数据进行加锁,在业务并发量大时,不仅会影响业务之间的效率,还会消耗系统资源,造成内存的不足。
游标的使用步骤
1.声明游标 2.打开游标 3.使用游标 4.关闭游标
案例解析:
触发器
触发器的作用: ①保证数据完整性 ②帮助我们记录日志 ③对操作数据前,对数据进行合法性检查
触发器的缺点: ①可读性比较差 ②相关数据的变更,导致触发器出错
创建触发器
简单案例:
复杂案例:
结果:
查看触发器
小细节 对一个表建立了触发器,当表中的数据满足了触发器触发的条件时,一定会触发触发器吗? 不一定,当是由于外键约束而造成的触发条件,不会触发触发器。
MySQL8新特性
新特性之窗口函数
窗口函数的特点是可以分组,而且可以在分组内进行排序,另外,窗口函数不会因为分组而减少原表中的行数,这对我们在原表数据基础上进行分组统计、排序非常有用。
自己的理解: MySQL 8.0之前的分组函数,会将每一组合并成一条记录;而窗口函数,会保留原来的记录数,将结果置于每一条记录当中。
序号函数
以下三种序号函数的区别: 对于排序字段的重复记录的处理不同
1.ROW_NUMBER() 2.RANK() 3.DENSE_RANK
分布函数
1.PERCENT_RANK()函数
2.CUME_DIST()函数
前后函数
1.LAG(expr,n)函数 2.LEAD(expr,n)函数
首尾函数
1.FIRST_VALUE(expr)函数 2.LAST_VALUE(expr)函数
其他函数
1.NTH_VALUE(expr,n)函数 2.NTILE(n)函数
新特性之公用表表达式
公用表表达式分为普通公用表表达式和普通公用表表达式。
普通公用表表达式: 子查询和CTE的简单对比:
递归公用表表达式:
|