SQL进阶
文章目录
- SQL进阶
- 关键字复习
- ALL
- ANY
- EXISTS
- 内置函数
- ROUND(四舍五入)
- TRUNCATE(截断函数)
- SEILING(向上取整)
- FLOOR(向下取整)
- ABS(获取绝对值)
- RAND(获取随机数)
- LENGTH(获取字符串长度)
- UPPER(转大写)
- LOWER(转小写)
- LEFT(从左向右截取字符串)
- RIGHT(从右向左截取字符串)
- SUBSTRING(截取字符串)
- LOCATE(查找某个值在字符串中的位置)
- REPLACE(替换内容)
- CONCAT(连接字符串)
- SQL语句
- 相关子查询
- 视图
- 创建视图
- WITH CHACK OPTION
- 存储过程
- 概念
- 触发器
- 概念
- 作用
- 注意事项
- 优缺点
- 事务
- 四大特性
- 事务的分类
- 事务并发时出现的问题
关键字复习
ALL
代表满足子查询地全部,通常用在比较查询结果与子查询结果关系时使用,例如:大于全部子查询结果
例子如下:
ANY
代表满足子查询中的其中一个,与IN有异曲同工之妙,通常用在比较查询结果与子查询结果关系时使用,例如:等于任意一个子查询结果
例子如下:
EXISTS
与IN效果一样,子查询中是否存在该数据,但是性能方面会有很大的提升。使用IN是将子查询得到的结果返回给外查询一个结果集,当数据很多时,会严重影响性能;而EXISTS,只是找到了满足要求的子查询里面的一条记录,有则返回TRUE。
例子如下:
内置函数
ROUND(四舍五入)
四舍五入,ROUND(x,y),其中x为数值,y为精确到几位小数。
TRUNCATE(截断函数)
截取数字,TRUNCATE(x,y),其中x为数值,y为截取多少位小数
SEILING(向上取整)
得到数值中,满足大于或等于这个数的最小整数。
FLOOR(向下取整)
得到数据中,满足小于或等于这个数的最大整数
ABS(获取绝对值)
得到这条数据的绝对值
RAND(获取随机数)
得到0~1之间任意一个随机数
LENGTH(获取字符串长度)
获取字符串长度
UPPER(转大写)
将字符串转换为大写
LOWER(转小写)
将字符串转换成小写
LEFT(从左向右截取字符串)
从左开始向右截取字符串,LEFT(x,y),其中x为原字符串,y为从左向右截取到多少位
RIGHT(从右向左截取字符串)
从右开始向左截取字符串,RIGHT(x,y),其中x为原字符串,y为从右向左截取到多少位
SUBSTRING(截取字符串)
截取任意位置的字符串,SUBSTRING(x,y,z),其中x为原字符串,y为左起点,z为截取多长,截取中间这部分字符串
LOCATE(查找某个值在字符串中的位置)
查询某个值在字符串中的位置,并且输入该字符串下表(以1开始),LOCATE(x,y),其中x为待查找字符 / 字符串,y为字符串
REPLACE(替换内容)
将字符串内的数据替换成另外的字符,REPLACE(x,y,z),其中x为原字符串,y为需要被修改的字符串所在的位置,z为替换字符串
CONCAT(连接字符串)
连接输入的字符串,CONCAT(x,y),结果为xy
SQL语句
相关子查询
子查询与外查询相联系,例如:查询公司中的不同部门员工达到平均工资以上的员工有哪些,每次查询要区分部门,所以外查询部门id要与内查询部门id一致。
例子如下
视图
1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。
创建视图
WITH CHACK OPTION
确保对视图内的数据进行修改后的,修改结果与视图展示的是一样的
WITH CHECK OPTION的作用?
1.对于update,有with check option,要保证update后,数据要被视图查询出来;
2.对于delete,有无with check option都一样;
4.对于insert,有with check option,要保证insert后,数据要被视图查询出来;
5.对于没有where 子句的视图,使用with check option是多余的。
存储过程
概念
就是数据库SQL语言层面的代码封装与重用
把编写在数据库中的SQL语句集称为存储过程。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。
优点
- 存储过程是通过处理封装在容易使用的单元中,简化了复杂的操作。
- 简化对变动的管理。如果表名、列名、或业务逻辑有了变化。只需要更改存储过程的代码。使用它的人不用更改自己的代码。
- 通常存储过程都是有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。
但是,MySQL实现的存储过程略有所不同。
MySQL存储过程是按需编译。在编译存储过程之后,MySQL将其放入缓存中。
MySQL为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询。- 存储过程有助于减少应用程序和数据库服务器之间的流量。
因为应运程序不必发送多个冗长的SQL语句,只用发送存储过程中的名称和参数即可。- 存储过程度任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有的应用程序,以方便开发人员不必开发存储过程中已支持的功能。
- 存储的程序是安全的。数据库管理员是可以向访问数据库中存储过程的应用程序授予适当的权限,而不是向基础数据库表提供任何权限。
缺点
- 如果使用大量的存储过程,那么使用这些存储过程的每个连接的内存使用量将大大增加。
此外,如果在存储过程中过度使用大量的逻辑操作,那么CPU的使用率也在增加,因为MySQL数据库最初的设计就侧重于高效的查询,而不是逻辑运算。- 存储过程的构造使得开发具有了复杂的业务逻辑的存储过程变得困难。
- 很难调试存储过程。只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL不提供调试存储过程的功能。
- 开发和维护存储过程都不容易。
开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专业技能。这可能导致应用程序开发和维护阶段的问题。- 对数据库依赖程度较高,移值性差。
触发器
概念
触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过触发事件进行的,即不是主动调用而执行的。
作用
- 可以在写入数据前,强制检查或者转换数据(保证数据安全)
- 触发器发生错误时,前面用户已经执行成功的操作会被撤销,类似事件回滚
注意事项
- 在 MySQL 5 中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一,即同一数据库中的两个表可能具有相同名字的触发器
- 每个表的每个事件每次只允许一个触发器,因此,每个表最多支持 6 个触发器,before/after insert、before/after delete、before/after update
优缺点
优点
- 触发器可以通过数据库中的关联表实现级联更改,即一张表数据的改变会影响其他表的数据
- 可以保证数据安全,并进行安全校验
缺点
- 过分依赖触发器,影响数据库的结构,增加数据库的维护成本
事务
四大特性
- 原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况
- 一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。
事务的分类
- 隐式事务:该事务没有明显的开启和结束标记,它们都具有自动提交事务的功能;不妨思考一下,update语句修改数据时,是不是对表中数据进行改变了,它的本质其实就相当于一个事务。
- 显示事务:该事务具有明显的开启和结束标记;也是本文重点要讲的东西。使用显式事务的前提是你得先把自动提交事务的功能给禁用。禁用自动提交功能就是设置autocommit变量值为0(0:禁用 1:开启)
事务并发时出现的问题
- 脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的
- 不可重复读 :对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1在读取同一个字段,值就不同了
- 幻读:对于两个事务T1,T2,T1在A表中读取了一个字段,然后T2又在A表中插入了一些新的数据时,T1再读取该表时,就会发现神不知鬼不觉的多出几行了…