数据库小结

本文详细介绍了数据库中常用函数如max、min、avg,以及复杂查询技巧如union、groupby的区别。深入探讨了视图、事务、锁机制、数据库规范等内容,适合数据库初学者及进阶者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库中常用的函数:
max 最大值
min 最小值
avg 平均值
mod 求模
count 求表中满足条件的记录个数
ceil(2.4)向上取整
floor(2.4)向下取整
round(2.5)四舍五入
round(2.5, 2) 四舍五入,小数位数为2
trunc(2.5) 舍去小数,取整数,没有四舍五入
trunc(2.5, 2) 以第二个参数为小数位数,之后的舍去
字符函数:
concat 拼接字符串
|| 拼接字符串
initcap 首字母大写函数
instr 返回一个字符在另一个字符中第一次出现的位置
length 求字符的长度
lower 转小写
upper 转大写
ltrim/rtrim/trim 去左边空格/右边空格/两边空格
replace 替换
substr 截取字符,第一个参数:源字符串
第二个参数:开始下标,下标从1开始
第三个参数:长度、
distinct 去重
1、一个字段
2、两个字段甚至更多的字段,多个字段的值全部一样,才可以去重必须放在最前面;
日期函数: sysdate 系统时间,取得是Oracle服务器时间
now():MySQL中
其他函数: to_char(a,b) a:源文本 b:格式
to_date(a,b) a:源文本 b:格式
to_number() 把字符类型的数据转化为数值类型
nvl(a, b) a:原文本 b:如果a为空,则返回b
分页用:rownum
union : 求两张表的并集,但是去重之后的结果;
union all : 求两张表的并集,但是,有多少出来多少,没有去重。
不管是交集,差集,还是并集,要求:
select后面跟的字段类型,必须相同。
但是,字段名可以不一样,最后的结果集,是以第一个语句的
字段名来命名。
扩容语法结构:
type 名字 is table of 类型 [index by binary_integer];
index by binary_integer:开启自动扩容的开关;
1、如果有【index by binary_integer】,那么就不需要对集合的对象进行初始化
2、那么不需要手动去扩容
3、如果集合类型是record/%rowtype类型,在给集合赋值的时候,
into前加上 bulk collect;
视图与表的区别:
表现形式 一样,都是以表的形式表现(视图来源于表);
视图是一个sql文的结果集,其本身是一个虚拟表,并且不占用表空间。
表是实际存在的,占用表空间的。
保护机密数据
提高使用效率
事务:
用来保证一件事情/一个操作的完整性
一个操作,要么成功,要么失败,一个完成性的操作,不可分离的。
事务的四大特性ACID:
A:原子性 (要么做要么不做只有true和false)
C:一致性 (事务执行前和执行后都必须处于一致性状态)
I:隔离性 (多用户并发访问数据库时,每一个用户开启的事务,不能被其他的操作所干扰,多个并发事务之间要相互隔离)
D:持久性 (一旦事务提交成功,数据修改是永存的)
事务的隔离级别:
读未提交
脏读
读已提交(Oracle默认的隔离级别)
不可重复读:针对的是一条数据修改
可重复度
幻读:针对插入或者删除一条数据
序列化读:串行读
union和union all有什么不同:
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。
UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,
那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比UNION快很多,所以,
如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL只是简单的将两个结果合并后就返回。
这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
order by与group by的区别:
order by 排序查询、asc升序、desc降序 group by 分组查询、
having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。
使用group by 子句的查询语句需要使用聚合函数。
char和varchar的区别:
char:定长字符串不足位数补充空格,超过报错
varchar:变长字符串,不足位数按实际长度存储,超出报错
行级约束与表级约束的区别:
行级约束:跟在字段后面,对当前行进行约束
表级约束:可以对表中的多个字段进行约束
record和%rowtype的区别:
1:record和%rowtype都是一条记录
2:record相对灵活,%rowtype局限性大
匿名块儿和存储过程/方法/函数区别:
1:匿名块不保存数据库中执行完就没有
2:存储过程/方法/函数执行完之后是永久保存在数据库中的,随时需要,随时调用
存储过程:
create or replace procedure 名字(变量名 in/out类型) as/is
begin
end;
函数/方法:
create or replace function 名字(变量 in 类型)
return 类型 as/is
begin
end;
触发器:(在特定的条件下触发)
create or replace trigger triggerName
before /affer insert / delete/update
on tableName
[for each row]只有在语句中有:new:old关键字的时候才写
begin
end;
游标:
就是用数据库中取出来的一组数据,以临时表的形式存在缓存中
读取数据的形式是以指针的形式读取,通过fetch关键字来移动游标
cursor 名字 is select 语句;
数据库的三范式:
1NF:原子性,即字段不可分(列不可分)
2NF:唯一性,不可以把多种数据保存到同一张表(不存在部分依赖)
3NF:直接性,每一列都和主键直接相关,而不能间接相关(不存在传递依赖)
数据库的锁:
数据库角度:排他锁,共享锁,更新锁
程序员角度:悲观锁,乐观锁
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿到数据的时候都会上锁,具有强烈的独占和排他特性
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不上锁,
但是在更新的时候会判断一下在此期间别人有没有更新这个数据,可以使用版本号等机制
共享锁(S锁):也叫读锁,用于所有的只读数据操作,共享锁是非独占的,允许多个并发事务读取其锁定的资源
性质:
1:多个事务可封锁同一个共享页
2:任何事务都不能修改该页
3:通常是该页被读取完毕,s锁立即被释放
排他锁(x锁):也叫写锁,表示对数据进行写的操作,如果一个事务对对象叫了排他锁,其他事务就不能再给他叫任何锁
性质:
1:仅允许一个事务封锁此页
2:其他任何事务必须等到x锁被释放才能对该页进行访问
3:x锁一直到事务结束才能被释放
更新锁(u锁):在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象
性质:
1: 用来预定要对此页施加x锁,它允许其他事务读,但不允许再施加u锁或x锁
2:当被读取的页要被更新时,则升级为x锁
3:u锁一直到事务结束时才能被释放
行锁:锁的作用范围是行级别
表锁:锁的作用范围是整张表
死锁:就是你等我,我等你,这么一直等下去,没有解决方案,只能尽量避免
预防方法:
1:一次封锁法:指的是一次性把所有需要的数据全部封锁住,但是这样会扩大封锁范围降低系统的并发度
2: 顺序封锁法:指的是事先对数据对象指定一个封锁顺序,要对数据进行封锁,只能按照规定的顺序来封锁
系统判定死锁的方法:
1:超时法:如果某个事务的等待时间超过指定时限,则判断出现死锁
2:等待图法:如果事务等待图中出现了回路,则判断出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值